MySQL (2) DQL

目录

操作须知

[1 单表查询](#1 单表查询)

[1.1 范围查询](#1.1 范围查询)

[1.2 模糊查询](#1.2 模糊查询)

[1.3 去重查询](#1.3 去重查询)

[1.4 正则查询](#1.4 正则查询)

[1.5 替换查询](#1.5 替换查询)

[1.6 排序查询](#1.6 排序查询)

[1.7 聚合+分组查询](#1.7 聚合+分组查询)

[1.7.1 聚合查询(只有1行)](#1.7.1 聚合查询(只有1行))

[1.7.2 分组查询(针对"聚合查询")](#1.7.2 分组查询(针对"聚合查询"))

[1.8 分页查询](#1.8 分页查询)

[1.9 拼接查询](#1.9 拼接查询)

[2 多表查询](#2 多表查询)

[2.1 内连接](#2.1 内连接)

[2.2 外连接](#2.2 外连接)

[2.2.1 左外连接](#2.2.1 左外连接)

[2.2.2 右外连接](#2.2.2 右外连接)

[2.2.3 全外连接](#2.2.3 全外连接)

[2.3 子查询](#2.3 子查询)

[2.3.1 一行一列(一个值)](#2.3.1 一行一列(一个值))

[2.3.2 多行一列(一个集合)](#2.3.2 多行一列(一个集合))

[2.3.3 多行多列(一个虚拟表:虚拟表都要起别名)](#2.3.3 多行多列(一个虚拟表:虚拟表都要起别名))

[2.4 叠加查询](#2.4 叠加查询)

[3 SQL执行顺序](#3 SQL执行顺序)


DQL(Data Query Language数据查询语言),查询数据

操作须知

where条件要用字段名(不能用别名)去做限制

●运算符:sql语句中可以进行数学运算(+ - × ÷) //如果非数值类型(可以是varchar类型的数字)参与运算,结果为null

●比较符:大于**>** 小于**<** 大于等于**>=** 小于等于**<=** 不等于**<>**

●逻辑符:与AND或OR非NOT

●判空:不能用=,要用IS NULL或IS NOT NULL

表达式:●NOW()当前日期时间 CURDATE()当前日期 CRUTIME()当前时间

●DATE_SUB/DATE_ADD('2020-10-20 16:30:30',INTERVL n DAY/MONTH/YEAR)得到指定日期时间前/后n天/月/年的日期时间

●IF(boolean结果,'值1','值2')true为'值1',false为'值2' IFNULL(字段,'替换值')如果字段为null,会被"替换值"替换

●FLOOR('小数')去掉小数取整 RAND()生成一个0~1之间的小数 //FLOOR(RAND()*100)生成0~99的随机整数

1 单表查询

1.1 范围查询

SELECT*FROM 表名 WHERE 字段 BETWEEN 最小值 AND 最大值 //(包含"最小值"和"最大值")这种方式只能作用于"数值数据" //范围查询(BETEEN,<,>)不走索引
SELECT*FROM 表名 WHERE 字段 IN (值1,值2...) //可以作用于"非数值数据"

1.2 模糊查询

SELECT*FROM 表名 WHERE 字段 (NOT)LIKE '_字符串%' //通配符:_表示一个字符,%表示0个或多个字符
SELECT*FROM 表名 WHERE CHAR_LENGTH(字段)<100 //找某个字段中长度小于100的数据

1.3 去重查询

SELECT DISTINCT * FROM 表名 //DISTINCT(放于所有字段最前面):去掉所查的完全相同的记录

1.4 正则查询

SELECT * FROM 表名 WHERE 字段 REGEXP '正则表达式' //只查询指定字段符合'正则表达式'的记录

1.5 替换查询

SELECT REPLACE(字段名,'值1','值2') FROM 表名 //部分替换,将指定字段的数据中包含的所有'值1'替换为'值2'
SELECT CASE 字段 WHEN 'aaa' THEN 'AAA' WHEN 'bbb' THEN 'BBB' END FROM 表名 //完全替换,如果字段的值是'aaa'就替换为'AAA',如果字段的值是'bbb'就替换为'BBB',不能完全匹配的显示Null

1.6 排序查询

SELECT * FROM 表名 ORDER BY 字段1 ASC,字段2 DESC //查到的记录先按字段1升序(ASC(默认)),再按字段2降序 (DESC)
ORDER BY RAND() //对查询的记录随机排序

SELECT * FROM 表名 ORDER BY RAND() LIMIT 2 //获取随机查询的前2条记录

1.7 聚合+分组查询

1.7.1 聚合查询(只有1行)

COUNT(字段) //统计字段数据个数(不会统计null) COUNT(*) //统计记录数(会统计null)

SUM(字段) //求和 AVG(字段) //平均值(不统计null) MAX()/MIN()最大/小值

1.7.2 分组查询(针对"聚合查询")

SELECT COUNT(*) FROM 表名 where 筛选条件 GROUP BY 分组字段1,分组字段2... HAVING 分组筛选条件 //WHERE在分组前执行(只能操作原始表字段),HAVING在分组后执行(可以操作聚合函数字段)

GROUP BY DAY/WEEK/MONTH/YEAR(日期时间字段) //按每日/周/月/年分组

1.8 分页查询

SELECT * FROM 表名 LIMIT A,B //A:跳过的记录数(不写默认0),B:每页显示的记录数

1.9 拼接查询

CONCAT(A,B......) //将多个字符串拼接成1个字符串 //A,B....可以是字段名,也可以是自定义的字符串 //A,B......只要有一个null,拼接结果就是null

CONCAT_WS(separator,A,B......) //与CONCAT类似,但字符之间用separator(分隔符)分隔

GROUP_CONCAT(A,B......) //作用于"聚合查询"或"分组查询",在CONCAT的基础上再进行拼接,多列合成一列(默认用","隔开)

sql 复制代码
# 聚合查询
SELECT count(*), group_concat( NAME, age ) FROM teacher;
sql 复制代码
# 分组查询
SELECT position, group_concat( NAME, age ) FROM teacher GROUP BY position;
sql 复制代码
SELECT position, group_concat(CONCAT_WS('_', NAME, age) ORDER BY age DESC SEPARATOR '&') FROM teacher GROUP BY position;

2 多表查询

WHERE和HAVING的区别:见"分组查询"

WHERE和ON对于内连接没区别:

对内连接来说:没区别

对外连接来说:WHERE只会显示符合条件的记录,ON会将一张表中不符合条件的记录也显示(左/右外连接一点要用ON,否则会报错),当然WHERE可以再对外连接ON条件后生成的临时表进行进一步过滤

2.1 内连接

只查询2张表之间有关联条件的数据

SELECT * FROM 表1,表2,表3... WHERE 关联条件 AND 筛选条件

2.2 外连接

查一张表的全部数据和领一张表的关联数据

2.2.1 左外连接

SELECT * FROM 表1 LEFT JOIN 表2 ON 关联条件1 AND 关联条件2... WHERE 筛选条件

2.2.2 右外连接

SELECT * FROM 表1 RIGHT JOIN 表2......

2.2.3 全外连接

全外连接,即求多张表的并集,但MySQL不支持全外连接的查询,但可以通过UNION语句实现

SELECT * FROM 表1 LEFT JOIN 表2 ON 关联条件 UNION SELECT * FROM 表1 RIGHT JOIN 表2 ON 关联条件

2.3 子查询

2.3.1 一行一列(一个值)

SELECT * FROM 表名 WHERE id = (SELECT MAX(id) FROM 表名)

2.3.2 多行一列(一个集合)

SELECT * FROM 表名 WHERE id IN (SELECT id FROM 表名 WHERE id<10)

2.3.3 多行多列(一个虚拟表:虚拟表都要起别名)

SELECT 表1.a , 表1.b , 表3.x , 表3.y FROM 表1 LEFT JOIN (SELECT * FROM 表2 WHERE id<10) 表3 ON 关联条件

2.4 叠加查询

SELECT 字段1,字段2 FROM 表1 UNION SELECT 字段3,字段4 FROM 表2 //UNION前表记录与UNION后表记录叠加(列数要相同,字段名取前表的) //UNION会将叠加后的记录去重,UNION ALL不会去重

3 SQL执行顺序

多表关联(ON) >> 条件(WHERE) >> 聚合 >> 分组(GROUP) >> 分组过滤(HAVING) >> 排序(ORDER BY) >> 分页(LIMIT)

相关推荐
黎宇幻生11 小时前
Java全栈学习笔记39
java·笔记·学习
Aurorar0rua12 小时前
C Primer Plus Notes 09
java·c语言·算法
nongcunqq13 小时前
abap 操作 excel
java·数据库·excel
rain bye bye13 小时前
calibre LVS 跑不起来 就将setup 的LVS Option connect下的 connect all nets by name 打开。
服务器·数据库·lvs
冻咸鱼14 小时前
MySQL的配置
mysql·配置
史迪奇_xxx14 小时前
10、一个简易 vector:C++ 模板与 STL
java·开发语言·c++
2301_8012522214 小时前
Java中的反射
java·开发语言
遇印记15 小时前
大二java学习笔记:二维数组
java·笔记·学习
阿里云大数据AI技术15 小时前
云栖实录|MaxCompute全新升级:AI时代的原生数据仓库
大数据·数据库·云原生
小杨同学yx15 小时前
有关maven的一些知识点
java·开发语言