SQL数据查询之——单表查询
⼀、SQL数据查询的⼀般格式
数据查询是数据库的核⼼操作。SQL提供了SELECT语句进⾏数据查询,其⼀般格式为:
SELECT[ALL | DISTINCT]<⽬标列表达式>[,<⽬标列表达式>]···
FROM<;表名或视图名>[,<;表名或视图名>···]| (SELECT语句>)[AS]<;别名>
[WHERE<;条件表达式>]
[GROUP BY<;列名1>[HAVING<;条件表达式>]]
[ORDER BY<;列名2>[ASC | DESC]];
整个SELECT语句的含义是,根据WHERE⼦句的条件表达式从FROM⼦句指定的基本表、视图或派⽣表中出满⾜条件的元组,再按SELECT⼦句中的⽬标列表达式选出元组中的属性值形成结果表。
如果有GROUP BY⼦句,则将结果按<;列名1>的值进⾏分组,该属性列值相等的元组为⼀个组。通常会在每组中作⽤聚集函数。如果GROUP BY⼦句带HAVING短语,则只有满⾜指定条件的组才予以输出。
如果有ORDER BY⼦句,则结果还要按<;列名2>的值的升序或降序排序。
SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。
⼆、SQL单表查询(仅涉及⼀个表的查询)
1.选择表中的若⼲列
(1)查询指定列
查询全体学⽣的学号与姓名
SELECT Sno,Sname
FROM Student;
查询全体学⽣的姓名、学号、所在系
SELECT Sname,Sno,Sdept
FROM Student;
(2)查询全部列
查询全体学⽣的详细记录
SELECT*
FROM Students;
等价于
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
(3)查询经过计算的值
查询全体学⽣的姓名及其出⽣年份
SELECT Sname,2014-Sage //查询结果的第2列是⼀个算术表达式
FROM Student;
注意:⽤当时的年份(假设为2014年)减去学⽣的年龄,这样所得的即是学⽣的出⽣年份。
查询全体学⽣的姓名、出⽣年份和所在的院系,要求⽤⼩写字母表⽰系名
SELECT Sname,'Year of Birth:',2014-Sage,LOWER(Sdept)
FROM Student;
2.选择表中的若⼲组
(1)消除取值重复的⾏
查询选修了课程的学⽣学号
SELECT DISTINCT Sno
FROM SC;
(2)查询满⾜条件的元组
查询满⾜指定条件的元组可以通过WHERE⼦句实现。WHERE⼦句常⽤的查询条件如下表所⽰
查询条件谓词
⽐较=,>,<,>=,<=,!=,<>,!>,!<; NOT+上述⽐较运算符
确定范围BETWEEN AND,NOT BETWEEN AND
确定集合IN,NOT IN
字符匹配LIKE,NOT LIKE
空值IS NULL,IS NOT NULL
AND,OR,NOT
多重条件(逻辑运
算)
查询计算机科学系全体学⽣的名单
SELECT Sname
FROM Student
WHERE Sdept='CS'
查询所有年龄在20岁以下的学⽣姓名及其年龄
SELECT Sname,Sage
FROM Student
WHERE Sage<20;
查询考试成绩不合格的学⽣的学号
SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;
查询年龄在20~23岁之间的学⽣的姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN20AND23
查询年龄在20~23岁之间的学⽣的姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN20AND23
查询计算机科学系(CS)、数学系(MA)和信息系(IS)学⽣的姓名、系别和年龄
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');
查询学号为201215121的学⽣的详细情况
SELECT*
distinct查询FROM Student
WHERE Sno LIKE'201215121'
等价于
SELECT*
FROM Student
WHERE Sno='201215121'
此处介绍下字符匹配
谓词LIKE可以⽤来进⾏字符串的匹配。其⼀般语法格式如下:
[NOT]LIKE'<;匹配串>'[ESCAPE '<;换码字符>']
其含义是查指定的属性列值与<;匹配串>相匹配的元组。<;匹配串>可以是⼀个完整的字符串,也可以含有通配符 % 和 _ 。其中:%(百分号)代表任意长度(长度可以为0)的字符串。例如:a%b 表⽰以a开头,以b结尾的任意长度的字符串。如acb、addgb、ab等。
_(下划线)代表任意单个字符。例如:a_b表⽰以a开头,以b结尾的长度为3的任意字符串。如acb、agb等。
查询所有姓刘的学⽣的姓名、学号和性别
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE'刘%';
查询姓“欧阳”且全名为三个汉字的学⽣的姓名
SELECT Sname
FROM Student
WHERE Sname LIKE'欧阳_'
注意:数据库字集为ASCII时⼀个汉字需要两个_;当字符集为GBK时只需要⼀个。
查询名字中第⼆个字为“阳”的学⽣的姓名和学号
SELECT Sname,Sno,
FROM Student
WHERE Sname LIKE'_阳%';
查询所有不姓刘的学⽣的姓名、学号和性别
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE'刘%';
如果⽤户要查询的字符串本⾝就含有通配符%或_,这时就要使⽤ ESCAPE '<;换码字符>' 短语对通配符进⾏转义了。
查询DB_Design 课程的课程号和学分
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE'DB \ _Design'ESCAPE'\';
ESCAPE '\' 表⽰ “\” 为换码字符。这样匹配串中紧跟在 “\” 后⾯的字符“_”不再具有通配符的含义,转义为普通的“_”字符。
查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况
SELECT*
FROM Course
WHERE Cname LIKE'DB \_%i__'ESCAPE'\';
某些学⽣选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学⽣的学号和相应的课程号SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL; /*分数Grade是空值*/
注意:这⾥的“IS”不能⽤等号(=)代替。
查所有有成绩的学⽣学号和课程号
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
查询计算机科学系年龄在20岁以下的学⽣姓名
SELECT Sname
FROM Student
WHERE Sdept='CS'AND Sage<20;
3.ORDER BY ⼦句
⽤户可以⽤ORDER BY⼦句对查询结果按照⼀个或多个属性列的升序(ASC)或降序(DESC)排列,默认值为升序。查询选修了3号课程的学⽣的学号及其成绩,查询结果按分数的降序排列
SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;
查询全体学⽣情况,查询结果按所在系的系号升序排列,同⼀系中的学⽣按年龄降序排列
SELECT*
FROM Student
ORDER BY Sdept,Sage DESC;
4. 聚集函数
为了进⼀步⽅便⽤户,增强检索功能,SQL提供了许多聚集函数,主要有:
COUNT(*)统计元组个数
COUNT([DISTINCT|ALL]<;列
统计⼀列中值的个数
名>)
SUM([DISTINCT|ALL]<;列
计算⼀列值的总和(此列必须是数值型)
名>)
AVG([DISTINCT|ALL]<;列名>)计算⼀列值的平均值(此列必须是数值型)
MAX([DISTINCT|ALL]<;列名>)求⼀列值中的最⼤值
MIN([DISTINCT|ALL]<;列名>)求⼀列值中的最⼩值
如果指定 DISTINCT 短语,则表⽰在计算时要取消指定列中的重复值。
如果不指定 DISTINCT 短语或指定 ALL 短语(ALL为默认值),则表⽰不取消重复值。
查询学⽣总⼈数
SELECT COUNT(*)
FROM Student;
查询选修了课程的学⽣⼈数
SELECT COUNT(DISTINCT Sno)
FROM SC;
计算选修1号课程的学⽣平均成绩
SELECT AVG(Grade)
FROM SC
WHERE Cno='1';
查询选修1号课程的学⽣最⾼分数
SELECT MAX(Grade)
FROM SC
WHERE Cno='1';
查询学⽣201215012选修课程的总学分数
SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201215012'AND SC.Cno=Course.Cno;
注意:WHERE ⼦句中是不能⽤聚集函数作为条件表达式的。聚集函数只能⽤于SELECT⼦句和GROUP BY中的HAVING⼦句。
5.GROUP BY⼦句
将查询结果按某⼀列或多列的值分组,值相等的为⼀组。
求各个课程号及相应的选课⼈数
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
查询选修了三门以上课程的学⽣学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;
查询平均成绩⼤于等于90分的学⽣学号和平均成绩
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90(错误!)
GROUP BY Sno;
因为WHERE⼦句中是不能⽤聚集函数作为条件表达式的,正确的查询语句应该是:SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
HAVING AVG(Grade)>=90;
三、总结
此次整理了SQL数据查询中有关单表查询的程序,其中应格外注意
字符匹配中 % 和 _ 的区别。
ESCAPE 的换码操作。
聚集函数只能⽤于 SELECT⼦句和 GROUP BY⼦句中的 HAVING ⼦句。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论