MYSQL查询表格数据基本操作指南

数据库博文汇总

这篇博客旨在更详细简洁的介绍MYSQl中查询表格数据的相关基本操作,包括单张表格查询数据、使用聚合函数查询数据、连接多个表格查询数据、表格子查询语句、合并查询语句等。博文不仅给出了相关操作的详细介绍,还列举了每部分操作的详细源码供大家练习。本文不仅适合小白级同学阅读学习,也适合有一定基础的人来短时间快速掌握MYSQL查询表格数据操作。

推荐大家使用工具SQLyog,本文主要使用原始mysql窗口进行交互,相关指令在SQLyog上更加直观。本文的mysql源码命令行都有备注,对源码的含义给出解释。

单表查询

我们创建一个数据库s_book, 再使用这个数据库创建一个表格t_student且导入数据:

create database s_book;
use s_book;
create table `t_student` (
	`id` double ,
	`stuName` varchar (60),
	`age` double ,
	`sex` varchar (30),
	`gradeName` varchar (60)
); 
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('1','张三','23','男','一年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('2','张三丰','25','男','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('3','李四','23','男','一年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('4','王五','22','男','三年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('5','珍妮','21','女','一年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('6','李娜','26','女','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('7','王峰','20','男','三年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('8','梦娜','21','女','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('9','小黑','22','男','一年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('10','追风','25','男','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('11','小小张三','21',NULL,'二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('12','小张三','23','男','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('13','张三锋小','24',NULL,'二年级');

这样我们就创建完成了t_student,我们可以在mysql 里面利用命令查看表格:

+------+--------------+------+------+-----------+
| id   | stuName      | age  | sex  | gradeName |
+------+--------------+------+------+-----------+
|    1 | 张三         |   23 | 男   | 一年级    |
|    2 | 张三丰       |   25 | 男   | 二年级    |
|    3 | 李四         |   23 | 男   | 一年级    |
|    4 | 王五         |   22 | 男   | 三年级    |
|    5 | 珍妮         |   21 | 女   | 一年级    |
|    6 | 李娜         |   26 | 女   | 二年级    |
|    7 | 王峰         |   20 | 男   | 三年级    |
|    8 | 梦娜         |   21 | 女   | 二年级    |
|    9 | 小黑         |   22 | 男   | 一年级    |
|   10 | 追风         |   25 | 男   | 二年级    |
|   11 | 小小张三     |   21 | NULL | 二年级    |
|   12 | 小张三       |   23 | 男   | 二年级    |
|   13 | 张三锋小     |   24 | NULL | 二年级    |
+------+--------------+------+------+-----------+

或者利用SQLyog直接查看(s_book-->Tables-->t_student-->表数据):


  • 查询所有字段(语法:SELECT * FROM 表名/SELECT 字段 1,字段 2,字段 3...FROM 表名 ),第二种语法可以更改字段的位置:
mysql> select *from t_student;/*查询此表格所有字段*
| id   | stuName      | age  | sex  | gradeName |
+------+--------------+------+------+-----------+
|    1 | 张三         |   23 | 男   | 一年级    |
|    2 | 张三丰       |   25 | 男   | 二年级    |
|    3 | 李四         |   23 | 男   | 一年级    |
|    4 | 王五         |   22 | 男   | 三年级    |
|    5 | 珍妮         |   21 | 女   | 一年级    |
|    6 | 李娜         |   26 | 女   | 二年级    |
|    7 | 王峰         |   20 | 男   | 三年级    |
|    8 | 梦娜         |   21 | 女   | 二年级    |
|    9 | 小黑         |   22 | 男   | 一年级    |
|   10 | 追风         |   25 | 男   | 二年级    |
|   11 | 小小张三     |   21 | NULL | 二年级    |
|   12 | 小张三       |   23 | 男   | 二年级    |
|   13 | 张三锋小     |   24 | NULL | 二年级    |
+------+--------------+------+------+-----------+
mysql> select  stuName, id, age, gradeName, sex, stuName from t_student;  /*手动选取表中的这几行查看,且可以调整顺序*/
+--------------+------+------+-----------+------+--------------+
| stuName      | id   | age  | gradeName | sex  | stuName      |
+--------------+------+------+-----------+------+--------------+
| 张三         |    1 |   23 | 一年级    | 男   | 张三         |
| 张三丰       |    2 |   25 | 二年级    | 男   | 张三丰       |
| 李四         |    3 |   23 | 一年级    | 男   | 李四         |
| 王五         |    4 |   22 | 三年级    | 男   | 王五         |
| 珍妮         |    5 |   21 | 一年级    | 女   | 珍妮         |
| 李娜         |    6 |   26 | 二年级    | 女   | 李娜         |
| 王峰         |    7 |   20 | 三年级    | 男   | 王峰         |
| 梦娜         |    8 |   21 | 二年级    | 女   | 梦娜         |
| 小黑         |    9 |   22 | 一年级    | 男   | 小黑         |
| 追风         |   10 |   25 | 二年级    | 男   | 追风         |
| 小小张三     |   11 |   21 | 二年级    | NULL | 小小张三     |
| 小张三       |   12 |   23 | 二年级    | 男   | 小张三       |
| 张三锋小     |   13 |   24 | 二年级    | NULL | 张三锋小     |
+--------------+------+------+-----------+------+--------------+

使用SQLyog更加直观的看见结果为免博文冗长,后续不给出SQLyog直观界面截图,只给出SQL源码,将源码直接粘贴到SQLyog中运行就可以得到结果;SQLlog工具更加方便而已,相关指令是一样的。

  • 查询指定字段(语法:SELECT 字段 1,字段 2,字段 3...FROM 表名 ):
mysql> select id from t_student;  /*查寻指定列id*/
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
|   11 |
|   12 |
|   13 |
+------+
mysql> select age, sex from t_student; /*查询指定列 age、sex*/
+------+------+
| age  | sex  |
+------+------+
|   23 | 男   |
|   25 | 男   |
|   23 | 男   |
|   22 | 男   |
|   21 | 女   |
|   26 | 女   |
|   20 | 男   |
|   21 | 女   |
|   22 | 男   |
|   25 | 男   |
|   21 | NULL |
|   23 | 男   |
|   24 | NULL |
+------+------+
  • Where 条件查询(语法:SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 条件表达式),比如查询age这一栏,我只需要查询里面年龄是25岁的学生:
mysql> select id, stuname,age from t_student where age=25; /*当年龄为25岁时 查询指定字段*/
+------+-----------+------+
| id   | stuname   | age  |
+------+-----------+------+
|    2 | 张三丰    |   25 |
|   10 | 追风      |   25 |
+------+-----------+------+

查询年龄是25或者21的学生,where 条件表达式 or 条件表达式:

mysql> select id, stuname,age from t_student where age=25 or age=21; /*当年龄为25或者21岁时,查询指定字段*/
+------+--------------+------+
| id   | stuname      | age  |
+------+--------------+------+
|    2 | 张三丰       |   25 |
|    5 | 珍妮         |   21 |
|    8 | 梦娜         |   21 |
|   10 | 追风         |   25 |
|   11 | 小小张三     |   21 |
+------+--------------+------+

也可以运用不等号:

mysql> select id, stuname,age from t_student where age>25; /*当年龄大于25岁时,查询指定字段*/
+------+---------+------+
| id   | stuname | age  |
+------+---------+------+
|    6 | 李娜    |   26 |
+------+---------+------+
1 row in set (0.00 sec)

mysql> select id, stuname,age from t_student where age>=25; /*当年龄大于或者等于25岁时,查询指定字段*/
+------+-----------+------+
| id   | stuname   | age  |
+------+-----------+------+
|    2 | 张三丰    |   25 |
|    6 | 李娜      |   26 |
|   10 | 追风      |   25 |
+------+-----------+------+
3 rows in set (0.00 sec)
  • IN 关键字查询(语法:SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] IN (元素 1,元素 2,元素 3),比如我需要查询 年龄是21或者25 的学生:
mysql> select id, stuname,age from t_student where age in (21, 25); /*选择年龄是21、25的字段*/
+------+--------------+------+
| id   | stuname      | age  |
+------+--------------+------+
|    2 | 张三丰       |   25 |
|    5 | 珍妮         |   21 |
|    8 | 梦娜         |   21 |
|   10 | 追风         |   25 |
|   11 | 小小张三     |   21 |
+------+--------------+------+

反过来:

mysql>  select id, stuname,age from t_student where age not in (21, 25); /*选择21<age<25的字段*/
+------+--------------+------+
| id   | stuname      | age  |
+------+--------------+------+
|    1 | 张三         |   23 |
|    3 | 李四         |   23 |
|    4 | 王五         |   22 |
|    6 | 李娜         |   26 |
|    7 | 王峰         |   20 |
|    9 | 小黑         |   22 |
|   12 | 小张三       |   23 |
|   13 | 张三锋小     |   24 |
+------+--------------+------+
  • BETWEEN AND 的范围查询(语法:SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] BETWEEN 取值 1 AND 取值 2 ),如取 21<=age<=23的数据:
mysql> select id, stuname,age from t_student where age between 21 and 23; /*选择21<=age<=23的字段*/
+------+--------------+------+
| id   | stuname      | age  |
+------+--------------+------+
|    1 | 张三         |   23 |
|    3 | 李四         |   23 |
|    4 | 王五         |   22 |
|    5 | 珍妮         |   21 |
|    8 | 梦娜         |   21 |
|    9 | 小黑         |   22 |
|   11 | 小小张三     |   21 |
|   12 | 小张三       |   23 |
+------+--------------+------+
  • LIKE 的模糊查询(SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] LIKE ‘字符串 ):
mysql> select *from t_student where stuname like '张三'; /*stuname中选择任何含有‘张三’的字段*/
+------+---------+------+------+-----------+
| id   | stuName | age  | sex  | gradeName |
+------+---------+------+------+-----------+
|    1 | 张三    |   23 | 男   | 一年级    |
+------+---------+------+------+-----------+
1 row in set (0.00 sec)
mysql> select *from t_student where stuname='张三';/*stuname中选择张三*/
+------+---------+------+------+-----------+
| id   | stuName | age  | sex  | gradeName |
+------+---------+------+------+-----------+
|    1 | 张三    |   23 | 男   | 一年级    |
+------+---------+------+------+-----------+
1 row in set (0.00 sec)
可以看到上面两行代码效果是一样的,这儿我们使用“ % ”和 _ 再看看,(语法: % ”代表任意字符;

_” 代表单个字符

mysql> SELECT * FROM t_student WHERE stuName LIKE '张三%'; /*搜索出前两个字符是‘张三’的所有数据*/ 
+------+--------------+------+------+-----------+
| id   | stuName      | age  | sex  | gradeName |
+------+--------------+------+------+-----------+
|    1 | 张三         |   23 | 男   | 一年级    |
|    2 | 张三丰       |   25 | 男   | 二年级    |
|   13 | 张三锋小     |   24 | NULL | 二年级    |
+------+--------------+------+------+-----------+
mysql> SELECT * FROM t_student WHERE stuName LIKE '%张三%'; /*搜索出字符中间含有‘张三’的所有数据*/
+------+--------------+------+------+-----------+
| id   | stuName      | age  | sex  | gradeName |
+------+--------------+------+------+-----------+
|    1 | 张三         |   23 | 男   | 一年级    |
|    2 | 张三丰       |   25 | 男   | 二年级    |
|   11 | 小小张三     |   21 | NULL | 二年级    |
|   12 | 小张三       |   23 | 男   | 二年级    |
|   13 | 张三锋小     |   24 | NULL | 二年级    |
+------+--------------+------+------+-----------+
mysql> SELECT * FROM t_student WHERE stuName LIKE '张三_'; /*搜索stuname中字符前两个是'张三'的三位字符*/
+------+-----------+------+------+-----------+
| id   | stuName   | age  | sex  | gradeName |
+------+-----------+------+------+-----------+
|    2 | 张三丰    |   25 | 男   | 二年级    |
+------+-----------+------+------+-----------+
mysql> SELECT * FROM t_student WHERE stuName LIKE '张三__'; /*搜索字符前两个是‘张三’的四位字符,以此类推*/ 
+------+--------------+------+------+-----------+
| id   | stuName      | age  | sex  | gradeName |
+------+--------------+------+------+-----------+
|   13 | 张三锋小     |   24 | NULL | 二年级    |
+------+--------------+------+------+-----------+
  • 空值查询 (语法:SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 IS [NOT] NULL ):
mysql> select *from t_student where sex is null;/*取出性别是空值的数据*/  
+------+--------------+------+------+-----------+
| id   | stuName      | age  | sex  | gradeName |
+------+--------------+------+------+-----------+
|   11 | 小小张三     |   21 | NULL | 二年级    |
|   13 | 张三锋小     |   24 | NULL | 二年级    |
+------+--------------+------+------+-----------+
mysql> select *from t_student where sex is not null; /*与上相反*/  
+------+-----------+------+------+-----------+
| id   | stuName   | age  | sex  | gradeName |
+------+-----------+------+------+-----------+
|    1 | 张三      |   23 | 男   | 一年级    |
|    2 | 张三丰    |   25 | 男   | 二年级    |
|    3 | 李四      |   23 | 男   | 一年级    |
|    4 | 王五      |   22 | 男   | 三年级    |
|    5 | 珍妮      |   21 | 女   | 一年级    |
|    6 | 李娜      |   26 | 女   | 二年级    |
|    7 | 王峰      |   20 | 男   | 三年级    |
|    8 | 梦娜      |   21 | 女   | 二年级    |
|    9 | 小黑      |   22 | 男   | 一年级    |
|   10 | 追风      |   25 | 男   | 二年级    |
|   12 | 小张三    |   23 | 男   | 二年级    |
+------+-----------+------+------+-----------+
  • AND 或 OR的多条件查询(语法:SELECT *FROM 表名 WHERE 条件表达式 1 AND/OR 条件表达式 2 ):
mysql> select *from t_student where gradename='一年级' and age=23; /*寻找一年级且23岁的数据*/  
+------+---------+------+------+-----------+
| id   | stuName | age  | sex  | gradeName |
+------+---------+------+------+-----------+
|    1 | 张三    |   23 | 男   | 一年级    |
|    3 | 李四    |   23 | 男   | 一年级    |
+------+---------+------+------+-----------+
2 rows in set (0.00 sec)
mysql> select *from t_student where gradename='一年级' or age=23; /*寻找一年级或者23岁的学生*/  
+------+-----------+------+------+-----------+
| id   | stuName   | age  | sex  | gradeName |
+------+-----------+------+------+-----------+
|    1 | 张三      |   23 | 男   | 一年级    |
|    3 | 李四      |   23 | 男   | 一年级    |
|    5 | 珍妮      |   21 | 女   | 一年级    |
|    9 | 小黑      |   22 | 男   | 一年级    |
|   12 | 小张三    |   23 | 男   | 二年级    |
+------+-----------+------+------+-----------+
  • DISTINCT 去重复查询 (语法:SELECT DISTINCT 字段名 FROM 表名
mysql> select gradename from t_student ; /*显示表格中关于年级的所有数据*/
+-----------+
| gradename |
+-----------+
| 一年级    |
| 二年级    |
| 一年级    |
| 三年级    |
| 一年级    |
| 二年级    |
| 三年级    |
| 二年级    |
| 一年级    |
| 二年级    |
| 二年级    |
| 二年级    |
| 二年级    |
+-----------+
mysql> select distinct gradename from t_student ; /*显示表格中关于年级的所有不重复数据*/   
+-----------+
| gradename |
+-----------+
| 一年级    |
| 二年级    |
| 三年级    |
+-----------+
  • 对查询结果排序 (语法:SELECT 字段 1,字段 2...FROM 表名 ORDER BY 属性名 [ASC(升序)|DESC(降序)]
mysql> SELECT * FROM t_student ORDER BY age ASC; /*按年龄升序排*/  
+------+--------------+------+------+-----------+
| id   | stuName      | age  | sex  | gradeName |
+------+--------------+------+------+-----------+
|    7 | 王峰         |   20 | 男   | 三年级    |
|    5 | 珍妮         |   21 | 女   | 一年级    |
|    8 | 梦娜         |   21 | 女   | 二年级    |
|   11 | 小小张三     |   21 | NULL | 二年级    |
|    4 | 王五         |   22 | 男   | 三年级    |
|    9 | 小黑         |   22 | 男   | 一年级    |
|    1 | 张三         |   23 | 男   | 一年级    |
|    3 | 李四         |   23 | 男   | 一年级    |
|   12 | 小张三       |   23 | 男   | 二年级    |
|   13 | 张三锋小     |   24 | NULL | 二年级    |
|    2 | 张三丰       |   25 | 男   | 二年级    |
|   10 | 追风         |   25 | 男   | 二年级    |
|    6 | 李娜         |   26 | 女   | 二年级    |
+------+--------------+------+------+-----------+
mysql> SELECT * FROM t_student ORDER BY age desc; /*按年龄降序排*/  
+------+--------------+------+------+-----------+
| id   | stuName      | age  | sex  | gradeName |
+------+--------------+------+------+-----------+
|    6 | 李娜         |   26 | 女   | 二年级    |
|    2 | 张三丰       |   25 | 男   | 二年级    |
|   10 | 追风         |   25 | 男   | 二年级    |
|   13 | 张三锋小     |   24 | NULL | 二年级    |
|    1 | 张三         |   23 | 男   | 一年级    |
|    3 | 李四         |   23 | 男   | 一年级    |
|   12 | 小张三       |   23 | 男   | 二年级    |
|    4 | 王五         |   22 | 男   | 三年级    |
|    9 | 小黑         |   22 | 男   | 一年级    |
|    5 | 珍妮         |   21 | 女   | 一年级    |
|    8 | 梦娜         |   21 | 女   | 二年级    |
|   11 | 小小张三     |   21 | NULL | 二年级    |
|    7 | 王峰         |   20 | 男   | 三年级    |
+------+--------------+------+------+-----------+
  • GROUP BY 分组查询(语法直接见下源代码)
mysql> select gradename, group_concat(stuname) from t_student group by gradename;  /*通过年级分组,用group_concat函数合计每个年级的人数*/  
+-----------+--------------------------------------------------------------------+
| gradename | group_concat(stuname)                                              |
+-----------+--------------------------------------------------------------------+
| 一年级    | 张三,李四,珍妮,小黑                                                |
| 三年级    | 王五,王峰                                                          |
| 二年级    | 张三丰,李娜,梦娜,追风,小小张三,小张三,张三锋小                     |
+-----------+--------------------------------------------------------------------+
mysql> SELECT gradeName,COUNT(stuName) FROM t_student GROUP BY gradeName; /*通过年级分组,用count函数统计每个年级的人数*/ 
+-----------+----------------+
| gradeName | COUNT(stuName) |
+-----------+----------------+
| 一年级    |              4 |
| 三年级    |              2 |
| 二年级    |              7 |
+-----------+----------------+
mysql> SELECT gradeName,COUNT(stuName) FROM t_student GROUP BY gradeName HAVING COUNT(stuName)>3; /*加条件:显示每个年级人数大于3的数据*/ 
+-----------+----------------+
| gradeName | COUNT(stuName) |
+-----------+----------------+
| 一年级    |              4 |
| 二年级    |              7 |
+-----------+----------------+
mysql> SELECT gradeName,COUNT(stuName) FROM t_student GROUP BY gradeName WITH ROLLUP; /*后面加一行总和*/ 
+-----------+----------------+
| gradeName | COUNT(stuName) |
+-----------+----------------+
| 一年级    |              4 |
| 三年级    |              2 |
| 二年级    |              7 |
| NULL      |             13 |
+-----------+----------------+
mysql> SELECT gradeName,GROUP_CONCAT(stuName) FROM t_student GROUP BY gradeName WITH ROLLUP; /*累计字符加总和*/      
+-----------+--------------------------------------------------------------------------------------------------------------+
| gradeName | GROUP_CONCAT(stuName)                                                                                        |
+-----------+--------------------------------------------------------------------------------------------------------------+
| 一年级    | 张三,李四,珍妮,小黑                                                                                          |
| 三年级    | 王五,王峰                                                                                                    |
| 二年级    | 张三丰,李娜,梦娜,追风,小小张三,小张三,张三锋小                                                               |
| NULL      | 张三,李四,珍妮,小黑,王五,王峰,张三丰,李娜,梦娜,追风,小小张三,小张三,张三锋小                                 |
+-----------+--------------------------------------------------------------------------------------------------------------+
  • LIMIT 分页查询 (语法:SELECT 字段 1,字段 2...FROM 表名 LIMIT 初始位置,记录数
mysql> select *from t_student limit 0,5; /*从0开始,取5各数据,不包括0*/
+------+-----------+------+------+-----------+
| id   | stuName   | age  | sex  | gradeName |
+------+-----------+------+------+-----------+
|    1 | 张三      |   23 | 男   | 一年级    |
|    2 | 张三丰    |   25 | 男   | 二年级    |
|    3 | 李四      |   23 | 男   | 一年级    |
|    4 | 王五      |   22 | 男   | 三年级    |
|    5 | 珍妮      |   21 | 女   | 一年级    |
+------+-----------+------+------+-----------+
mysql> select *from t_student limit 5,10; /*从第五个数据开始,取10各数据,不包括第五个数据。取不满就算了*/  
+------+--------------+------+------+-----------+
| id   | stuName      | age  | sex  | gradeName |
+------+--------------+------+------+-----------+
|    6 | 李娜         |   26 | 女   | 二年级    |
|    7 | 王峰         |   20 | 男   | 三年级    |
|    8 | 梦娜         |   21 | 女   | 二年级    |
|    9 | 小黑         |   22 | 男   | 一年级    |
|   10 | 追风         |   25 | 男   | 二年级    |
|   11 | 小小张三     |   21 | NULL | 二年级    |
|   12 | 小张三       |   23 | 男   | 二年级    |
|   13 | 张三锋小     |   24 | NULL | 二年级    |
+------+--------------+------+------+-----------+

使用聚合函数查询

首先我们重新创建一个表格t_grade,以便于更好的使用聚合函数,这一节的聚合函数不同,但相关用法的语法基本相同

create table `t_grade` (
	`id` int ,
	`stuName` varchar (60),
	`course` varchar (60),
	`score` int 
); 
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('1','张三','语文','91');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('2','张三','数学','90');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('3','张三','英语','87');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('4','李四','语文','79');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('5','李四','数学','95');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('6','李四','英语','80');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('7','王五','语文','77');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('8','王五','数学','81');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('9','王五','英语','89');
mysql> select *from t_grade; /*查看表*/
+------+---------+--------+-------+
| id   | stuName | course | score |
+------+---------+--------+-------+
|    1 | 张三    | 语文   |    92 |
|    2 | 张三    | 数学   |    90 |
|    3 | 张三    | 英语   |    87 |
|    4 | 李四    | 语文   |    79 |
|    5 | 李四    | 数学   |    95 |
|    6 | 李四    | 英语   |    80 |
|    7 | 王五    | 语文   |    77 |
|    8 | 王五    | 数学   |    81 |
|    9 | 王五    | 英语   |    89 |
+------+---------+--------+-------+
  • COUNT()函数 (语法:见源码Mysql命令行),count可以看作是数数,数多少条记录,用来统计记录的条数 ,逐条统计:
mysql> select count(*) from t_grade; /*统计这个表格总共多少行数据*/  
+----------+
| count(*) |
+----------+
|        9 |
+----------+
mysql> select count(*) as total from t_grade;/*将count(*)记作total,最后一节专门讲这个用法*/ 
+-------+
| total |
+-------+
|     9 |
+-------+
mysql> select stuname,count(*) as total_course from t_grade group by stuname; /*根据stuname分组,统计每个人学几门课且记作tatal_course*/
+---------+--------------+
| stuname | total_course |
+---------+--------------+
| 张三    |            3 |
| 李四    |            3 |
| 王五    |            3 |
+---------+--------------+
  • SUM()函数(语法:见源码Mysql命令行), SUM函数是求和函数:
mysql> select stuname,sum(score)from t_grade where stuname='张三'; /*对张三成绩求和*/  
+---------+------------+
| stuname | sum(score) |
+---------+------------+
| 张三    |        269 |
+---------+------------+
mysql> select stuname,sum(score)from t_grade group by stuname; /*对每个人成绩求平均*/   
+---------+------------+
| stuname | sum(score) |
+---------+------------+
| 张三    |        269 |
| 李四    |        254 |
| 王五    |        247 |
+---------+------------+
mysql> select stuname,sum(score) as 总分 from t_grade group by stuname; /*统计每个人的总分*/ 
+---------+--------+
| stuname | 总分   |
+---------+--------+
| 张三    |    269 |
| 李四    |    254 |
| 王五    |    247 |
+---------+--------+
  • AVG()函数 (语法:见源码Mysql命令行),AVG()函数是求平均值的函数:
mysql> select stuname,avg(score)from t_grade where stuname='张三'; /*对张三成绩求平均*/ 
+---------+------------+
| stuname | avg(score) |
+---------+------------+
| 张三    |    89.6667 |
+---------+------------+
mysql> select stuname,avg(score) as `平均分` from t_grade group by stuname;/*对每个人求平均*/ 
+---------+-----------+
| stuname | 平均分    |
+---------+-----------+
| 张三    |   89.6667 |
| 李四    |   84.6667 |
| 王五    |   82.3333 |
+---------+-----------+
3 rows in set (0.00 sec)
mysql> select stuname as `学生姓名`,avg(score) as `平均分` from t_grade group by stuname;/*起别名,本文最后一节细讲*/  
+--------------+-----------+
| 学生姓名     | 平均分    |
+--------------+-----------+
| 张三         |   89.6667 |
| 李四         |   84.6667 |
| 王五         |   82.3333 |
+--------------+-----------+
  • MAX()函数 (语法:见源码Mysql命令行),MAX()函数是求最大值的函数:
mysql> select stuname,max(score)from t_grade where stuname='张三'; /*在张三成绩中找考的成绩最高的*/
+---------+------------+
| stuname | max(score) |
+---------+------------+
| 张三    |         92 |
+---------+------------+
mysql> select stuname,max(score) as '总分' from t_grade group by stuname;/*在每个人成绩中分别找最高的*/
+---------+--------+
| stuname | 总分   |
+---------+--------+
| 张三    |     92 |
| 李四    |     95 |
| 王五    |     89 |
+---------+--------+
  • MIN()函数 (语法:见源码Mysql命令行),MIN()函数是求最小值的函数:
mysql> select stuname,min(score)from t_grade where stuname='张三'; /*相对max,找最小的*/  
+---------+------------+
| stuname | min(score) |
+---------+------------+
| 张三    |         87 |
+---------+------------+
1 row in set (0.00 sec)

mysql> select stuname,min(score) as '总分' from t_grade group by stuname;/*相对于max,找最小的*/    
+---------+--------+
| stuname | 总分   |
+---------+--------+
| 张三    |     87 |
| 李四    |     79 |
| 王五    |     77 |
+---------+--------+
3 rows in set (0.00 sec)

连接查询

连接查询是将两个或两个以上的表按照某个条件连接起来,从中选取需要的数据,这儿我们创建两个基本表格来对相关操作示例:

USE `s_book`;
DROP TABLE IF EXISTS `t_book`;
create table `t_book`(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `bookName` varchar(20) DEFAULT NULL, 
  `price` decimal(6,2) DEFAULT NULL,
  `author` varchar(20) DEFAULT NULL,
  `bookTypeId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
insert  into `t_book`(`id`,`bookName`,`price`,`author`,`bookTypeId`) values (1,'Java编程思想','100.00','埃史尔',1),(2,'Java从入门到精通','80.00','李钟尉',1),(3,'三剑客','70.00','大仲马',2),(4,'生理学(第二版)','24.00','刘先国',4);
DROP TABLE IF EXISTS `t_booktype`;
create table t_booktype(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `bookTypeName` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
insert  into `t_booktype`(`id`,`bookTypeName`) values (1,'计算机类'),(2,'文学类'),(3,'教育类');
mysql> select *from t_book;/*查表所有字段*/
+----+------------------------+--------+-----------+------------+
| id | bookName               | price  | author    | bookTypeId |
+----+------------------------+--------+-----------+------------+
|  1 | Java编程思想           | 100.00 | 埃史尔    |          1 |
|  2 | Java从入门到精通       |  80.00 | 李钟尉    |          1 |
|  3 | 三剑客                 |  70.00 | 大仲马    |          2 |
|  4 | 生理学(第二版)         |  24.00 | 刘先国    |          4 |
+----+------------------------+--------+-----------+------------+
4 rows in set (0.00 sec)

mysql> select *from t_booktype;/*查表所有字段*/
+----+--------------+
| id | bookTypeName |
+----+--------------+
|  1 | 计算机类     |
|  2 | 文学类       |
|  3 | 教育类       |
+----+--------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM t_book,t_bookType;/*两张表放在一起查*/
+----+------------------------+--------+-----------+------------+----+--------------+
| id | bookName               | price  | author    | bookTypeId | id | bookTypeName |
+----+------------------------+--------+-----------+------------+----+--------------+
|  1 | Java编程思想           | 100.00 | 埃史尔    |          1 |  1 | 计算机类     |
|  1 | Java编程思想           | 100.00 | 埃史尔    |          1 |  2 | 文学类       |
|  1 | Java编程思想           | 100.00 | 埃史尔    |          1 |  3 | 教育类       |
|  2 | Java从入门到精通       |  80.00 | 李钟尉    |          1 |  1 | 计算机类     |
|  2 | Java从入门到精通       |  80.00 | 李钟尉    |          1 |  2 | 文学类       |
|  2 | Java从入门到精通       |  80.00 | 李钟尉    |          1 |  3 | 教育类       |
|  3 | 三剑客                 |  70.00 | 大仲马    |          2 |  1 | 计算机类     |
|  3 | 三剑客                 |  70.00 | 大仲马    |          2 |  2 | 文学类       |
|  3 | 三剑客                 |  70.00 | 大仲马    |          2 |  3 | 教育类       |
|  4 | 生理学(第二版)         |  24.00 | 刘先国    |          4 |  1 | 计算机类     |
|  4 | 生理学(第二版)         |  24.00 | 刘先国    |          4 |  2 | 文学类       |
|  4 | 生理学(第二版)         |  24.00 | 刘先国    |          4 |  3 | 教育类       |
+----+------------------------+--------+-----------+------------+----+--------------+
  • 内连接查询(语法:SELECT 属性名列表 FROM 表名 1, 表名 2 WHERE 表名 1.属性名 1=表名 2.属性名 2
mysql> select *from t_book `表1`, t_booktype `表2` where 表1.booktypeid=表2.id;/*将表1中booktypeid与表2中的id联系起来*/
+----+------------------------+--------+-----------+------------+----+--------------+
| id | bookName               | price  | author    | bookTypeId | id | bookTypeName |
+----+------------------------+--------+-----------+------------+----+--------------+
|  1 | Java编程思想           | 100.00 | 埃史尔    |          1 |  1 | 计算机类     |
|  2 | Java从入门到精通       |  80.00 | 李钟尉    |          1 |  1 | 计算机类     |
|  3 | 三剑客                 |  70.00 | 大仲马    |          2 |  2 | 文学类       |
+----+------------------------+--------+-----------+------------+----+--------------+
mysql> select bookname, author, booktypename from t_book `表1`, t_booktype `表2` where 表1.booktypeid=表2.id;/*如上但是只选取部分数据显示*/
+------------------------+-----------+--------------+
| bookname               | author    | booktypename |
+------------------------+-----------+--------------+
| Java编程思想           | 埃史尔    | 计算机类     |
| Java从入门到精通       | 李钟尉    | 计算机类     |
| 三剑客                 | 大仲马    | 文学类       |
+------------------------+-----------+--------------+
mysql> select 表1.bookname, 表1.author, 表2.booktypename from t_book `表1`, t_booktype `表2` where 表1.booktypeid=表2.id;/*与上一样,但是这样写防止混淆*/
| bookname               | author    | booktypename |
+------------------------+-----------+--------------+
| Java编程思想           | 埃史尔    | 计算机类     |
| Java从入门到精通       | 李钟尉    | 计算机类     |
| 三剑客                 | 大仲马    | 文学类       |
+------------------------+-----------+--------------+  
  • 外连接查询 (语法:SELECT 属性名列表 FROM 表名 1 LEFT|RIGHT JOIN 表名 2 ON 表名 1.属性名 1=表名 2.属性名 2):
mysql> select *from t_book `s` left join t_booktype `sw` on s.booktypeid=sw.id;/*将表1中booktypeid与表二中id一一对应,但完全显示表1数据,表二对应不上的用null表示*/
+----+------------------------+--------+-----------+------------+------+--------------+
| id | bookName               | price  | author    | bookTypeId | id   | bookTypeName |
+----+------------------------+--------+-----------+------------+------+--------------+
|  1 | Java编程思想           | 100.00 | 埃史尔    |          1 |    1 | 计算机类     |
|  2 | Java从入门到精通       |  80.00 | 李钟尉    |          1 |    1 | 计算机类     |
|  3 | 三剑客                 |  70.00 | 大仲马    |          2 |    2 | 文学类       |
|  4 | 生理学(第二版)         |  24.00 | 刘先国    |          4 | NULL | NULL         |
+----+------------------------+--------+-----------+------------+------+--------------+
mysql> select *from t_book `s` right join t_booktype `sw` on s.booktypeid=sw.id;/*如上,但完全显示表二数据*/
+------+------------------------+--------+-----------+------------+----+--------------+
| id   | bookName               | price  | author    | bookTypeId | id | bookTypeName |
+------+------------------------+--------+-----------+------------+----+--------------+
|    1 | Java编程思想           | 100.00 | 埃史尔    |          1 |  1 | 计算机类     |
|    2 | Java从入门到精通       |  80.00 | 李钟尉    |          1 |  1 | 计算机类     |
|    3 | 三剑客                 |  70.00 | 大仲马    |          2 |  2 | 文学类       |
| NULL | NULL                   |   NULL | NULL      |       NULL |  3 | 教育类       |
+------+------------------------+--------+-----------+------------+----+--------------+
  • 多条件连接查询 (语法:见源码),在内连接和外连接的基础上多加些条件而已:
mysql> select *from t_book `s` right join t_booktype `sw` on s.booktypeid=sw.id and s.price>70; /*再添加条件,价格大于70才显示,完全显示第二张表*/
+------+------------------------+--------+-----------+------------+----+--------------+
| id   | bookName               | price  | author    | bookTypeId | id | bookTypeName |
+------+------------------------+--------+-----------+------------+----+--------------+
|    1 | Java编程思想           | 100.00 | 埃史尔    |          1 |  1 | 计算机类     |
|    2 | Java从入门到精通       |  80.00 | 李钟尉    |          1 |  1 | 计算机类     |
| NULL | NULL                   |   NULL | NULL      |       NULL |  2 | 文学类       |
| NULL | NULL                   |   NULL | NULL      |       NULL |  3 | 教育类       |
+------+------------------------+--------+-----------+------------+----+--------------+

子查询

  • In 关键字的子查询(语法:SELECT *FROM 表1 WHERE 表1属性 IN (表2查询结果) ),通俗一点,把表2的查询结果看作一个集合来作为表1查询结果的范围界限,示例如下:
mysql> select id from t_booktype; /*取表格中id数据*/
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+
3 rows in set (0.00 sec)
mysql> select *from t_book where booktypeid in (select id from t_booktype);/*将上面的id结果 作为本次查询的参考集合,这次查询的booktypeid在这之内,若是4,就不显示*/
+----+------------------------+--------+-----------+------------+
| id | bookName               | price  | author    | bookTypeId |
+----+------------------------+--------+-----------+------------+
|  1 | Java编程思想           | 100.00 | 埃史尔    |          1 |
|  2 | Java从入门到精通       |  80.00 | 李钟尉    |          1 |
|  3 | 三剑客                 |  70.00 | 大仲马    |          2 |
+----+------------------------+--------+-----------+------------+
mysql> select *from t_book where booktypeid not in (select id from t_booktype);/*与上相反*/ 
+----+----------------------+-------+-----------+------------+
| id | bookName             | price | author    | bookTypeId |
+----+----------------------+-------+-----------+------------+
|  4 | 生理学(第二版)       | 24.00 | 刘先国    |          4 |
+----+----------------------+-------+-----------+------------+
  • 带比较运算符的子查询 (语法:SELECT *FROM 表1 WHERE 表1属性 [>,<,=] (表X查询结果) ), 加了比较运算:
mysql> select price from t_book where id=3; /*查出70*/
+-------+
| price |
+-------+
| 70.00 |
+-------+
mysql> select *from t_book where price>(select price from t_book where id=3);/*大于70,将上述结果作为参考标准*/
+----+------------------------+--------+-----------+------------+
| id | bookName               | price  | author    | bookTypeId |
+----+------------------------+--------+-----------+------------+
|  1 | Java编程思想           | 100.00 | 埃史尔    |          1 |
|  2 | Java从入门到精通       |  80.00 | 李钟尉    |          1 |
+----+------------------------+--------+-----------+------------+
  • Exists 关键字的子查询(语法:见源码),假如子查询查询到记录,则进行外层查询,否则,不执行外层查询:
mysql> select *from t_book where exists(select id from t_booktype); /*exists()条件为真,即返回数据,才执行前面操作,否则返回null*/
+----+------------------------+--------+-----------+------------+
| id | bookName               | price  | author    | bookTypeId |
+----+------------------------+--------+-----------+------------+
|  1 | Java编程思想           | 100.00 | 埃史尔    |          1 |
|  2 | Java从入门到精通       |  80.00 | 李钟尉    |          1 |
|  3 | 三剑客                 |  70.00 | 大仲马    |          2 |
|  4 | 生理学(第二版)         |  24.00 | 刘先国    |          4 |
+----+------------------------+--------+-----------+------------+
mysql> select *from t_book where not exists(select id from t_booktype); /*子查询为真,加个not,意思就别执行之前语句*/  
Empty set (0.00 sec)
  • Any 关键字的子查询 ,(语法:SELECT *FROM 表1 WHERE 表1属性 [>,<,=] ANY(表X查询结果) ),ANY 关键字表示满足其中任一条件;先新建另一张表作比较用:
create table `t_pricelevel` (
	`id` int ,
	`priceLevel` int ,
	`price` float ,
	`description` varchar (300)
); 
insert into `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) values('1','1','80.00','价格贵的书');
insert into `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) values('2','2','60.00','价格适中的书');
insert into `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) values('3','3','40.00','价格便宜的书');
mysql> select *from t_pricelevel; /*创建一个表格便于示例*/
+------+------------+-------+--------------------+
| id   | priceLevel | price | description        |
+------+------------+-------+--------------------+
|    1 |          1 |    80 | 价格贵的书         |
|    2 |          2 |    60 | 价格适中的书       |
|    3 |          3 |    40 | 价格便宜的书       |
+------+------------+-------+--------------------+
mysql> select *from t_book where price> any(select price from t_pricelevel); /*any代表任意,意思大于40就行*/   
+----+------------------------+--------+-----------+------------+
| id | bookName               | price  | author    | bookTypeId |
+----+------------------------+--------+-----------+------------+
|  1 | Java编程思想           | 100.00 | 埃史尔    |          1 |
|  2 | Java从入门到精通       |  80.00 | 李钟尉    |          1 |
|  3 | 三剑客                 |  70.00 | 大仲马    |          2 |
+----+------------------------+--------+-----------+------------+
  • All 关键字的子查询 (语法:SELECT *FROM 表1 WHERE 表1属性 [>,<,=] ALL(表X查询结果) ),ALL 关键字表示满足所有条件:
mysql> select *from t_book where price> all(select price from t_pricelevel);  /*all代表全部,意思price必须大于80*/  
+----+------------------+--------+-----------+------------+
| id | bookName         | price  | author    | bookTypeId |
+----+------------------+--------+-----------+------------+
|  1 | Java编程思想     | 100.00 | 埃史尔    |          1 |
+----+------------------+--------+-----------+------------+

合并查询结果

  • UNION 与 UNION ALL函数(语法:表达式1 UNION[ALL] 表达式2),把结果显示处来:
mysql> SELECT bookTypeName FROM t_booktype;
+--------------+
| bookTypeName |
+--------------+
| 计算机类     |
| 文学类       |
| 教育类       |
+--------------+
mysql> SELECT id FROM t_book;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
mysql> SELECT id FROM t_book UNION SELECT bookTypeName FROM t_booktype;  /*合并上面两个查询结果,但重复数据只显示一次*/ 
+--------------+
| id           |
+--------------+
| 1            |
| 2            |
| 3            |
| 4            |
| 计算机类     |
| 文学类       |
| 教育类       |
+--------------+
7 rows in set (0.00 sec)
mysql> SELECT id FROM t_book;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
4 rows in set (0.00 sec)

mysql>
mysql> SELECT id FROM t_booktype;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+
3 rows in set (0.00 sec)

mysql>
mysql> SELECT id FROM t_book UNION SELECT id FROM t_booktype; /*重复数据覆盖了*/  
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
4 rows in set (0.00 sec)
mysql> SELECT id FROM t_book UNION ALL SELECT id FROM t_booktype;  /*加ALL, 使所有结果显示*/   
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  1 |
|  2 |
|  3 |
+----+
7 rows in set (0.00 sec)

关于属性以及表格的备注用法

写完这节,本文就结束了,上文用到了部分表格以及属性别名操作,此语法主要是 `属性名 as 别名`,`表格+空格+别名`,示例如下:

mysql>  select author ,price from t_book where id=1;
+-----------+--------+
| author    | price  |
+-----------+--------+
| 埃史尔    | 100.00 |
+-----------+--------+
 
mysql> select author as `作者`,price as `价格` from t_book 表 where 表.id=1; /*author起别名作‘者’,price起别名‘价格’,t_book起别名‘表’*/
+-----------+--------+
| 作者      | 价格   |
+-----------+--------+
| 埃史尔    | 100.00 |
+-----------+--------+
 

猜你喜欢

转载自blog.csdn.net/w_weiying/article/details/80538447