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具体内容如下
MySQL使用-----常用语句总结

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.csdn.net/songtaiwu/article/details/79445787

其他相关参考文章:(有关Delete部分的内容好像是错误的)
https://www.cnblogs.com/jiangxiaobo/p/6589541.html