一、SQL数据查询的一般格式
数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,其一般格式为:
SELECT [ALL | DISTINCT][,]···
FROM[,···] | (SELECT语句>)[AS]
[WHERE]
[GROUP BY[HAVING]]
[ORDER BY[ASC | DESC]];
整个SELECT语句的含义是,根据WHERE子句的条件表达式从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标列表达式选出元组中的属性值形成结果表。
如果有GROUP BY子句,则将结果按的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。如果GROUP BY子句带HAVING短语,则只有满足指定条件的组才予以输出。
如果有ORDER BY子句,则结果还要按的值的升序或降序排序。
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子句常用的查询条件如下表所示查询条件谓词
比较=,>,=,<=,!=,<>,!>,!
确定范围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 '']
其含义是查找指定的属性列值与相匹配的元组。可以是一个完整的字符串,也可以含有通配符 % 和 _。其中:%(百分号)代表任意长度(长度可以为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;