由于本人的水平有限,可能会有一些遗漏,希望大家能够进行补充。
5.聚合函数
在MySQL中主要提供以下几类聚合函数
1) 计数
语法:COUNT(column)
例1:计算学生的总人数
SELECT COUNT(*)
FROM student;
2) 计算总和
语法:SUM(column)
例1:计算选修课的总成绩
SELECT SUM(grade)
FROM grade;
3) 计算平均值
语法:AVG(column)
例1:计算计算机系学生选修1号课程的平均成绩
SELECT AVG(grade)
FROM grade
WHERE courseID='1' AND studentID IN(
SELECT studentID
FROM student
WHERE speciality='计算机'
);
4) 求最大值/最小值
语法:MAX(column)/MIN(column)
例1:求在选修课程中,计算机系学生成绩的最高分
SELECT MAX(grade)
FROM grade
WHERE studentID IN(
SELECT studentID
FROM student
WHERE speciality='计算机'
);
例2:求在选修课程中,计算机系学生成绩的最低分
SELECT MIN(grade)
FROM grade
WHERE studentID IN(
SELECT studentID
FROM student
WHERE speciality='计算机'
);
6.分组查询
使用分组查询技术可以将记录按属性分组,属性值相等的为一组。这样做的目的是为了细化统计函数的作用对象。
语法:GROUP BY
例1:统计每个院系的学生总人数
SELECT COUNT(*)
FROM student
GROUP BY speciality;
例2:查询每门课程的选修平均成绩及选课人数
SELECT courseID,AVG(grade) AS 平均成绩,COUNT(studentID) AS 选课人数
FROM grade
GROUP BY courseID;
例3:查询选修了1门以上课程的学生学号
SELECT studentID
FROM grade
GROUP BY studentID
HAVING COUNT(*)>1;
7.排序
使用ORDER BY子句可以按一个或多个属性列对数据进行排序。排序的方式有两种一种是升序,一种是降序,分别使用ASC(升序)和DESC(降序)来指定。
例1:查询所有学生信息,查询结果按学生所在系的系名升序排列,同一个系的按学生年龄降序
SELECT *
FROM student
ORDER BY speciality,birthday;
例2:查询选修了2号课程的学生学号及其成绩,并按分数降序输出
SELECT studentID,grade
FROM grade
WHERE courseId='2'
ORDER BY grade DESC;
8.连接查询
在实际查询中,我们往往需要通过查询多个表的数据来得到自己想要的结果,并且将结果仍以单独的列出现在结果集中,因此,这时就需要使用连接查询。连接查询分为交叉连接,内连接和外连接。
1) 交叉连接
交叉连接也称笛卡尔积,它返回两个表中所有数据行的全部组合,所得的结果集中的数据行数等于第一个表的数据行数乘以第二个表中的数据行数
语法:交叉连接使用关键字CROSS JOIN来创建,并且不带WHERE子句。
例: SELECT * FROM student CROSS JOIN course;
查询结果:
2) 内连接
内连接**(INNER JOIN)使用比较运算符(=,>,<,>=,<=,!=**)进行表与表之间某些列的比较操作,并列出与连接条件相匹配的数据行
例1:查询每个学生选修课程的情况
SELECT *
FROM student INNER JOIN grade
ON student.studentID = grade.studentID;
例2:查询每个学生选修课程成绩大于85分的学号,姓名,学科,课程号和成绩
SELECT student.studentID,studentName,speciality,courseID,grade
FROM student INNER JOIN grade
ON student.studentID = grade.studentID AND grade.grade > 85;
例3:查找课程不同成绩相同的学生的学号,课程号和成绩
SELECT X.studentID,X.courseID,X.grade,Y.studentID,Y.courseID,Y.grade
FROM grade X JOIN grade Y ON X.courseID != Y.courseID AND X.grade = Y.grade AND X.studentID > Y.studentID;
3) 外连接
左外连接(LEFT JOIN):查询结果中将包含左表中的所有数据和第二个连接表中满足条件的数据
右外连接(RIGHT JOIN):查询结果中将包含右表中的所有数据和第二个连接表中满足条件的数据
例1:查询所有学生选修课的情况,包括没有选修课程的同学
# 采用左外连接的方式
SELECT student.studentID,student.studentName,courseID,grade
FROM student LEFT JOIN grade
ON student.studentID = grade.studentID;
# 采用右外连接的方式
SELECT student.studentID,student.studentName,courseID,grade
FROM grade RIGHT JOIN student
ON student.studentID = grade.studentID;
9.嵌套查询(子查询)
嵌套查询,就是一个外层查询语句中包含有另一个内层查询,也就是一个查询语句的结果为另一个的查询条件。当查询语句比较复杂,不太容易理解或一个查询依赖另一个查询结果时就可以使用嵌套查询。
1) 带IN的嵌套查询
例1:查询与“曾星宇”在同一个院系学习的学生信息
# 在这个要查询的条件中我们可以将其查询分为两步
# 第一步:查询“曾星宇”所在的院系
SELECT speciality
FROM student
WHERE studentName='曾星宇'; # 查询结果为计算机系
# 第二步:查询所有计算机系的学生信息
SELECT *
FROM student
WHERE speciality='计算机';
# 第三步:这时我们就可以将第一步的查询结果嵌套第二步中
SELECT *
FROM student
WHERE speciality IN(
SELECT speciality
FROM student
WHERE studentName='曾星宇'
);
注:1.子查询必须用圆括号括起来。
2.子查询中不能使用ORDER BY子句。
3.包含IN和NOT IN的子查询只能返回一列数据。
例2:查询选修了课程名为”计算机操作系统“的学生学号和姓名
# 由于课程名在course表中学生学号和姓名在student表中,它们并不在一个表中,而且这两个表之间并没有联系, # 所以此时就需要借助第三张表grade表来将这两个表联系起来。因此这条查询语句实际上涉及到course、student # 和grade三个表。
# 第一步:首先在course表中查询到计算机操作系统所对应的课程号
SELECT courseID
FROM course
WHERE coursename='计算机操作系统'; # courseID=3
# 第二步:在grade表中查询选修了3号课程的学生学号
SELECT studentID
FROM grade
WHERE courseID='3'; studentID=(2,3)
# 第三步:在student表中根据学号查询学生的学生学号和姓名
SELECT studentID,studentName
FROM student
WHERE studentID IN(2,3);
# 第四步:将一二三步按倒序嵌套起来
SELECT studentID,studentName
FROM student
WHERE studentID IN(
SELECT studentID
FROM grade
WHERE courseID IN(
SELECT courseID
FROM course
WHERE coursename='计算机操作系统'
)
);
2) 带ANY或ALL的嵌套查询
>ANY | 大于子查询结果中某个值 |
>ALL | 大于子查询结果中所有值 |
<ANY | 小于子查询结果中某个值 |
<ALL | 小于子查询结果中所有值 |
>=ANY | 大于等于子查询结果中某个值 |
>=ALL | 大于等于子查询结果中所有值 |
<=ANY | 小于等于子查询结果中某个值 |
<=ALL | 小于等于子查询结果中所有值 |
=ANY | 等于子查询结果中某个值 |
例1:查询其它系中比计算机系所有学生年龄都大的学生姓名、年龄和所属院系
SELECT studentName,birthday,speciality
FROM student
WHERE YEAR(CURDATE())-YEAR(birthday)>ALL(
SELECT YEAR(CURDATE())-YEAR(birthday)
FROM student
WHERE speciality='计算机'
) AND speciality != '计算机';
3) 带EXITSTS的嵌套语句
EXITSTS代表存在的意思,带有EXITSTS的子查询不会返回任何数据,只产生逻辑真值“true”和逻辑假值“false“。使用EXITSTS存在量词后,若内层查询结果非空,则外层的WHERE语句返回真值,反之返回假值。
例1:查询所有选修了2号课程的学生姓名
SELECT studentName
FROM student
WHERE EXISTS(
SELECT *
FROM grade
WHERE studentID=student.studentID AND courseID='2'
);
例2:查询所有没有选修2号课程的学生姓名
SELECT studentName
FROM student
WHERE NOT EXISTS(
SELECT *
FROM grade
WHERE studentID=student.studentID AND courseID='2'
);
第一期地址
目前关于MySQL的基础操作已经更完,后面可能会写一些关于视图,索引,游标,触发器,存储过程等知识。