更新记录
转载请注明出处。
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
比较:
= != < <= > >= <! >! <>
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 表达式, 表达式
USE panda_database; SELECT name,COUNT(Gender) as 'count' FROM panda_table3 GROUP BY Gender WITH ROLLUP;
语法:
GROUP_CONCAT(属性名1)
作用:将把所有属性名的值列出来
EG:
SELECT name,GROUP_CONCAT(id) FROM test1 GROUP BY name;
聚合函数有:
MAX()
MIN()
AVG()
SUM()
COUNT()
HAVING与WHERE区别在于:
HAVING作用在组上或者说作用在分组属性上,用于筛查组内数据
WHERE作用在表或视图,用于筛查全部数据
语法:
LIMIT 条数 LIMIT 起始位置, 条数
注意:起始位置从0开始
将查询结果嵌套在另一个查询中
不同位置支持的子查询类型:
子查询放在小括号内。
子查询一般放在条件的右侧。
标量子查询,一般搭配着单行操作符使用,比如:> <> = < == <>。
列子查询,一般搭配着多行操作符使用,比如:in、any/some、all。
子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果。
SOME ALL IN NOT IN EXISTS //如果返回行数大于1,返回TRUE,否则返回FALSE NOT EXISTS < > <= >= = !=
SELECT * FROM users WHERE users.uids IN (SELECT buids FROM buy);
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实例:
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+';
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}';
SELECT * FROM panda_table3 WHERE name REGEXP '[p]{1,100}'
SELECT * FROM panda_table3 WHERE name REGEXP 'panda|cat{1,100}';
使用\符号,进行转义
SELECT * FROM users WHERE unames REGEXP BINARY '\\(panda\\)';