数据查询是数据库的核心操做。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短语,则只有知足指定条件的组才予以输出。spa
若是有ORDER BY子句,则结果还要按<列名2>的值的升序或降序排序。code
SELECT语句既能够完成简单的单表查询,也能够完成复杂的链接查询和嵌套查询。blog
(1)查询指定列排序
查询全体学生的学号与姓名字符串
SELECT Sno,Sname FROM Student;
查询全体学生的姓名、学号、所在系数学
SELECT Sname,Sno,Sdept FROM Student;
(2)查询所有列it
查询全体学生的详细记录table
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;
(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 BETWEEN 20 AND 23
查询年龄在20~23岁之间的学生的姓名、系别和年龄
SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23
查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名、系别和年龄
SELECT Sname,Ssex FROM Student WHERE Sdept IN('CS','MA','IS');
查询学号为201215121的学生的详细状况
SELECT * FROM Student WHERE Sno LIKE '201215121' 等价于 SELECT * FROM Student WHERE Sno='201215121'
此处介绍下字符匹配
谓词LIKE能够用来进行字符串的匹配。其通常语法格式以下:
[NOT] LIKE'<匹配串>' [ESCAPE '<换码字符>']
其含义是查找指定的属性列值与<匹配串>相匹配的元组。<匹配串>能够是一个完整的字符串,也能够含有通配符 % 和 _ 。其中:
查询全部姓刘的学生的姓名、学号和性别
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;
用户能够用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子句。
将查询结果按某一列或多列的值分组,值相等的为一组。
求各个课程号及相应的选课人数
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数据查询中有关单表查询的程序,其中应格外注意