DQL 语句 单表查询
语法
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[SQL_CACHE | SQL_NO_CACHE]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[FOR UPDATE | LOCK IN SHARE MODE]
解释
SELECT:
`SELECT` 是SQL中用于从数据库表中选择数据的语句。
[ALL | DISTINCT | DISTINCTROW ] :
这些是可选的修饰符。
`ALL`: 返回所有匹配的行(默认,如果不指定任何修饰符)。
`DISTINCT`: 只返回唯一的行(即去除重复的行)。
`DISTINCTROW`: 在某些数据库系统中(如MySQL),它是`DISTINCT`的别名,但在其他系统中可能有所不同。
[SQL_CACHE | SQL_NO_CACHE] :
这些是MySQL特定的选项,用于控制查询结果的缓存。
`SQL_CACHE`: 如果查询结果可以被缓存,MySQL会缓存结果,以便后续的相同查询可以更快地返回结果。
`SQL_NO_CACHE`: 即使查询结果可以被缓存,MySQL也不会缓存它。
select_expr:
这是你要从表中选择的列或表达式。可以是一个或多个,用逗号分隔。
[FROM table_references] :
指定你要从中选择数据的表或表的组合(如通过JOIN连接的多个表)。
[WHERE where_condition] :
用于过滤结果集的条件。只有满足`where_condition`的行才会被返回。
[GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] :
用于将结果集按一个或多个列或表达式进行分组。
`ASC` 和 `DESC` 用于指定排序方向(升序或降序)。
`WITH ROLLUP` 是一个MySQL特定的选项,用于在每个分组后添加一个额外的汇总行。
[HAVING where_condition] :
与`WHERE`类似,但用于过滤分组后的结果集。它通常与`GROUP BY`一起使用。
[ORDER BY {col_name | expr | position} [ASC | DESC], ...] :
用于对结果集进行排序。可以指定一个或多个列或表达式进行排序。
[LIMIT {[offset,] row_count | row_count OFFSET offset}] :
用于限制返回的行数。
`row_count` 指定要返回的行数。
`offset` 指定从哪一行开始返回结果(默认是0,表示从第一行开始)。
[FOR UPDATE | LOCK IN SHARE MODE] :
这些是MySQL特定的选项,用于锁定选定的行。
`FOR UPDATE`: 对选定的行加写锁,确保其他事务不能修改或删除这些行,直到当前事务完成。
`LOCK IN SHARE MODE`: 对选定的行加读锁,确保其他事务可以读取这些行但不能修改或删除它们,直到当前事务完成。
select 显示表格中一个或数个字段的所有数据记录
selecet 字段 from 表名;
字段可以用* 表示 代表所有,也可以挑选出自己想要的
例子
MySQL root@(none):hellodb> select name from teachers;
+---------------+
| name |
+---------------+
| Song Jiang |
| Zhang Sanfeng |
| Miejue Shitai |
| Lin Chaoying |
+---------------+
WHERE --- 过滤查询
语法:SELECT "字段" FROM "表名" WHERE "条件";
select * from students where name="xi ren"
select * from students where age=20; #年龄等于20岁
select * from students where age >20; #大于20岁
select * from students where age >=20 and age<=30; #20岁到30岁
例子: 不连续的查询: IN (element1, element2, ...)
select * from students where age in (20,22,30);
例子:空查询: IS NULL, IS NOT NULL
select * from students where classid is null;
select * from students where classid is not null;
例子: 字段使用别名
mysql> select age 年龄,classid 班级 from students;
+--------+--------+
| 年龄 | 班级 |
+--------+--------+
| 22 | 2 |
| 22 | 1 |
mysql< select age as 年龄,classid as 班级 from students;
AND OR 且 或
语法:
SELECT "字段" FROM "表名" WHERE "条件1" {[AND|OR] "条件2"}+ ;
例子:
select * from students where (age >20 and age <30) or age >50; # 20到30之间或大于50
select * from students where age > 50 or age <20; # 大于50或者小于20
select * from students where age > 50 and classid=2; # 年龄大于50 且 班级id 是2的
select * from students where age < 20 and gender="F";
like 模糊查询 与 通配符
% :百分号表示零个、一个或多个字符 *
_ :下划线表示单个字符 ?
'A_Z':所有以 'A' 起头,另一个任何值的字符,且以 'Z' 为结尾的字符串。例如,'ABZ' 和 'A2Z' 都符合这一个模式,而 'AKKZ' 并不符合 (因为在 A 和 Z 之间有两个字符,而不是一个字符)。
'ABC%': 所有以 'ABC' 起头的字符串。例如,'ABCD' 和 'ABCABC' 都符合这个模式。
'%XYZ': 所有以 'XYZ' 结尾的字符串。例如,'WXYZ' 和 'ZZXYZ' 都符合这个模式。
'%AN%': 所有含有 'AN'这个模式的字符串。例如,'LOS ANGELES' 和 'SAN FRANCISCO' 都符合这个模式。
'_AN%':所有第二个字母为 'A' 和第三个字母为 'N' 的字符串。例如,'SAN FRANCISCO' 符合这个模式,而 'LOS ANGELES' 则不符合这个模式。
语法: like
语法:SELECT "字段" FROM "表名" WHERE "字段" LIKE "匹配表达式";
例子:
select * from students where name='Xu Zhu'; #精确查找
select * from students where name like 's%'; #找到s 开头的
select * from students where name like '%s%'; #包含s
排序 order by
语法:
SELECT "字段" FROM "表名" [WHERE "条件"] ORDER BY "字段" [ASC, DESC];
#ASC 是按照升序进行排序的,是默认的排序方式。
#DESC 是按降序方式进行排序。
例子:
select * from students order by age; #年龄升序排列
select * from students order by age desc; #年龄降序排
select * from students order by age desc limit 3;
select * from students where classid=1 order by age; #找出1班的人按升序排序
6.4.8.11 limit
LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制,跳过offset,显示row_count行,offset默为值为0
例子: 取前5个数据
select * from students order by age limit 5;
例子:跳过前3个 往后取 5个, 一个页面可以显示商品也是靠limit 分页实现
select * from students limit 3,5;
6.4.8.12 having
HAVING 语句的存在弥补了 WHERE 关键字不能与聚合函数联合使用的不足
select classid,count(classid) from students group by classid having classid > 3;
select classid,count(classid) from students where classid > 3 group by classid;
select classid,count(classid) from students group by classid where classid > 3;
6.4.8.13 视图view 临时表
视图:数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了映射
格式:
create view 视图名 as 查询结果
例子:
create view v1 as select * from students where age > 50;
show tables;
select * from v1;
update students set age=90 where stuid=25;
select * from v1;
6.4.8.14 正则表达式
匹配 描述
^ 匹配文本的开始字符
$ 匹配文本的结束字符
. 匹配任何单个字符
* 匹配零个或多个在它前面的字符
+ 匹配前面的字符 1 次或多次字符串 匹配包含指定的字符串
p1|p2 匹配 p1 或 p2
[…] 匹配字符集合中的任意一个字符
[^…] 匹配不在括号中的任何字符
{n} 匹配前面的字符串 n 次
{n,m} 匹配前面的字符串至少 n 次,至多 m 次
{,m} 最多m次
{n,} 最少n次
? 匹配一个字符
例子:
select name from students where name regexp '^s'
select name from students where name regexp 's';
select name from students where name regexp 's.i';
select name from students where name regexp '^s|l';