[toc]

MySQL单表查询

简单查询

1.直接查询

全部查询

1
select 字段 from 表名

最简单的一种查询方式,可查看多个字段或整张表。

1
2
3
4
5
6
7
8
9
10
11
mysql> select name,age from yunwei;
+--------+-----+
| name | age |
+--------+-----+
| 张三 | 20 |
| 张四 | 21 |
| 张莉 | 22 |
| 张五 | 23 |
| 张六 | 24 |
| 张丽 | 25 |
+--------+-----+

意思是查询yunwei表中name和age部分的全部信息

不重复查询

1
SELECT distinct 字段列表 from 表名;

2.条件查询

直接查询

1
select 字段 from 表名 where 条件

根据条件,查询指定条件的字段。
如:

1
2
3
4
5
6
mysql> select * from caiwu where age=20;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 5 | 李四 | 20 | man |
+----+--------+-----+-----+

意思是查询caiwu表中年龄为20的人

算数运算符
符号 作用
> 大于
小于
= 等于
!= 不等于
<> 不等于
>= 大于等于
<= 小于等于

通过逻辑运算符可以将条件限制在一个范围内。

1
select * from caiwu where id!=1;
1
2
3
4
5
6
7
8
9
10
mysql> select * from caiwu where id!=1;
+----+--------+-----+-------+
| id | name | age | sex |
+----+--------+-----+-------+
| 2 | 李莉 | 23 | woman |
| 3 | 李二 | 22 | man |
| 4 | 李三 | 21 | man |
| 5 | 李四 | 20 | man |
| 6 | 李丽 | 19 | woman |
+----+--------+-----+-------+

搜索id≠1条件下caiwu表中的所有项

逻辑运算符
符号 作用
and 或 && 与,同时满足多个选项
or 或 \ \ 或,满足一个选项即可
not 或 ! 否,不满足条件

注意:在 MySQL 中,and 的优先级要高于 or。

in 与 not in运算符
符号 作用
in 在一个条件列表中
not in 不在一个条件列表中
1
2
3
4
5
6
7
8
-- 查询与‘张三’在同一个系学习的学生学号、姓名、性别、所在系
SELECT Sno, Sname, Ssex, Sdept FROM Student

WHERE Sdept IN (

SELECT Sdept FROM Student WHERE Sname = '张三'

)

模糊查询

1
select 字段 from 表名 where 字段 like 匹配项;

通过输入具体的数据,来对记录进行查询

注:

_ 匹配单个字符;

% 匹配任意字符,不管前后。

如:

1
2
3
4
5
6
mysql> select * from caiwu where name like '%三';
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 4 | 李三 | 21 | man |
+----+--------+-----+-----+

聚合查询

聚合函数

函数 功能
count 统计条数
max 最大值
min 最小值
avg 平均值
sum 求和
1
select 聚合函数(字段列表) from 表名;

如:

1
2
select count(*) from emp;
select count(id) from emp;

注:

null值不参加所有聚合函数

排序查询

ORDER BY作用是选择字段并对该字段进行排序

asc 升序(默认)
desc 降序
1
SELECT * FROM Websites ORDER BY 字段1 排序方试一,字段二 排序方试二;

注意:

如果字段1排序一致才会采用字段2排序

img

该排序可以判断列表行数

分组查询

group by将某一字段相同元素聚合

1
select 字段列表 from 表名 [where 条件] group by 列名 [HAVING 分组后过滤条件];

having与where区别

  1. 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后再对结果过滤

对分组后的数据进行再次过滤,必须在group by后面

  1. 判断条件不同:where不能对聚合函数进行判断,而having可以

使用limit限制查询结果

1
SELECT 列名 FROM 表名 limit 起始索引,查询记录数;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT employee_id, first_name, last_name FROM employees ORDER BY first_name;

+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
| 103 | Alexander | Lee |
| 115 | Alexander | Su |
| 114 | Avg | Su |
| 193 | Britney | Zhao |
| 104 | Bruce | Wong |
... ...
| 100 | Steven | Lee |
| 203 | Susan | Zhou |
| 106 | Valli | Chen |
| 206 | William | Wu |
+-------------+------------+-----------+
40 rows in set

注意

  1. 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。

  2. 分页查询是数据库的方言,不同数据库有不同的实现,MySQL中是LIMIT。

  3. 如果查询的是第一页数据,起始索引可以忽略,直接简写为limit 10。

如果要只返回前5行,请使用LIMIT子句,如以下语句。

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT  employee_id, first_name, last_name FROM employees ORDER BY first_name LIMIT 5;

+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
| 115 | Alexander | Su |
| 103 | Alexander | Lee |
| 114 | Avg | Su |
| 193 | Britney | Zhao |
| 104 | Bruce | Wong |
+-------------+------------+-----------+
5 rows in set