Mysql查询语句
sql语句 | 解释 |
---|---|
SELECT ? FROM 表 group by 字段 | 分组查询 以字段进行分组 ?必须是分组后的单条数据 |
SELECT ? FROM 表 group by 字段 HAVING 条件 | 对分完组后的数据进行过滤 |
如果selecti语句同时包含有group by ,having , limit order by
那么他们执行顺序是group by , having , order by,limit
sql语句 | 解释 |
---|---|
SELECT … LIMIT start,rows | 分页查询 表示从start + 1行开始取 取出rows行,start从0开始计算 |
SELECT ? FROM 表1,表2… | 多表查询 |
SELECT ? FROM A表 A表别名1,A表 A表别名2 … | 自连接 |
SELECT 字段 FROM 表1 WHERE 字段1 = (SELECT 字段1 FROM 表2…)… | 单行子查询 注:(SELECT 字段2 FROM 表2) 返回结果只有1个 (字段1 等于返回结果为true) |
SELECT 字段 FROM 表1 WHERE 字段1 IN (SELECT 字段1 FROM 表2…)… | 多行子查询 注:(SELECT 字段2 FROM 表2) 返回结果有多个 (字段1 等于返回结果中其中一个为true) |
SELECT ? FROM 表1 WHERE 字段 > ALL(SELECT 字段 FROM 表2…) | 返回结果中最大值 |
SELECT ? FROM 表1 WHERE 字段 > ANY(SELECT 字段 FROM 表2…) | 返回结果中最小值 |
SELECT ? FROM 表1,(SELECT ? FROM 表2 …) 表别名… | 子查询临时表 临时表一定要有别名 |
SELECT ? FROM 表1 WHERE (字段1,字段2,字段3…) = (SELECT 字段1,字段2,字段3… FROM 表2 …) | 多列子查询 查询返回多个列数据的子查询语句 返回结果只有一个 字段1,字段2,字段3全部符合为true |
合并查询
sql语句 | 解释 |
---|---|
SELECT ? FROM 表 UNION ALL SELECT ? FROM 表 | 合并查询(将两个查询结果合并) UNION ALL不会去重 UNION去重 |
外连接
sql语句 | 解释 |
---|---|
SELECT ? FROM 表1 LEFT JOJN 表2 ON 条件(比如字段 = 字段) | 左连接(左侧表完全显示) |
SELECT ? FROM 表1 RIGHT JOJN 表2 ON 条件(比如字段 = 字段) | 右连接(右侧表完全显示) |
自增长
sql语句 | 解释 |
---|---|
字段名 整型 PRIMARY KEY AUTO_INCREMENT | (创建表)创建自增长字段 |
INSERT INTO 表名 (字段1,字段2…) VALUES(null,‘值’) | 添加自增长字段数据(自增长字段添加时直接写null) |
INSERT INTO 表名 (字段2…) VALUES(‘值’) | 添加自增长字段数据(自增长字段不指定添加) |
INSERT INTO 表名 VALUES(null,‘值’) | 添加自增长字段数据(自增长字段添加时直接写null) |
ALTER TABLE 表名 AUTO_INCREMENT = 开始值 | 修改默认的自增长开始值 |
分组统计
单字段分组
group by 语句中的显示字段必须是在分完组后,可以显示的单条数据
select id from test group by `name`;
运行上面语句,表就会被分组成这样,但mysql是关系型数据库,是不能一个单元格重新多条数据的
而使用聚合函数就可以解决这个问题,聚合函数可以对每组中的数据进行计算,从而得到唯一的数据
select count(id) from test group by `name`;
多字段分组
select count(id),`name`,num from test group by `name`,num;
可以看到是将name 和 num当成一个整体,只有name 和 num 都相等才会分为同一组,并且聚合函数是在分组完进行操作(count统计每组的id数量)
where和having的区别
where:
where是一个约束声明,使用where来约束来自数据库的数据;
where是在结果返回之前起作用的;
where中不能使用聚合函数。
having:
having是一个过滤声明;
在查询返回结果集以后,对查询结果进行的过滤操作;
在having中可以使用聚合函数。
用的地方不一样
- where可以用于select、update、delete和insert into values(select * from table where …)语句中。
- having只能用于select语句中
执行的顺序不一样
- where的搜索条件是在执行语句进行分组之前应用
- having的搜索条件是在分组条件后执行的
- 即如果where和having一起用时,where会先执行,having后执行
子句有区别
- where子句中的条件表达式having都可以跟,而having子句中的有些表达式where不可以跟;
- having子句可以用集合函数(sum、count、avg、max和min),而where子句不可以。
where和having的执行顺序
- where 早于 group by 早于 having
- where子句在分组前先筛选记录,也就是说作用在group by 子句和having子句前,而 having子句在分组后对组记录进行筛选
总结
- WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
- GROUP BY 子句用来分组 WHERE 子句的输出。
- HAVING 子句用来从分组的结果中筛选行
分页查询
分组增强
数据分组总结
多表查询
自连接
子查询
查找与SMITH一个单位的所有成员
单行子查询
多行子查询
all_any
all
返回结果中最大值
any
返回结果最小值
子查询临时表
多列子查询
子查询练习
合并查询
union all
union
外连接
左外连接
右外连接
on 和 where的区别
当我们使用关联操作时,关联两张表或多张表来返回记录时,数据库就会生成一张临时表,最后将这张临时表返回给用户。以LEFT JOIN为例:在使用LEFT JOIN时,ON和WHERE的过滤条件的区别如下:
ON条件是在生成临时表时使用的条件,它不管ON中的条件是否为真,都会返回左边表中的记录
select * from dept left join emp on dept.deptno = emp.deptno;
由于LEFT JOIN(以及RIGHT JOIN,FULL JOIN)的特殊性,不管ON条件是否为真,数据库都会返回左侧(或右侧、左右两侧)表中的全部记录。
WHERE条件是在临时表已经生成后,对临时表进行的过滤条件。如果WHERE条件不为真的记录就会被过滤掉。
select * from dept left join emp on dept.deptno = emp.deptno where dept.deptno = emp.deptno;
可以发现外连接的执行顺序是要比where高的,并且where语句可以把不符合条件的行全部过滤掉
自增长
自我复制
自我复制
删除重复数据
sql语句执行顺序
- from
- join
- on
- where
- group by(开始使用select中的别名,后面的语句中都可以使用)
- avg,sum…
- having
- select
- distinct
- order by
- limit