某个班级学生信息表t_grade结构和数据如下:
id stuName course score
--- ----- ------ -----
1 张三 语文 91
2 王五 数学 90
3 张三 英语 87
4 李四 语文 79
5 马六 数学 95
6 李四 英语 80
7 张三 语文 77
8 王五 数学 81
9 王五 英语 89
10 马六 数学 60
11 马六 物理 54
一、单表查询
1.查询所有字段
select * from 表名;
2.查询特定字段
select 字段1,字段2,字段3... from 表名;
3.where条件查询
select * from 表名 where 条件表达式;
4.带in关键字查询
select * from 表名 where 字段 [not] in (元素 1,元素 2,元素 3);
5 .带between and关键字查询
select * from 表名 where 字段 [not] between 取值 1 AND 取值 2;
6.带like的模糊查询
select * from 表名 where 字段 [not] like ‘字符串’;
“%”代表任意字符;
“_” 代表单个字符;
7.空值查询
select * from 表名 where 字段 is [not] null;
8.带 and的多条件查询
select * from 表名 where 条件表达式 1 and条件表达式 2 [...and 条件表达式 n];
9.带or的多条件查询
select * from 表名 where 条件表达式 1 or条件表达式 2 [...or 条件表达式 n]
10.distinct 去重复查询
select distinct 字段名 FROM 表名;
11.对查询结果排序
select * from 表名 order by 属性名 [asc|desc];
12.group by 分组查询
group by 属性名 [having 条件表达式][with rollup];
1,单独使用(毫无意义);
2,与 group_concat()函数一起使用;
3,与聚合函数一起使用;
4,与having一起使用(限制输出的结果);
5,与with rollup一起使用(最后加入一个总和行);
实例1:
SELECT id,stuName,GROUP_CONCAT(course) FROM t_grade GROUP BY stuName;
#GROUP_CONCAT()函数;上面sql语句作用:
#以stuName分组,把stuName相同的记录的course值打印在一起
#执行结果
id stuName GROUP_CONCAT(course)
------ ------- ----------------------
6 李四 英语,语文
10 马六 数学,物理,数学
8 王五 数学,英语,数学
3 张三 英语,语文,语文
实例2:
#对查询结果进行筛选
SELECT id,stuName,GROUP_CONCAT(course) FROM t_grade GROUP BY stuName HAVING id>5;
#HAVING;上面sql语句作用:
#对SELECT id,stuName,GROUP_CONCAT(course) FROM t_grade GROUP BY stuName查询结果筛选出id>5的记录
#执行结果
id stuName GROUP_CONCAT(course)
------ ------- ----------------------
6 李四 英语,语文
10 马六 数学,物理,数学
8 王五 数学,英语,数学
实例3:
#对查询结果中使用函数作为字段的列进行求和或叠加
SELECT id,stuName,GROUP_CONCAT(course) FROM t_grade GROUP BY stuName WITH ROLLUP;
#执行结果
id stuName GROUP_CONCAT(course)
-- ----- --------------------------------------------------
6 李四 英语,语文
10 马六 数学,物理,数学
8 王五 数学,英语,数学
3 张三 英语,语文,语文
3 (NULL) 英语,语文,数学,物理,数学,数学,英语,数学,英语,语文,语文
13.limit 分页查询
select * from 表名 limit 初始位置,记录数;
二、使用聚合函数查询
1.count()函数
1,count()函数用来统计记录的条数;
2,与 group by 关键字一起使用;
实例:
SELECT id,stuName,GROUP_CONCAT(course),COUNT(course) FROM t_grade GROUP BY stuName;
#执行结果
id stuName GROUP_CONCAT(course) COUNT(course)
--- ------- -------------------- -------------
6 李四 英语,语文 2
10 马六 数学,物理,数学 3
8 王五 数学,英语,数学 3
3 张三 英语,语文,语文 3
2.sum()函数
1,sum()函数是求和函数;
2,与 group by关键字一起使用;
实例:
SELECT stuName,GROUP_CONCAT(course),GROUP_CONCAT(score),SUM(score) FROM t_grade GROUP BY stuName;
#执行结果
stuName GROUP_CONCAT(course) GROUP_CONCAT(score) SUM(score)
------- ------------------- ------------------ ----------
李四 英语,语文 80,79 159
马六 数学,物理,数学 60,54,95 209
王五 数学,英语,数学 81,89,90 260
张三 英语,语文,语文 87,77,91 255
3.avg()函数
1,avg()函数是求平均值的函数;
2,与 group by关键字一起使用;
实例:
SELECT stuName,GROUP_CONCAT(course),GROUP_CONCAT(score),AVG(score) FROM t_grade GROUP BY stuName;
#执行结果
stuName GROUP_CONCAT(course) GROUP_CONCAT(score) AVG(score)
------- ------------------- ------------------ ----------
李四 英语,语文 80,79 79.5000
马六 数学,物理,数学 60,54,95 69.6667
王五 数学,英语,数学 81,89,90 86.6667
张三 英语,语文,语文 87,77,91 85.0000
4.max()函数
1,max()函数是求最大值的函数;
2,与 group by关键字一起使用;
实例1:
SELECT stuName,GROUP_CONCAT(score),MAX(score) FROM t_grade GROUP BY stuName;
#执行结果
stuName GROUP_CONCAT(score) MAX(score)
------ ------------------ ------------
李四 80,79 80
马六 60,54,95 95
王五 81,89,90 90
张三 87,77,91 91
实例2:
SELECT stuName,MAX(score) FROM t_grade WHERE stuName="张三";
#执行结果
stuName MAX(score)
------- ----------
张三 91
5.min()函数
1,min()函数是求最小值的函数;
2,与 group by关键字一起使用;
实例1:
SELECT stuName,GROUP_CONCAT(score),MIN(score) FROM t_grade GROUP BY stuName;
#执行结果
stuName GROUP_CONCAT(score) MIN(score)
------ ------------------ ------------
李四 80,79 79
马六 60,54,95 54
王五 81,89,90 81
张三 87,77,91 77
实例2:
SELECT stuName,MIN(score) FROM t_grade WHERE stuName="张三";
#执行结果
stuName MIN(score)
------- ----------
张三 77
三、连接查询
连接查询是将两个或两个以上的表按照某个条件连接起来,从中选取需要的数据;
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
t_booktype表
id bookTypeName
-- --------------
1 计算机类
2 文学类
3 教育类
1.内连接查询
内连接查询是一种最常用的连接查询。内连接查询可以查询两个或者两个以上的表;(但有时会有某个表无法显示全部内容)
实例1:
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 教育类
实例2:
SELECT * FROM t_book,t_booktype WHERE t_book.bookTypeId = t_booktype.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 文学类
2.外连接查询(左/右连接)
外连接可以查出某一张表的所有信息;
SELECT 属性名列表 FROM 表名 1 LEFT|RIGHT JOIN 表名 2 ON 表名 1.属性名 1=表名 2.属性名 2;
//LEFT 第一张表显示全部内容,没有对应值的字段用null表示
//RIGHT 第二张表显示全部内容,没有对应值的字段用null表示
实例1:
SELECT * FROM t_book LEFT JOIN t_bookType ON t_book.bookTypeId=t_bookType.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 文学类
4 生理学(第二版) 24.00 刘先国 4 (NULL) (NULL)
四、子查询