数据库学习笔记之数据查询(一)

数据库学习笔记之数据查询(一)

查询之前先添加几条数据叭~~
还是基于这个里面建的那三个表(Student、Course、SC)进行插入查询操作(数据都是书上的。。。)

为Student表添加数据:

INSERT INTO Student VALUES('1512101', '张用', '男', 19, '计算机系');
INSERT INTO Student VALUES('1512102', '刘晨', '男', 20, '计算机系');
INSERT INTO Student VALUES('1512103', '王敏', '女', 18, '计算机系');
INSERT INTO Student VALUES('1512104', '李小玲', '女', 19, '计算机系');
INSERT INTO Student VALUES('1521101', '张立', '男', 22, '信息系');
INSERT INTO Student VALUES('1521102', '吴宾', '女', 21, '信息系');
INSERT INTO Student VALUES('1521103', '张海', '男', 20, '信息系');
INSERT INTO Student VALUES('1531101', '钱小平', '女', 18, '数学系');
INSERT INTO Student VALUES('1531102', '王大力', '男', 19, '数学系');

添加完成后的表:
在这里插入图片描述

为Course表添加数据:

INSERT INTO Course VALUES('1', '数据库', '5', 4);
INSERT INTO Course VALUES('2', '数学', null, 2);
INSERT INTO Course VALUES('3', '信息系统', '1', 4);
INSERT INTO Course VALUES('4', '操作系统', '6', 3);
INSERT INTO Course VALUES('5', '数据结构', '7', 4);
INSERT INTO Course VALUES('6', '数据处理', null, 2);
INSERT INTO Course VALUES('7', 'C语言', '6', 4);

添加成功后:
在这里插入图片描述

为SC表添加数据:

INSERT INTO SC VALUES('1512101', 'c001', 90);
INSERT INTO SC VALUES('1512101', 'c002', 86);
INSERT INTO SC VALUES('1512101', 'c003', 92);
INSERT INTO SC VALUES('1512101', 'c005', 88);
INSERT INTO SC VALUES('1512101', 'c006', null);

INSERT INTO SC VALUES('1512102', 'c001', 76);
INSERT INTO SC VALUES('1512102', 'c002', 78);
INSERT INTO SC VALUES('1512102', 'c005', 66);

INSERT INTO SC VALUES('1512104', 'c002', 66);
INSERT INTO SC VALUES('1512104', 'c005', 78);
INSERT INTO SC VALUES('1512104', 'c008', 66);

INSERT INTO SC VALUES('1521102', 'c001', 82);
INSERT INTO SC VALUES('1521102', 'c005', 75);
INSERT INTO SC VALUES('1521102', 'c007', 92);
INSERT INTO SC VALUES('1521102', 'c009', 50);

INSERT INTO SC VALUES('1521103', 'c002', 68);
INSERT INTO SC VALUES('1521103', 'c006', null);
INSERT INTO SC VALUES('1521103', 'c007', null);
INSERT INTO SC VALUES('1521103', 'c008', 78);

INSERT INTO SC VALUES('1531101', 'c001', 80);
INSERT INTO SC VALUES('1531101', 'c005', 50);
INSERT INTO SC VALUES('1531101', 'c007', 45);

INSERT INTO SC VALUES('1531102', 'c001', 80);
INSERT INTO SC VALUES('1531102', 'c002', 75);
INSERT INTO SC VALUES('1531102', 'c005', 85);
INSERT INTO SC VALUES('1531102', 'c009', 88);

添加成功后(太长了就只截取一部分吧。。):
在这里插入图片描述
有数据以后就好查询辣~~

查询语句的基本格式:

SELECT <目标列名序列>
 FROM  <数据源>
 [WHERE <检索条件>]
 [GROUP BY <分组依据列>]
 [HAVING <组提取条件>]
 [ORDER BY <排序依据列>]

几个例子:
1、查询全体学生的学号和姓名
执行语句:

SELECT Sno, Sname FROM Student;

查询结果:
在这里插入图片描述
2、查询全部列:

SELECT * FROM Student

查询结果:
在这里插入图片描述
3、查询全体学生的姓名及其出生年份

SELECT Sname, 2020-Sage FROM Student

在这里插入图片描述
4、查询全体学生的姓名和出生年份,并在“出生年份” 列前加入一个新列,新列的每行数据均为“出生年份”常量值

SELECT Sname, '出生年份:',2020-Sage FROM Student

在这里插入图片描述
可以看见上面查找出来的有些列是没有名字的,那么怎么改变列的标题,即为列取一个别名呢。
语法:

列名 | 表达式 [AS] 列别名

或者

列别名 = 列名 | 表达式

例如上面的第1个例子:

SELECT Sname, 2020-Sage  '出生年份' FROM Student

在这里插入图片描述
需要注意的是,一旦在FROM子句中给某个表定义了别名,则在SQL语句中各个引用该表名的地方都应以别名代替

一些简单的查询
1、消除取值相同的行:
要去掉重复行,可用DISTINCT:

一般查询哪些学生选修了课程:

SELECT Sno FROM SC

在这里插入图片描述
有很多重复行
使用DISTINCT后:

SELECT DISTINCT Sno FROM SC

在这里插入图片描述
2、查询满足条件的元组:

查询条件谓词
比较运算符=, >, >=, <, <=, <>(或!=)
确定范围BETWEEN…AND,NOT BETWEEN…AND
确定集合IN, NOT IN
字符匹配LIKE, NOT LIKE
空值IS NULL, IS NOT NULL
逻辑谓词AND, OR

例子:
比较运算符
1、查询计算机系全体学生的姓名

SELECT Sname 
FROM Student
WHERE Sdept = '计算机系';

在这里插入图片描述
2、查询年龄在20岁以下的学生的姓名和年龄

SELECT Sname, Sage 
FROM Student 
WHERE Sage < 20

在这里插入图片描述
3、查询考试成绩有不及格的学生的学号

SELECT DISTINCT Sno 
FROM SC 
WHERE Grade < 60

在这里插入图片描述
确定范围:
1、查询年龄在20~23岁之间的学生的姓名、所在系和年龄

SELECT Sname, Sdept,Sage 
FROM Student 
WHERE Sage BETWEEN 20 AND 23

在这里插入图片描述
2、查询年龄不在20~23之间的学生姓名、所在系和年龄

SELECT Sname, Sdept,Sage 
FROM Student 
WHERE Sage NOT BETWEEN 20 AND 23

在这里插入图片描述
确定集合
1、查询信息系、数学系和计算机系学生的姓名和性别

SELECT Sname, Ssex 
FROM Student 
WHERE Sdept IN ('信息系', '数学系', '计算机系')

在这里插入图片描述
2、查询既不是信息系、数学系,也不是计算机系学生的姓名和性别

SELECT Sname, Ssex 
FROM Student 
WHERE Sdept NOT IN ('信息系', '数学系', '计算机系')

在这里插入图片描述
字符匹配
匹配串中可包含的四种通配符:

通配符说明
_匹配任意一个字符
%匹配0个或多个字符
[ ]匹配[ ]中的任意一个字符;对于连续字母的匹配,例如匹配[abcd],可简写为[a-d]
[ ^ ]不匹配[ ]中的任意一个字符

1、查询姓‘张’的学生的详细信息

SELECT * FROM Student WHERE Sname LIKE '张%'

在这里插入图片描述
2、查询学生表中姓‘张’、‘李’和‘刘’的学生的情况。

SELECT * FROM Student WHERE Sname LIKE '[张李刘]%'

在这里插入图片描述
3、查询名字中第2个字为‘小’或‘大’的学生的姓名和学号

SELECT Sname, Sno 
FROM Student 
WHERE Sname LIKE '_[小大]%';

在这里插入图片描述
4、查询所有不姓“王”也不姓“张”的学生姓名

SELECT Sname 
FROM Student 
WHERE Sname LIKE '[^王张]%'

在这里插入图片描述

涉及空值的查询
1、查询没有考试成绩的学生的学号和相应的课程号

SELECT Sno, Cno 
FROM SC 
WHERE Grade IS NULL

在这里插入图片描述
2、查询所有有考试成绩的学生的学号和相应的课程号

SELECT Sno, Cno 
FROM SC 
WHERE Grade IS NOT NULL

在这里插入图片描述
多重条件查询
1、查询计算机系年龄在20岁以下的学生姓名和年龄

SELECT Sname, Sage 
FROM Student 
WHERE Sdept = '计算机系' AND Sage < 20

在这里插入图片描述
2、查询计算机系和信息系年龄大于等于20岁的学生姓名、所在系和年龄

SELECT Sname, Sdept, Sage 
FROM Student 
WHERE (Sdept = '计算机系' OR Sdept = '信息系') AND Sage >= 20

在这里插入图片描述
对查询结果进行排序
排序子句:

ORDER BY <列名> [ASC | DESC] [, <列名>...]

1、将学生按年龄的升序排序

SELECT * FROM Student ORDER BY Sage

在这里插入图片描述
2、查询全体学生的信息,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列

SELECT * FROM Student ORDER BY Sdept, Sage DESC

在这里插入图片描述
一些聚集函数

聚集函数作用
COUNT ( * )统计表中元组个数
COUNT ( [DISTINCT] < 列名 > )统计本列列值个数
SUM ( < 列名 > )计算列值总和
AVG ( < 列名 > )计算列值平均值
MAX ( < 列名 > )求列值最大值
MIN ( < 列名 > )求列值最小值

例子
1、统计学生总人数

SELECT COUNT(*) FROM Student;

在这里插入图片描述
2、查询“1512101”学生的选课门数、已考试课程门数以及考试最高分、最低分和平均分

SELECT COUNT(*) 选课门数, 
COUNT(Grade) 考试门数, 
MAX(Grade) 最高分, 
MIN(Grade) 最低分, 
AVG(Grade) 平均分 
FROM SC 
WHERE Sno = '1512101'

在这里插入图片描述
注意:聚集函数不能出现在WHERE子句中

分组查询
一般形式:

[GROUP BY <分组条件>]
[HAVING <组过滤条件>]

例:
查询每个课程的选课人数和课程号

SELECT Cno 课程号, COUNT(Sno) 选课人数 
FROM SC 
GROUP BY Cno;

在这里插入图片描述
注意:
GROUP BY 子句中的分组依据列必须是表中存在的列名,不能使用AS子句指派的结果集列别名;
带有GROUP BY 子句的SELECT语句的查询列表中只能出现分组依据列或聚集函数,因为分组后每个组只返回一行结果

HAVING的使用
例:
1、查询修了3门以上课程的学生的学号和选课门数

SELECT Sno 学号, COUNT(*) 选课门数 
FROM SC 
GROUP BY Sno 
HAVING COUNT(*) > 3;

在这里插入图片描述
2、统计每个系的男生人数,只列出男生人数大于等于2的系

SELECT Sdept 系别, COUNT(*) 人数 
FROM Student 
WHERE Ssex = '男' 
GROUP BY Sdept 
HAVING COUNT(*) >= 2;

在这里插入图片描述
3、查询修课门数等于或大于4门的学生的平均成绩和选课门数

SELECT Sno, AVG(Grade) 平均成绩, COUNT(*) 修课门数 
FROM SC 
GROUP BY Sno 
HAVING COUNT(*) >= 4

在这里插入图片描述
WHERE 和 HAVING 的区别:
WHERE 在分组之前进行限定,如果不满足条件,则不参与分组;HAVING在分组之后进行限定,如果不满足结果,则不会被查询出来。此外,WHERE后不可以跟聚集函数,HAVING可以进行聚集函数的判断

这次总结的主要是单表查询
没了~~

  • 6
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值