数据库SQL语言:关于数据查询的简单查询和多表查询

前提说明:
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 ‘女’

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值