这篇博客旨在更详细简洁的介绍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-->表数据):
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工具更加方便而已,相关指令是一样的。
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 |
+------+------+
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)
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
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 |
+------+--------------+------+
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 | 二年级 |
+------+--------------+------+------+-----------+
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 | 男 | 二年级 |
+------+-----------+------+------+-----------+
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 | 男 | 二年级 |
+------+-----------+------+------+-----------+
mysql> select gradename from t_student ; /*显示表格中关于年级的所有数据*/
+-----------+
| gradename |
+-----------+
| 一年级 |
| 二年级 |
| 一年级 |
| 三年级 |
| 一年级 |
| 二年级 |
| 三年级 |
| 二年级 |
| 一年级 |
| 二年级 |
| 二年级 |
| 二年级 |
| 二年级 |
+-----------+
mysql> select distinct gradename from t_student ; /*显示表格中关于年级的所有不重复数据*/
+-----------+
| gradename |
+-----------+
| 一年级 |
| 二年级 |
| 三年级 |
+-----------+
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 | 男 | 三年级 |
+------+--------------+------+------+-----------+
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 | 张三,李四,珍妮,小黑,王五,王峰,张三丰,李娜,梦娜,追风,小小张三,小张三,张三锋小 |
+-----------+--------------------------------------------------------------------------------------------------------------+
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 |
+------+---------+--------+-------+
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 |
+---------+--------------+
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 |
+---------+--------+
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 |
+--------------+-----------+
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 |
+---------+--------+
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 | 教育类 |
+----+------------------------+--------+-----------+------------+----+--------------+
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从入门到精通 | 李钟尉 | 计算机类 |
| 三剑客 | 大仲马 | 文学类 |
+------------------------+-----------+--------------+
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 | 教育类 |
+------+------------------------+--------+-----------+------------+----+--------------+
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 |
+----+----------------------+-------+-----------+------------+
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 |
+----+------------------------+--------+-----------+------------+
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)
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 |
+----+------------------------+--------+-----------+------------+
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 |
+----+------------------+--------+-----------+------------+
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 |
+-----------+--------+