mysql 单表查询

88 阅读6分钟

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岁

image.png

例子: 不连续的查询: 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';