SQL笔记——单表查询

建立三张表作为操作对象

学生表S

在这里插入图片描述
课程表C
在这里插入图片描述
课程表SC
在这里插入图片描述

查询语法

SELECT [ALL|DISTINCT] <目标列>[,<目标列>]...
FROM <表名>[,<表名>]...
[WHERE<条件表达式>]
[GROUP BY<列名>[HAVING<条件表达式>]]
[ORDER BY<列名>[ASC|DESC]];
S E L E C T \textcolor{red}{SELECT} SELECT:指定要输出的属性列
目标列的形式:

算术表达式,常量,函数,别名

查询实例

1.查询全体学生的姓名及其出生年份(表达式)

SELECT Sname 2022-Sage
FROM S;

2.查询全体学生的姓名,出生年份(常量+表达式),所在系的小写字符串(函数)

SELECT Sname,'Year of Birth:',2022-Sage,LOWER(Sdept)
FROM S;

3.使用列的别名

将步骤2中的输出列的字段修改为NAME ,BIRTH,BIRTHDAY,DEPARTMENT

SELECT Sname Name,'Year of Birth:' BIRTH,2013-Sage BIRTHDAY,LOWER(Sdept) AS DEPARTMENT
FROM S;

4.在结果中消除重复的值

查询了选修了课程的学生学号

SELECT DISTINCT Son
FROM SC;

F R O M \textcolor{red}{FROM} FROM:指定查询对象

W H E R E \textcolor{red}{WHERE} WHERE:指定查询条件
查询条件语法
比较[NOT] =,<,>,>=,<=,<>,!=,!>,!<
确定范围[NOT] BETWEEN…AND…
确定集和[NOT] IN
字符匹配[NOT] LIKE
空值IS NULL,IS NOT NULL
多重条件AND,OR
1.比较运算符

查询计算机系全体学生的信息

SELECT *
FROM S
WHERE Sdept='CS';

查询年龄不为20的学生信息

SELECT *
FROM S
WHERE Sage <> 20;
2.确定范围

查询年龄在[20,22]的学生信息

SELECT *
FROM S
WHERE Sage BETWEEN 20 AND 23;
3.确定集和

查询信息系(IS),数学系(MA),计算机科学系(CS)的学生的姓名和性别

SELECT Sname,Ssex
FROM S
WHERE Sdept IN('IS','MA','CS');

查询没有选信息系(IS),数学系(MA),计算机科学系(CS)的学生的姓名和性别

SELECT Sname,Ssex
FROM S
WHERE Sdept NOT IN ('IS','MA','CS');
4.字符串匹配
基本语法
[NOT] LIKE '<匹配模板>'[ESCAPE'<转义字符>'];
匹配模板

固定字符串或者含有 通配符 \textcolor{red}{通配符} 通配符的字符串

通配符

% 代表任意长度的字符串

_ 表示一个字符

转义字符

当要查询的字符串本身就含有%或者_时,需要用转义字符对其进行转义

比如/_

实例

查询所有姓刘的学生的信息

SELECT *
FROM S
WHERE Sname LIKE '刘%';

查询名字为两个字的学生信息

SELECT *
FROM S
WHERE Sname LIKE '__';

查询所有不姓刘的学生的信息

SELECT *
FROM S
WHERE Sname NOT LIKE '刘%';

使用转义符

查询课程DB_Design课程的学分

SELECT Ccredit
FROM C
WHERE Cname LIKE 'DB\_Design' ESCAPE '\';
5.空值

I S \textcolor{red}{IS} IS N U L L 不能用 = N U L L 代替 \textcolor{red}{NULL不能用 =NULL代替} NULL不能用=NULL代替

查询没有先导课程(Cpno)的课程

SELECT *
FROM C
WHERE Cpno IS NULL;
空值的运算

NULL和其他进行算术运算,结果为NULL;

NULL和其他进行比较运算,结果为UNKNOWN;

三值的逻辑运算表

X YX AND YX OR YNOT X
T TTTF
T UUTF
T FFTF
U TUTU
U UUUU
U FFUU
F TFTT
F UFUT
F FFFT
6.多重条件查询

A N D 的优先级高于 O R \textcolor{red}{AND的优先级高于OR} AND的优先级高于OR

查询年龄为20岁或者19岁的学生信息

SELECT *
FROM S
WHERE Sage=19 OR Sage =20;
聚集函数
计数
COUNT([DISTINCT|ALL]<列名>)
计算总和
SUM([DISTINCT|ALL]<列名>);
计算平均值
AVG([DISTINCT|ALL]<列名>);
计算最大值
MAX([DISTINCT|ALL]<列名>);
计算最小值
MIN([DISTINCT|ALL]<列名>);
G R O U P \textcolor{red}{GROUP} GROUP B Y \textcolor{red}{BY} BY:对查询结果按指定列的值分类,该属性列值相等的为一组
默认值作用

细化聚集函数的作用对象

未对查询结果分组,聚集函数作用于整个查询结果

对查询结果分组,聚集函数分别作用于每个组

使用GROUP BY后,SELECT字句的列名表中只能出现分组属性和聚集函数

实例

求各个课程号及相应的选课人数

SELECT Con ,COUNT(Son)
FROM SC
FROUP BY Con;
H A V I N G \textcolor{red}{HAVING} HAVING:筛选出指定条件的组
HAVING和WHERE的区别:

WHERE作用于基本表(原始数据),从中选择满足条件的元组

HAVING作用于中间结果

实例

查询有三门课程时90分以上的学生的学号及其90分以上的课程数

SELECT Son ,COUNT(*)
FROM SC
WHERE Grade>90
GROUP BY Son 
	HAVING COUNT(*)>3;
O R D E R \textcolor{red}{ORDER} ORDER B Y \textcolor{red}{BY} BY:对查询结果按指定列胜序排序或者降序排序

升序:ASC

降序:DESC

缺省值为升序(缺省值为默认值)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值