前提说明:

Student (Sno, Sname, Age, sex, place )
 Study (Sno,Cno, grade)
 Course (Cno, Cname, Credit)

其中Student表中Sno为主键、Study表中Sno和Cno合起来做主键、Course表中Cno为主键。

一、简单查询

1、查询所有学生的学号、姓名、年龄。
 select sno,sname,age from student;
 或者
 π sno,sname,age(student);
 2、当查询的列是关系的所有属性时,可以使用*来表示所显示的列:
 select ***** from course;
 3、投影的同时给属性改名用as
 SELECT sno 学号, sname 姓名, 2018-age as 出生年份 FROM student ;
 4、SELECT子句的目标列中可以包含带有+、-、×、/的算术运算表达式,其运算对象为常量或元组的属性。
 查询所有学生的学号,姓名和出生年份
 SELECT sno, sname, 2018**-**age FROM student;SELECT sno 学号, sname 姓名, YEAR(CURRENT_DATE)-age as 出生年份 FROM student;
 5、查询列中含有字符串常量
 查询每门课程的课程名和学分
 SELECT cname, '学分‘,credit FROM course;
 6、当查询的结果只包含元表中的部分列时,结果中可能会出现重复列,使用DISTINCT保留字可以使重复列值只保留一个。
 SELECT DISTINCT place FROM student;
 7、查询列中含有集函数(或称聚合函数)
 COUNT() 统计查询结果中的元组个数
 COUNT(<列名>) 统计查询结果中一个列上值的个数
 MAX(<列名>) 计算查询结果中一个列上的最大值
 MIN(<列名>) 计算查询结果中一个列上的最小值
 SUM(<列名>) 计算查询结果中一个数值列上的总和
 AVG(<列名>) 计算查询结果中一个数值列上的平均值
 注:
 ① 除COUNT()外,其他集函数都会先去掉空值再计算。
 ② 在<列名>前加入DISTINCT保留字,会将查询结果的列去掉重复值再计算。
 例题:
 SELECT COUNT(*) FROM student ;
 统计学生表中的记录数。SELECT COUNT(place) FROM student;
 统计学生的籍贯(去掉空值)。SELECT COUNT(DISTINCT place) FROM student ;
 统计学生的籍贯种类数。SELECT AVG(grade)平均成绩, MAX(grade)最高分, MIN(grade) 最低分 FROM study;
 查询学生成绩的最高分、最低分、和平均成绩
 8、单表带条件查询
 查询籍贯是湖北的学生信息
 SELECT * FROM student WHERE place=’湖北’;查询选修了C01号课程且考试及格的学生学号和成绩
 SELECT sno, grade FROM study WHERE cno=’C01’ AND grade>=60;9、ANSI标准SQL允许WHERE子句中使用特殊的运算符
 IN、NOT IN 判断属性值是否在一个集合内
 BETWEEN…AND…、NOT BETWEEN…AND… 判断属性值是否在某个范围内
 IS NULL、IS NOT NULL 判断属性值是否为空
 LIKE、NOT LIKE 判断字符串是否匹配
 例题:
 查询籍贯为湖北和福建两地的学生信息
 SELECT *
 FROM student
 WHERE place in (‘湖北’,’福建’);
 或者
 SELECT *
 FROM student
 WHERE place =‘湖北’ or place=’福建’;从study表中查询考试成绩在85和95之间的学生学号
 SELECT sno,grade FROM study WHERE grade BETWEEN 85 AND 95;
 10、模式匹配
 <列名> LIKE / NOT LIKE <字符串常数>
 模式中的通配符:
 % 匹配任意子串
 _ (下划线)匹配任意一个字符
 例题:
 查询姓王的学生的学号、姓名、年龄
 SELECT sno, sname, age FROM student WHERE sname LIKE ‘王%’;模式举例:
 ‘Perry%’ :任何以Perry 开头的字符串
 ‘%Petty%’ :任何含有Perry 的字符串
 ‘_ _ ’ :只含有三个字符的字符串
 ‘ _ %’ :至少含有三个字符的字符串
 11、特殊字符串的匹配
 查询以’To’开头,后面紧跟任意个字符串 ,可增加***,使之转义
 SELECT sno, sname, age FROM student WHERE sname LIKE ‘To***_%’ ;搜索学生名称中含有**‘S** 的所有信息
 SELECT sno, sname, age FROM student WHERE sname LIKE ‘% ‘‘s%‘;如果% 或者_ 也是字符串的一部分
 查询以ab%ad’开头的字符串:Like ‘ ab**/%ad%’
 查询‘ab\ab’开头的字符串:Like ‘ab/**\ab%’12、输出排序
 ORDER BY <属性表> ,默认的排序次序是升序:ASC,降序需要使用关键字DESC
 SELECT sno,grade FROM study WHERE grade >= 85 AND grade <= 95 ORDER BY sno;
 13、分组查询
 GROUP BY子句把一个表按某一指定列(或一些列)上的值相等的原则分组,然后再对每组数据进行规定的操作。
 例题:
 查询每一门课程的平均得分
 SELECT cno, AVG(grade) FROM study GROUP BY cno;查询被3人以上选修的每一门课程的平均成绩、最高分、最低分
 SELECT cno, AVG(grade), MAX(grade), MIN(grade) FROM study GROUP BY cno HAVING COUNT(*)>=3;

二、多表查询

1、连接查询
 查询籍贯为湖北的学生的学号、选修的课程号和相应的考试成绩
 SELECT student.sno, cno, grade FROM student, study WHERE student.sno = study.sno AND place LIKE ‘%湖北%’;查询籍贯为湖北的学生的姓名、选修的课程名称和相应的考试成绩。
SELECT sname, cname, grade FROM student, study, course WHERE student.sno = study.sno AND study.cno=course.cno AND place LIKE ‘湖北’;
查询籍贯相同的两个学生基本信息
 SELECT A.* FROM student A, student B WHERE A.place = B.place and A.Sname<>B.Sname;
 2、并操作
 查询籍贯是湖北的学生以及姓张的学生基本信息
 SELECT * FROM student WHERE place LIKE ‘%湖北%’
UNION
 SELECT * FROM student WHERE Sname LIKE ‘张%’;
 等价于
 SELECT * FROM student WHERE place LIKE ‘%湖北%’ OR sname LIKE ‘张%’
 3、交操作
 查询年龄大于18岁姓张的学生的基本信息
 SELECT * FROM student WHERE age >18
INTERSECT
 SELECT * FROM student WHERE sname LIKE ‘张%’;
 等价于
 SELECT * FROM student WHERE age > 18 AND sname LIKE ‘张%’;
 4、差操作(MySQL不支持)
 查询年龄大于20岁的学生基本信息与女生的基本信息的差集
 SELECT * FROM student WHERE age >20
MINUS
 SELECT * FROM student WHERE sex LIKE ‘女’;
 等价于
 SELECT * FROM student WHERE age > 20 AND sex NOT LIKE ‘女’