从0到1学会MySQL单表查询
作者:Dawn黎明开始
1.查询表中若干列
例如:查询全体学生的学号和姓名
select sno,sname from student;
(1)查询全部列
(例如:查询全体学生的信息)
方法一:在select关键字后面列出所有列名
代码如下👇🏻
select sno,sname,ssex,sage,sdept from student;
方法二:将<目标列表表达式>指定为*
代码如下👇🏻
select * from student;
(2)查询经过计算的值
select子句中的<目标列表达式>不仅可以为表中的属性列,也可以是表达式
例如:查询全体学生的姓名及其出生年份
代码如下👇🏻
select sname,2023-sage from student;
运行结果👇🏻
(3)使用列别名改变查询结果的列标题(AS可以省略)
代码如下👇🏻
SELECT Sname AS NAME,'Year of Birth:' AS BIRTH, 2014-Sage AS BIRTHDAY,LOWER(Sdept) AS DEPARTMENT FROM Student;
运行结果👇🏻
2.查询表中若干元组
(1)消除取值重复的行
如果没有指定DISTINCT关键字,则缺省为ALL
例如:(查询选修了课程的学生学号)
未指定DISTINCT关键字
代码如下👇🏻
SELECT sno FROM sc; /* SELECT ALL sno FROM sc; */
运行结果👇🏻
指定DISTINCT关键字
代码如下👇🏻
SELECT DISTINCT sno FROM sc;
运行结果👇🏻
(2)比较大小
例如:查询计算机科学系全体学生的名单
代码如下👇🏻
SELECT sname FROM student WHERE sdept='cs';
运行结果👇🏻
例如:所有年龄在20岁以下的学生姓名和年龄
代码如下👇🏻
SELECT sname,sage FROM student WHERE sage<20;
运行结果👇🏻
例如:查询考试成绩有不及格的学生的学号
代码如下👇🏻
SELECT DISTINCT sno FROM sc WHERE grade<60;
(3)确定范围
谓词:between and,not between and
例如:查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名,年龄
代码如下👇🏻
SELECT sname,sage FROM student WHERE sage BETWEEN 20 AND 23;
运行结果👇🏻
(4)确定集合
谓词: in<值表>,not in<值表>
代码如下👇🏻
SELECT sname ,ssex,sdept FROM student WHERE sdept IN ('CS','MA','IS');
运行结果👇🏻
(5)字符匹配
谓词:[not]like'<匹配串>'[ESCAPE'<换码字符>']
<匹配串>可以是一个完整的字符串,也可以含有通配符%和_
%(百分号)代表任意长度(长度可以为0)的字符串
例如:a%b表示以a开头,以b结尾的任意长度的字符串
_(下划线)代表任意单个字符
例如:a_b表示以a开头,以b结尾的长度为3的任意字符串
-----------------------------------
(1)匹配串含固定字符串
例如:查询学号为201215121的学生的详细情况
代码如下👇🏻
SELECT * FROM student WHERE sno='201215121';
运行结果👇🏻
(2)匹配串为含通配符的字符串
例如:查询所有姓刘学生的姓名,学号,性别
代码如下👇🏻
SELECT sname ,sno,ssex FROM student WHERE sname LIKE '刘%';
运行结果👇🏻
例如:查询姓"欧阳"且全名为三个汉字的学生的姓名
代码如下👇🏻
SELECT sname FROM student WHERE sname LIKE '欧阳_';
例如:查询名字中第二个字为"阳"字的学生的姓名和学号
代码如下👇🏻
SELECT sname,sno FROM student WHERE sname LIKE '_阳%';
例如:查询所有不姓刘的学生姓名,学号和性别
代码如下👇🏻
SELECT sname ,sno,ssex FROM student WHERE sname NOT LIKE '刘%';
(3)使用换码字符将通配符转义为普通字符
ESCAPE'/'表示"/"为换码字符
例如:查询DB_Design课程的课程号和学分
代码如下👇🏻
select cno,ccredit from course where cname like'DB/_Design'ESCAPE'/';
例如:查询以"DB_"开头,且倒数第3个字符为i的课程的详细情况
代码如下👇🏻
select * from course where cname like 'DB/_%i__'ESCAPE'/';
(6)涉及空值的查询
谓词: is null 或 is not null
注意:"is"不能用 "="代替
例如:某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩
查询缺少成绩的学生的学号和相应的课程号
代码如下👇🏻
select sno,cno from sc where grade is null;
3.ORDER BY子句
特点
可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为升序
对于空值,排序时显示的次序由具体系统实现来决定
例子
例1
(查询选修了3课程的学生的学号及其成绩,查询结果按分数降序排列)
SC表如下👇🏻
代码如下👇🏻
SELECT Sno,Grade FROM SC WHERE Cno='3' ORDER BY grade DESC;
运行结果👇🏻
例2
(查询全体学生情况,查询结果按所在系的系好升序排列,同一系中的学生按年龄降序排列)
Student表如下👇🏻
代码如下👇🏻
SELECT * FROM Student ORDER BY Sdept,Sage DESC;
运行结果👇🏻
4.聚焦函数
(1)统计元组个数
COUNT(*)
例如:(查询学生总人数)
代码如下👇🏻
SELECT COUNT(*) FROM student;
运行结果👇🏻
(2)统计一列中值的个数
COUNT([DISTINCT|ALL]<列名>)
例如:(查询选修了课程的学生人数)
代码如下👇🏻
SELECT COUNT(DISTINCT sno) FROM sc;
运行结果👇🏻
(3)计算一列值的总和(此列必须为数值型)
SUM([DISTINCT|ALL]<列名>)
例如:(查询学生201215012选修课程的总学分数)
代码如下👇🏻
SELECT SUM(Ccredit) FROM sc,course WHERE sno='201215012' AND sc.`Cno`=course.`Cno`;
(4)计算一列值的平均值(此列必须为数值型)
AVG([DISTINCT|ALL]<列名>)
例如:(查询选修1号课程的学生平均成绩)
代码如下👇🏻
SELECT AVG(Grade) FROM sc WHERE cno='1';
(5)求一列中的最大值和最小值
MAX([DISTINCT|ALL]<列名>)
例如:(查询选修1号课程的学生最高分数)
代码如下👇🏻
SELECT MAX(Grade) FROM sc WHERE cno='1';
MIN([DISTINCT|ALL]<列名>)
例如:(查询选修1号课程的学生最低分数)
代码如下👇🏻
SELECT MIN(Grade) FROM sc WHERE cno='1';
5.GROUP BY子句
特点
细化聚焦函数的作用对象
如果未查询结果分组,聚焦函数将作用于整个查询结果
对查询结果分组后,聚焦函数将分别作用于每个组
按指定的一列或多列值分组,值相等的为一组
代码如下👇🏻
SELECT sno, AVG(Grade) FROM sc GROUP BY sno
运行结果👇🏻
HAVING短语与WHERE子句的区别
(1)作用对象不同
(2)WHERE子句作用于基表或视图,从中选择满足条件的元组
(3)HAVING短语作用于组,从中选择满足条件的组
例如:(查询平均成绩大于等于85分的学生学号和平均成绩)
错误代码👇🏻:
SELECT sno, AVG(Grade) FROM sc WHERE AVG(grade)>=85 GROUP BY sno
正确代码如下👇🏻
SELECT sno, AVG(Grade) FROM sc GROUP BY sno HAVING AVG(grade)>=85
注意:WHERE子句中是不能用聚焦函数作为条件表达式
总结
到此这篇关于MySQL单表查询的文章就介绍到这了,更多相关MySQL单表查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!