MySQL教程 - DQL操作
作者:互联网
更新记录
转载请注明出处。
2022年9月2日 发布。
2022年9月2日 从笔记迁移到博客。
基本查询
SELECT 属性列表
FROM 表或视图
WHERE 筛选条件1
GROUP BY 属性 [HAVING 筛选条件2] [WITH ROLLUP]
ORDER BY 属性 [ASC |DESC] ……….;
LIMIT 条件
注意:
GROUP BY 表示按该属性进行分组,满足HAVING 条件的才输出
ORDER BY 表示按该属性进行排序 ASC 表示升序 DESC表示降序
ORDER BY支持多个列
WITH ROLLUP 显示每个分组的汇总信息
查询结果排除重复
SELECT DISTINCT 属性名
别名
支持 表别名 和 字段别名
SELECT 字段 AS 字段别名
FROM 表 AS 表别名;
连接
连接示意图
内连接
SELECT 字段
FROM 表1,表2,表3,...
WHERE 连接条件;
左外连接
SELECT 字段
FROM 表1 LEFT JOIN 表2
ON连接条件
WHERE 条件;
右外连接
SELECT 字段
FROM 表1 RIGHT JOIN 表2
ON连接条件
WHERE 条件;
合并查询
UNION
UNION ALL
限定条件where
比较大小相等
比较:
= != < <= > >= <! >! <>
EG:
WHERE Property > 666666;
指定范围内
范围:
BETWEEN 边界1 AND 边界2
NOT BETWEEN 边界1 AND 边界2
注意:BETWEEN包括边界值
注意:NOT BETWEEN不包括边界值
EG:
SELECT * FROM test1
WHERE id NOT BETWEEN 1 AND 2; -- 注意:包括1,2
指定集合内
指定集合:
IN(value1,value2,……)
NOT IN(value1,value2,…..)
EG:
SELECT * FROM test1
WHERE id IN(1,2);
匹配字符
匹配字符:
LIKE '字符串'
NOT LIKE '字符串'
匹配符号:
% 任意长度字符串(包括0)
_ 单个字符
EG:
SELECT * FROM test1
WHERE name like 'panda%';
是否为空
是否为空:
IS NULL
IS NOT NULL
EG:
SELECT * FROM test1
WHERE id IS NOT NULL;
多个条件组合
组合条件:
条件1 AND 条件2 …….
条件1 OR 条件2 …….
EG:
SELECT * FROM test1
WHERE id>2 AND name like 'panda%';
否定条件
否定:
NOT
对结构进行排序
ORDER BY 条件 [ASC |DESC] …………….
ORDER BY语句一般放在最后面,除了LIMIT语句
这里的条件可以是:单个字段、多个字段、表达式、别名、函数
实例:
ORDER BY <字段名称> DESC //单个字段排序
ORDER BY <字段名称> DESC, <字段名称> DESC //多个字段排序
ORDER BY LNGTH(<字段名称>) DESC //使用函数
ORDER BY (<字段名称>+1)/2 DESC //使用表达式
ORDER BY <SELECT语句中的别名> DESC //使用别名
对结果进行分组
单独使用GROUP BY
语法:
GROUP BY 表达式
注意:将只显示每个分组的一条记录
根据多个表示进行分组
GROUP BY 表达式, 表达式
显示汇总信息
USE panda_database;
SELECT name,COUNT(Gender) as 'count'
FROM panda_table3
GROUP BY Gender
WITH ROLLUP;
与GROUP_CONCAT()一起使用
语法:
GROUP_CONCAT(属性名1)
作用:将把所有属性名的值列出来
EG:
SELECT name,GROUP_CONCAT(id) FROM test1
GROUP BY name;
与聚合函数一起使用
聚合函数有:
MAX()
MIN()
AVG()
SUM()
COUNT()
与HAVING一起使用
HAVING与WHERE区别在于:
HAVING作用在组上或者说作用在分组属性上,用于筛查组内数据
WHERE作用在表或视图,用于筛查全部数据
限制结果条数
语法:
LIMIT 条数
LIMIT 起始位置, 条数
注意:起始位置从0开始
子查询
子查询概念
将查询结果嵌套在另一个查询中
子查询分类(按 结 果 集 的 行 列 数 不 同 )
- 标量子查询。返回一个值,本质是单行单列。
- 表子查询。返回一个包含多行多列的表。
- 列子查询。返回一列多行的数据。
- 行子查询。返回一行多列的数据。
不同位置支持的子查询类型:
- select后面,仅支持标量子查询。
- from后面,支持表子查询。
- where或having后面,支持标量子查询、列子查询、行子查询。
- exists后面,支持表子查询。
子查询的特点
-
子查询放在小括号内。
-
子查询一般放在条件的右侧。
-
标量子查询,一般搭配着单行操作符使用,比如:> <> = < == <>。
-
列子查询,一般搭配着多行操作符使用,比如:in、any/some、all。
-
子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果。
子查询可用的操作符有
SOME
ALL
IN
NOT IN
EXISTS //如果返回行数大于1,返回TRUE,否则返回FALSE
NOT EXISTS
<
>
<=
>=
=
!=
IN / NOT IN 子查询
SELECT *
FROM users
WHERE users.uids IN
(SELECT buids FROM buy);
EXISTS / NOT EXISTS 子查询
SELECT *
FROM users
WHERE NOT EXISTS
(SELECT buids FROM buy WHERE buids = 1);
比较运算符子查询
SELECT *
FROM users
WHERE users.uids =
(SELECT buids FROM buy);
SOME ALL 子查询
SOME表示只要满足内层查询的任何一个条件都可以执行外部查询
ALL表示外部查询必须满足内层查询的每一个结果
SOME和ALL通常配合比较运算符使用
SOME实例:
SELECT *
FROM users
WHERE users.uids > SOME
(SELECT buids FROM buy);
ALL实例:
SELECT *
FROM users
WHERE users.uids <= ALL
(SELECT buids FROM buy);
合并查询结果
UNION
UNION ALL
UNION 合并查询结果并去除重复,UNION ALL合并查询结果但保留重复。
注意:确保列的类型兼容。
适合场景:
-
比较复杂的查询拆分成多个查询,然后合并。
-
合并多个查询的结果。
表和属性的别名语法
表别名语法:
表名 [AS] 别名
字段别名
字段 [AS] 别名
分页查询
应用场景
当要显示的数据,一页显示不全,需要分页提交sql请求。
limit [offset] size;
offset 要显示条目的起始索引(起始索引从0开始),size 要显示的条目个数。
注意:limit语句放在查询语句的最后。
实例:
SELECT * FROM employees LIMIT 0,5;
SELECT * FROM employees LIMIT 5;
分页计算公式:
limit (page-1) * size,size;
正则表达查询
正则表达查询
属性 REGEXP '正则表达式'
正则表达式模式字符表
实例:查询特定字符开头的记录
SELECT * FROM users
WHERE unames REGEXP '^panda';
实例:查询特定字符结尾的记录
SELECT * FROM users
WHERE unames REGEXP '666666$';
实例:用.来代替一个字符
SELECT * FROM users
WHERE unames REGEXP 'pa..a......';
实例:匹配指定字符的任意一个
SELECT * FROM users
WHERE unames REGEXP '[p|m]';
备注:还可以使用[0-9] [A-Z] [a-z]
实例:匹配指定字符外的任意一个
SELECT * FROM users
WHERE unames REGEXP '[^panda]';
实例:匹配指定字符
SELECT * FROM users
WHERE unames REGEXP 'panda';
实例:使用*和+匹配多个字符
\* 匹配任意个字符(包括0个)
\+ 匹配任意个字符(至少一个)
EG:
SELECT * FROM users
WHERE unames REGEXP 'panda*';
EG:
SELECT * FROM users
WHERE unames REGEXP 'panda+';
实例:使用{m} {m,n}匹配字符连续出现的次数
SELECT * FROM users
WHERE unames REGEXP 'panda6{6}';
EG2:
SELECT * FROM users
WHERE unames REGEXP 'panda6{6,6}';
实例:大小写问题
默认正则匹配不区分大小写,使用BINARY区分大小写
SELECT * FROM users
WHERE unames REGEXP BINARY 'panda6{6,6}';
实例:匹配以p开头的字符串
SELECT *
FROM panda_table3
WHERE name REGEXP '[p]{1,100}'
实例:匹配panda或cat
SELECT *
FROM panda_table3
WHERE name REGEXP 'panda|cat{1,100}';
实例:匹配特定符号问题
使用\符号,进行转义
SELECT * FROM users
WHERE unames REGEXP BINARY '\\(panda\\)';
标签:教程,users,查询,实例,MySQL,DQL,REGEXP,WHERE,SELECT 来源: https://www.cnblogs.com/cqpanda/p/16648545.html