MySQL使用-----常用语句总结
文章目录
背景说明:
real_user 是表名
1.添加数据
INSERT INTO real_user ( id, user_code, real_name, idno, mobile, account_id, platform, create_time, update_time )
VALUES
( 958, "7e03eb3791c94alien", "alien_hu", "411222197708257097", "17521523666", "55340961030478525", "HLW", CURRENT_TIMESTAMP, CURRENT_TIMESTAMP ),
( 959, "7e03eb3791c9lien", "alien", "4112221977257097", "17521523699", "55340961030478555", "HLW", CURRENT_TIMESTAMP, CURRENT_TIMESTAMP );
2.删除数据
DELETE FROM real_user WHERE id<=20;
DELETE FROM 后面的table 不能使用代称,如下方式都是错误的:
- DELETE FROM real_user as r WHERE r.id<=20;
- DELETE FROM real_user r WHERE r.id<=20;
3.修改数据
UPDATE real_user set real_name = "alien" WHERE id=807;
4.查询数据
(1)三表关联查询
SELECT * FROM product p ,borrow b,borrow_detail bd WHERE p.product_no="64b6b3de1f5245d797f47dc342707875" and p.product_no=b.product_no and b.borrow_no=bd.borrow_no;
(2) 2表查询—子查询
SELECT * FROM borrow b WHERE b.product_no = (
SELECT product_no FROM product p WHERE p.id=193
);
## 2个表关联的时候,如果内层的表只有一个结果,可以使用=,如果内层表查询的结果又多个结果,可以使用in关联2个表的结果
(3)分组查询
表—food具体内容如下
1️⃣查询每组有多少条数据
SELECT type,count(*) FROM food GROUP BY type;
结果:
type | count(*) |
---|---|
fruit | 5 |
snacks | 3 |
vegetables | 4 |
2️⃣查询每组中价格中最小值、最大值、平均值、每组的总和、每组个数的信息
SELECT type,min(price),max(price),avg(price),sum(price),count(*) FROM food GROUP BY type;
结果:
type | min(price) | max(price) | avg(price) | sum(price) | count(*) |
---|---|---|---|---|---|
fruit | 3.2 | 10.88 | 6.656 | 33.28 | 5 |
snacks | 5.5 | 10.2 | 8.2 | 24.6 | 3 |
vegetables | 0.8 | 9.3 | 3.5 | 14 | 4 |
使用group by注意的地方:
- select 后面如果需要添加变量,只能是group by 后面的变量
- select后面,如果需要添加统计值,如min(),max(),avg()等也可以
- select 后不能加 * 、group by后面没有的变量不能添加
3️⃣通过group by 筛选的最终结果,再进行筛选(having)
SELECT type,min(price),max(price),avg(price),sum(price),count(*) FROM food GROUP BY type HAVING max(price)>10;
结果:
type | min(price) | max(price) | avg(price) | sum(price) | count(*) |
---|---|---|---|---|---|
fruit | 3.2 | 10.88 | 6.656 | 33.28 | 5 |
snacks | 5.5 | 10.2 | 8.2 | 24.6 | 3 |
- having 条件表达式:用来分组查询后指定一些条件来输出查询结果
- having作用和where一样,但having只能用于group by
- having后面的条件,只能是select 后面出现的变量
4️⃣查询重复的数据—多个字段都重复
原始表格:查询除了num字段之外,其他几个字段都有重复情况的数据
id | num | name | course_num | course_name | score |
---|---|---|---|---|---|
1 | 2005001 | 张三 | 001 | 数学 | 69 |
2 | 2005002 | 李四 | 001 | 数学 | 89 |
3 | 2005001 | 张三 | 001 | 数学 | 69 |
4 | 2005003 | 王五 | 001 | 数学 | 80 |
5 | 2005003 | 王五 | 001 | 数学 | 80 |
6 | 2005003 | 王五 | 001 | 数学 | 80 |
step1.查询重复数据个数大于1的数据,且去重
SELECT num,name,course_num,course_name FROM course GROUP BY num,name,course_num,course_name HAVING count(*)>1;
# group by 后面如果跟多个变量,那么这几个变量就相当于属于一组,有任何一个变量变动,都不属于这一组了。
num | name | course_num | course_name |
---|---|---|---|
2005001 | 张三 | 001 | 数学 |
2005003 | 王五 | 001 | 数学 |
step2.查询包含如上4个字段的重复数据的最完整信息
SELECT * from course c WHERE (c.num,c.name,c.course_num,c.course_name) in (
SELECT num,name,course_num,course_name FROM course GROUP BY num,name,course_num,course_name HAVING count(*)>1
);
id | num | name | course_num | course_name | score |
---|---|---|---|---|---|
1 | 2005001 | 张三 | 001 | 数学 | 69 |
3 | 2005001 | 张三 | 001 | 数学 | 69 |
4 | 2005003 | 王五 | 001 | 数学 | 80 |
5 | 2005003 | 王五 | 001 | 数学 | 80 |
6 | 2005003 | 王五 | 001 | 数学 | 80 |
5️⃣删除4个字段都相同的所有冗余数据
DELETE
FROM
course
WHERE
(num, name, course_num, course_name) in (
select a.num,a.name,a.course_num,a.course_name from (
SELECT num, name, course_num, course_name FROM course GROUP BY num, name, course_num, course_name HAVING count( * ) > 2) as a
);
# select 的语句不能直接删除,需要使用中间表过渡,才能修改或者删除
最终结果:
id | num | name | course_num | course_name | score |
---|---|---|---|---|---|
1 | 2005001 | 张三 | 001 | 数学 | 69 |
2 | 2005002 | 李四 | 001 | 数学 | 89 |
3 | 2005001 | 张三 | 001 | 数学 | 69 |
注意点:
mysql中,不能先select一个表的记录,在按此条件进行更新和删除同一个表的记录。解决办法是,将select得到的结果,再通过中间表select一遍,这样就规避了错误,这个问题只出现于mysql,mssql和oracle不会出现此问题。
https://blog.****.net/songtaiwu/article/details/79445787
其他相关参考文章:(有关Delete部分的内容好像是错误的)
https://www.cnblogs.com/jiangxiaobo/p/6589541.html