概述
上篇,我们简单的学习了一下如何对数据表的字段顺序类别操作和基本的增改查的语法,今天,我们接着上篇的内容来学习数据库记录操作的重点————查询(单表)。
学习
记录查询
语法 SELECT select_expr [,select_expr …] [FROM table_references [WHERE where_condition] [GROUP BY {col_name | position} [ASC | DESC], … ] [HAVING where_condition] [ORDER BY {col_name | expr | position} [ASC | DESC], … ] [LIMIT {[offset,] row_count | row_count OFFSET offset} ] ]
其中,它的要求有:
- 要求
- 每一个表达式表示想要的一列,必须有至少一列
- 多个列之间用英文逗号隔开
- 星号*表示查询所有列
- tbl_name.* 可以表示命名表的所有列
- 查询表达式可以使用[AS] alias_anme 为其赋予别名
- 别名可用于GROUP BY,ORDER BY ,HAVING子句
语法看起来很麻烦的样子,不用担心,我们一个一个的来学习。
mysql> select _id,name from students;
+-----+------+
| _id | name |
+-----+------+
| 6 | Tom |
| 7 | Jack |
| 8 | Lucy |
| 9 | Ben |
+-----+------+
4 rows in set (0.00 sec)
mysql> select students._id,students.name from students;
+-----+------+
| _id | name |
+-----+------+
| 6 | Tom |
| 7 | Jack |
| 8 | Lucy |
| 9 | Ben |
+-----+------+
4 rows in set (0.00 sec)
mysql> select _id as userId,name as userName from students;
+--------+----------+
| userId | userName |
+--------+----------+
| 6 | Tom |
| 7 | Jack |
| 8 | Lucy |
| 9 | Ben |
+--------+----------+
4 rows in set (0.00 sec)
而且。select可以做许多其他的事情。如:
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-06-30 08:55:34 |
+---------------------+
1 row in set (0.00 sec)
mysql> select 1+1;
+-----+
| 1+1 |
+-----+
| 2 |
+-----+
1 row in set (0.00 sec)
mysql> select version();
+------------+
| version() |
+------------+
| 5.6.12-log |
+------------+
1 row in set (0.00 sec)
WHERE 条件表达式
作用是对记录进行过滤,如果没有指定WHERE子句,则显示所有记录
在WHERE表达式中,可以使用MYSQL支持的函数或运算符
mysql> select * from students;
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 6 | Tom | 男 | 34 | 13177020905 | 湖北荆州 | 2 |
| 7 | Jack | 女 | 22 | 13171230905 | 湖北监利 | 3 |
| 8 | Lucy | 女 | 34 | 13177020905 | 湖北荆州 | 2 |
| 9 | Ben | 女 | 27 | 13872425061 | 湖南岳阳 | 3 |
+-----+------+-----+-----+-------------+----------+------+
4 rows in set (0.00 sec)
mysql> select * from students where age > 30;
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 6 | Tom | 男 | 34 | 13177020905 | 湖北荆州 | 2 |
| 8 | Lucy | 女 | 34 | 13177020905 | 湖北荆州 | 2 |
+-----+------+-----+-----+-------------+----------+------+
2 rows in set (0.00 sec)
DISTINCT 消除相同的行
mysql> select address from students;
+----------+
| address |
+----------+
| 湖北荆州 |
| 湖北监利 |
| 湖北荆州 |
| 湖南岳阳 |
| 湖北荆州 |
| 湖北荆州 |
| 湖北荆州 |
| 湖北荆州 |
+----------+
8 rows in set (0.00 sec)
mysql> select distinct address from students;
+----------+
| address |
+----------+
| 湖北荆州 |
| 湖北监利 |
| 湖南岳阳 |
+----------+
3 rows in set (0.00 sec)
BETWEEN … AND … 和 NOT BTWEEN … AND … 范围查找
BETWEEN 后是范围的下限,AND是范围的上限
mysql> select * from students where age between 25 and 33;
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 9 | Ben | 女 | 27 | 13872425061 | 湖南岳阳 | 3 |
| 10 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 11 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 12 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 13 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
+-----+------+-----+-----+-------------+----------+------+
5 rows in set (0.00 sec)
mysql> select * from students where age not between 25 and 33;
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 6 | Tom | 男 | 34 | 13177020905 | 湖北荆州 | 2 |
| 7 | Jack | 女 | 22 | 13171230905 | 湖北监利 | 3 |
| 8 | Lucy | 女 | 34 | 13177020905 | 湖北荆州 | 2 |
+-----+------+-----+-----+-------------+----------+------+
3 rows in set (0.00 sec)
IN/NOT IN 确定集合
用来查找属性值属于指定集合的元组
mysql> select * from students where address in ('湖北荆州','湖南岳阳');
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 6 | Tom | 男 | 34 | 13177020905 | 湖北荆州 | 2 |
| 8 | Lucy | 女 | 34 | 13177020905 | 湖北荆州 | 2 |
| 9 | Ben | 女 | 27 | 13872425061 | 湖南岳阳 | 3 |
| 10 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 11 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 12 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 13 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
+-----+------+-----+-----+-------------+----------+------+
7 rows in set (0.00 sec)
mysql> select * from students where address not in ('湖北荆州','湖南岳阳');
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 7 | Jack | 女 | 22 | 13171230905 | 湖北监利 | 3 |
+-----+------+-----+-----+-------------+----------+------+
1 row in set (0.00 sec)
LIKE/NOT LIKE 字符匹配
其中有:
符号 | 作用 |
---|---|
% | 表示任意长度的字符串 |
_ | 单个的任意字符 |
mysql> select * from students where name like 'Tom';
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 6 | Tom | 男 | 34 | 13177020905 | 湖北荆州 | 2 |
+-----+------+-----+-----+-------------+----------+------+
1 row in set (0.00 sec)
mysql> select * from students where name like 'L%';
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 8 | Lucy | 女 | 34 | 13177020905 | 湖北荆州 | 2 |
| 10 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 11 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 12 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 13 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
+-----+------+-----+-----+-------------+----------+------+
5 rows in set (0.00 sec)
mysql> select * from students where name like 'L_l_';
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 10 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 11 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 12 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 13 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
+-----+------+-----+-----+-------------+----------+------+
4 rows in set (0.00 sec)
ESCAPE 通配符转义
如果我们自己表中的字段自带了 _ 那么怎么使用 _ 查询呢?
mysql> insert students values(null,'Li_Lucy','男',22,'13177020905','湖北武汉',3)
;
Query OK, 1 row affected (0.00 sec)
mysql> insert students values(null,'Li_Tom','女',22,'13177020905','湖北武汉',3);
Query OK, 1 row affected (0.00 sec)
mysql> insert students values(null,'Li_Jack','女',22,'13177020905','湖北武汉',3)
;
Query OK, 1 row affected (0.00 sec)
mysql> insert students values(null,'Li_Rock','女',22,'13177020905','湖北武汉',3)
;
Query OK, 1 row affected (0.00 sec)
mysql> select * from students;
+-----+---------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+---------+-----+-----+-------------+----------+------+
| 6 | Tom | 男 | 34 | 13177020905 | 湖北荆州 | 2 |
| 7 | Jack | 女 | 22 | 13171230905 | 湖北监利 | 3 |
| 8 | Lucy | 女 | 34 | 13177020905 | 湖北荆州 | 2 |
| 9 | Ben | 女 | 27 | 13872425061 | 湖南岳阳 | 3 |
| 10 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 11 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 12 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 13 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 14 | Li_Lucy | 男 | 22 | 13177020905 | 湖北武汉 | 3 |
| 15 | Li_Tom | 女 | 22 | 13177020905 | 湖北武汉 | 3 |
| 16 | Li_Jack | 女 | 22 | 13177020905 | 湖北武汉 | 3 |
| 17 | Li_Rock | 女 | 22 | 13177020905 | 湖北武汉 | 3 |
+-----+---------+-----+-----+-------------+----------+------+
12 rows in set (0.00 sec)
mysql> select * from students where name like 'Li/_%' ESCAPE '/';
+-----+---------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+---------+-----+-----+-------------+----------+------+
| 14 | Li_Lucy | 男 | 22 | 13177020905 | 湖北武汉 | 3 |
| 15 | Li_Tom | 女 | 22 | 13177020905 | 湖北武汉 | 3 |
| 16 | Li_Jack | 女 | 22 | 13177020905 | 湖北武汉 | 3 |
| 17 | Li_Rock | 女 | 22 | 13177020905 | 湖北武汉 | 3 |
+-----+---------+-----+-----+-------------+----------+------+
4 rows in set (0.00 sec)
涉及空值的查新 IS
空值的查询不能使用 =
mysql> insert students values(null,'Li_Jack','女',22,'13177020905','湖北武汉',nu
ll);
Query OK, 1 row affected (0.00 sec)
mysql> insert students values(null,'Li_Jack','女',22,'13177020905','湖北武汉',nu
ll);
Query OK, 1 row affected (0.00 sec)
mysql> insert students values(null,'Li_Jack','女',22,'13177020905','湖北武汉',nu
ll);
Query OK, 1 row affected (0.00 sec)
mysql> select * from students;
+-----+---------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+---------+-----+-----+-------------+----------+------+
| 6 | Tom | 男 | 34 | 13177020905 | 湖北荆州 | 2 |
| 7 | Jack | 女 | 22 | 13171230905 | 湖北监利 | 3 |
| 8 | Lucy | 女 | 34 | 13177020905 | 湖北荆州 | 2 |
| 9 | Ben | 女 | 27 | 13872425061 | 湖南岳阳 | 3 |
| 10 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 11 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 12 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 13 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 14 | Li_Lucy | 男 | 22 | 13177020905 | 湖北武汉 | 3 |
| 15 | Li_Tom | 女 | 22 | 13177020905 | 湖北武汉 | 3 |
| 16 | Li_Jack | 女 | 22 | 13177020905 | 湖北武汉 | 3 |
| 17 | Li_Rock | 女 | 22 | 13177020905 | 湖北武汉 | 3 |
| 18 | Li_Jack | 女 | 22 | 13177020905 | 湖北武汉 | NULL |
| 19 | Li_Jack | 女 | 22 | 13177020905 | 湖北武汉 | NULL |
| 20 | Li_Jack | 女 | 22 | 13177020905 | 湖北武汉 | NULL |
+-----+---------+-----+-----+-------------+----------+------+
15 rows in set (0.00 sec)
mysql> select * from students where pid = null;
Empty set (0.00 sec)
mysql> select * from students where pid is null;
+-----+---------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+---------+-----+-----+-------------+----------+------+
| 18 | Li_Jack | 女 | 22 | 13177020905 | 湖北武汉 | NULL |
| 19 | Li_Jack | 女 | 22 | 13177020905 | 湖北武汉 | NULL |
| 20 | Li_Jack | 女 | 22 | 13177020905 | 湖北武汉 | NULL |
+-----+---------+-----+-----+-------------+----------+------+
3 rows in set (0.00 sec)
AND / OR 多重查询
使用AND 或者 OR 来连接多个查询条件
mysql> select * from students where pid is null and _id > 19;
+-----+---------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+---------+-----+-----+-------------+----------+------+
| 20 | Li_Jack | 女 | 22 | 13177020905 | 湖北武汉 | NULL |
+-----+---------+-----+-----+-------------+----------+------+
1 row in set (0.00 sec)
GROUP BY 查询结果分组
这个的语法是查询语法中的一部分 [GROUP BY {col_name | position} [ASC | DESC], … ]
mysql> select * from students;
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 6 | Tom | 男 | 34 | 13177020905 | 湖北荆州 | 2 |
| 7 | Jack | 女 | 22 | 13171230905 | 湖北监利 | 3 |
| 8 | Lucy | 女 | 34 | 13177020905 | 湖北荆州 | 2 |
| 9 | Ben | 女 | 27 | 13872425061 | 湖南岳阳 | 3 |
+-----+------+-----+-----+-------------+----------+------+
4 rows in set (0.00 sec)
mysql> select sex from students group by sex;
+-----+
| sex |
+-----+
| 女 |
| 男 |
+-----+
2 rows in set (0.00 sec)
意思就是,将查询到的结果进行分组,相同分为一组
HAVING 分组条件
语法 [HAVING where_condition]
mysql> select sex,age from students group by 1 having age > 20;
+-----+-----+
| sex | age |
+-----+-----+
| 女 | 22 |
| 男 | 34 |
+-----+-----+
2 rows in set (0.00 sec)
mysql> select sex,age from students group by 2 having age > 20;
+-----+-----+
| sex | age |
+-----+-----+
| 女 | 22 |
| 男 | 25 |
| 女 | 27 |
| 男 | 34 |
+-----+-----+
4 rows in set (0.00 sec)
mysql> select sex,age from students group by sex having age > 20;
+-----+-----+
| sex | age |
+-----+-----+
| 女 | 22 |
| 男 | 34 |
+-----+-----+
2 rows in set (0.00 sec)
mysql> select sex,age from students group by age having age > 20;
+-----+-----+
| sex | age |
+-----+-----+
| 女 | 22 |
| 男 | 25 |
| 女 | 27 |
| 男 | 34 |
+-----+-----+
4 rows in set (0.00 sec)
可以猜到,group by后面接的数字是对应前面的字段位置(从1开始)
ORDER BY对查询结果进行排序
语法 [ORDER BY {col_name | expr | position} [ASC | DESC], … ]
mysql> select * from students order by age asc;
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 7 | Jack | 女 | 22 | 13171230905 | 湖北监利 | 3 |
| 10 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 11 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 12 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 13 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 9 | Ben | 女 | 27 | 13872425061 | 湖南岳阳 | 3 |
| 6 | Tom | 男 | 34 | 13177020905 | 湖北荆州 | 2 |
| 8 | Lucy | 女 | 34 | 13177020905 | 湖北荆州 | 2 |
+-----+------+-----+-----+-------------+----------+------+
8 rows in set (0.00 sec)
mysql> select * from students order by age desc;
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 6 | Tom | 男 | 34 | 13177020905 | 湖北荆州 | 2 |
| 8 | Lucy | 女 | 34 | 13177020905 | 湖北荆州 | 2 |
| 9 | Ben | 女 | 27 | 13872425061 | 湖南岳阳 | 3 |
| 10 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 11 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 12 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 13 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 7 | Jack | 女 | 22 | 13171230905 | 湖北监利 | 3 |
+-----+------+-----+-----+-------------+----------+------+
8 rows in set (0.00 sec)
LIMIT 限制查询结果返回数量
语法 [ LIMIT {[offset,] row_count | row_count OFFSET offset} ]
mysql> select * from students limit 2;
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 6 | Tom | 男 | 34 | 13177020905 | 湖北荆州 | 2 |
| 7 | Jack | 女 | 22 | 13171230905 | 湖北监利 | 3 |
+-----+------+-----+-----+-------------+----------+------+
2 rows in set (0.00 sec)
mysql> select * from students limit 2,3;
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 8 | Lucy | 女 | 34 | 13177020905 | 湖北荆州 | 2 |
| 9 | Ben | 女 | 27 | 13872425061 | 湖南岳阳 | 3 |
| 10 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
+-----+------+-----+-----+-------------+----------+------+
3 rows in set (0.02 sec)
mysql> select * from students limit 2 offset 3;
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 9 | Ben | 女 | 27 | 13872425061 | 湖南岳阳 | 3 |
| 10 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
+-----+------+-----+-----+-------------+----------+------+
2 rows in set (0.00 sec)
mysql> select * from students order by age desc limit 2,3;
+-----+------+-----+-----+-------------+----------+------+
| _id | name | sex | age | phone | address | pid |
+-----+------+-----+-----+-------------+----------+------+
| 9 | Ben | 女 | 27 | 13872425061 | 湖南岳阳 | 3 |
| 13 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
| 10 | Lili | 男 | 25 | 13177020905 | 湖北荆州 | 2 |
+-----+------+-----+-----+-------------+----------+------+
3 rows in set (0.00 sec)
SQL函数
AVG 求平均值
mysql> select avg(age) from students;
+----------+
| avg(age) |
+----------+
| 27.1250 |
+----------+
1 row in set (0.00 sec)
ROUND 小数后的位数
mysql> select round(avg(age),3) from students;
+-------------------+
| round(avg(age),3) |
+-------------------+
| 27.125 |
+-------------------+
1 row in set (0.00 sec)
COUNT 统计元组个数
mysql> select count(*) from students;
+----------+
| count(*) |
+----------+
| 15 |
+----------+
1 row in set (0.00 sec)
SUM 计算总和
mysql> select sum(age) from students;
+----------+
| sum(age) |
+----------+
| 371 |
+----------+
1 row in set (0.00 sec)
MAX 最大 / MIN 最小
mysql> select max(age) from students;
+----------+
| max(age) |
+----------+
| 34 |
+----------+
1 row in set (0.00 sec)
mysql> select min(age) from students;
+----------+
| min(age) |
+----------+
| 22 |
+----------+
1 row in set (0.00 sec)
基础五到此,转到基础六