目录
1.最简单的查询
(1)查询指定列
(2)查询所有列
(3)查询计算列
(4)为列起别名
(5)使用DISTINCT关键字消除重复元组
2.查询满足条件的元组
(1) 比较大小
(2) 确定范围
(3) 确定集合
(4) 字符匹配
(5) 空值判断
(6) 组合条件
3.对查询结果排序
SQL用SELECT语句进行数据查询
SELECT语句的格式:
SELECT [DISTINCT] <目标列表达式>[,…n]
FROM <表名或视图名> [,…n ]
[WHERE <条件表达式> ]
[GROUP BY <列名1>[HAVING<列条件表达式> ] ]
[ORDER BY <列名2>[ASC | DESC] ]
SELECT语句的含义:
根据WHERE条件,从FROM指定的表中找出满足条件的元组,按目标列表达式,选出属性值,形成结果表。
1.最简单的查询
省略的一些可选成分,得最简单的查询命令:
SELECT [DISTINCT] <目标列表达式>[,…n ]
FROM <表名或视图名>
对一张表的某些列进行操作,功能为:
(1)查询指定列
(2)查询所有列
(3)查询计算列
(4)为列起别名
(5)使用DISTINCT关键字消除重复元组
(1)查询指定列
【例】查询全体学生的姓名、学号和电话号码。
SELECT 姓名, 学号, 移动电话
FROM 学生表
列的输出顺序可以与表中的列顺序不同。
(2)查询所有列
【例】查询全体学生的详细信息
SELECT *
FROM 学生表
用“*”表示查询表的所有列。
(3)查询计算列
也可以查询由常量、变量和函数构成的表达式
【例】将累计学分降低10%后显示出来
SELECT 姓名, 累计学分, 累计学分- 累计学分*0.1
FROM 学生表
查询结果为:
姓名 累计学分 (无列名)
王东 160 144
(4)为列起别名
目的:满足用户的习惯,为计算列起名。方法:
①<目标列表达式> [AS]<别名>
②<别名> =<目标列表达式>
【例】将每个学生的累计学分降低10%后显示出来,要求查询结果表的标题用英语或字母显示。
SELECT 姓名 AS name, 累计学分 Ogpa, Ngpa=累计学分- 累计学分*0.1
FROM 学生表
查询结果如下:
name Ogpa Ngpa
王东 160 144
当别名含有空格时要用单引号括起
(5)使用DISTINCT关键字消除重复元组
- 无DISTINCT时,结果中可能含重复行
- 有DISTINCT时,自动消除结果中的重复行
【例】查询每个院系有在读学生的专业。
SELECT DISTINCT 所在院系, 专业
FROM 学生表
查询结果如下:
所在院系 专业
信息学院 计算机
信息学院 信息管理
- 结果中无重复行
- DISTINCT应紧跟SELECT
2.查询满足条件的元组
通过在WHERE子句中指定查询条件来实现
WHERE子句常用的查询条件::
查询条件 | 运算符 | 备注 |
比较大小 | =, >, <,>=, <=, !>, !< | 双目运算 |
确定范围 | [NOT] BETWEEN AND | 三目运算 |
确定集合 | [NOT] IN | 双目运算 |
字符匹配 | [NOT] LIKE | 双目运算 |
空值判断 | IS [NOT] NULL | 单目运算 |
组合条件 | NOT,AND,OR,() | NOT是单目,其余是双目,括号用于改变运算优先级 |
通过在WHERE子句中指定查询条件来实现
WHERE子句常用的查询条件
: (1) 比较大小
(2) 确定范围
(3) 确定集合
(4) 字符匹配
(5) 空值判断
(6) 组合条件
(1) 比较大小
查询条件:
(比较运算符 ):=, >, <,>=,<= , !>, !<
和 :由常量、变量、函数构成的算术/字符串表达式
【例】查询来自杭州的所有学生。
SELECT *
FROM 学生表
WHERE 籍贯='杭州'
【例】查询累计学分在160分以下的学生姓名和累计学分。
SELECT 姓名, 累计学分
ROM 学生表
WHERE 累计学分<60
(2) 确定范围
查询条件: op1 [NOT] BETWEEN op2 AND op3
op1 、 op2、 op3:由常量、变量、函数构成的算术/字符串表达式。
【 例】查询累计学分不在150和159之间的学生姓名和累计学分。
SELECT 姓名, 累计学分
FROM 学生表
WHERE 累计学分 NOT BETWEEN 150 AND 159
【例】查询姓名在’陈’和’李’之间的学生学号和姓名。
SELECT 学号, 姓名
FROM 学生表
WHERE 姓名 BETWEEN '陈' AND '李'
由字符串定义的范围是根据字符内码的顺序确定的(一般按字典顺序 )
(3) 确定集合
查询条件: op1 [NOT] IN op2
op1 :由常量、变量、函数构成的算术/字符串表达式
op2:集合,表示为(e1, e2,…, en),其中e1, e2,…, en为集合的元素,它们可以是与op1同类型的常量、变量和函数构成的表达式。
含义:若op1(不)是集合op2的元素,则条件为真,否则为假。
【例】查询来自杭州、宁波或温州的学生学号和姓名。
SELECT Sno,Sname
FROM Student
WHERE Scity IN ('杭州','宁波','温州')
【例】查询学号后两位是“09”,或者等于学号前两位或中间两位的学生学号和姓名。
SELECT 学号, 姓名
FROM 学生表
WHERE SUBSTRING(学号,6,2) IN (‘09’,SUBSTRING(学号,2,2),SUBSTRING (学号,4,2))
SUBSTRING(s,p,c):取子串函数,返回字符串s中从第p个字符开始,长度为c的子串。
(4) 字符匹配
查询条件: s1 [NOT] LIKE s2 [ESCAPE ’’]
s1和s2是由常量、变量、函数构成的字符串表达式。
s1称为主字符串,s2称为模式字符串 。
模式字符串除了包含普通字符外,还包含下列特殊字符(称为通配符):
- % 匹配任意长度的字符串(长度可以为0)
- _ 匹配任意一个字符
- [c1c2,…cn] 匹配字符c1, c2, …, cn中的一个。当c1, c2, …, cn 连续时可简化为[c1-cn]
- [^c1c2…cn] 匹配除c1, c2, …, cn外的一个字符。当c1, c2, …, cn连续时可简化为[^c1-cn]
- 含义:若s1(不)与s2相匹配,则条件为真,否则为假。
【例】查询学号最后一位既不是“1”和“3”,也不是“9”的学生学号和姓名。
SELECT 学号, 姓名
FROM 学生表
WHERE 学号 LIKE '%[^139]'
ESCAPE短语: 使模式串中的某个通配符恢复原来的含义。
【例】查询课程名以“DB_”开头的课程信息。
SELECT *
FROM 课程表
WHERE 课名 LIKE 'DB\_%' ESCAPE '\'
(5) 空值判断
查询条件: exp IS [NOT] NULL
- exp 是由常量、变量、函数构成的表达式。
- 含义:exp的值(不)为空值,则条件为真,否则为假。
【例】查询没有成绩的学号和开课计划编号。
SELECT 学号, 开课号
FROM 选课表
WHERE 成绩 IS NUL
注意“IS”不能用“=”代替。
【例5-18】查询有成绩的学号和开课计划编号。
SELECT 学号, 开课号
FROM 选课表
WHERE 成绩 IS NOT NULL
注意“IS NOT”不能用“!=”或“<>”代替。
(6) 组合条件
查询条件: 用NOT、AND、OR和括号将多个逻辑表达式连接起来所得的复杂逻辑表达式 。
- 括号的优先级最高,NOT次之,AND再次之,OR的优先级最低。
【例】查询这样的男生,他的电话号码前3位是“130”,他来自杭州或者宁波,他既不主修电子商务专业,也不主修信息管理专业。
SELECT *
FROM 学生表
WHERE 性别 = ‘男’ AND SUBSTRING(移动电话, 1, 3) = ‘130’ AND ( 籍贯 = '杭州' OR 籍贯 = '宁波' ) AND NOT 专业 IN ('电子商务', '信息管理')
3.对查询结果排序
语法 : ORDER BY{<排序列>[ASC |DESC]}[,...n]
【例】 查询选修了开课计划编号为’010101’的课程的学生学号和成绩,查询结果按分数降序排列
SELECT Sno, Grade
FROM EnrollmentWHERE OnO ='010101
ORDER BY Grade DESC
可以用列在SELECT子中的顺序编号来指定排序列,上例的ORDER BY子可改为: ORDER BY 2 DESC
若需按SELECT子句中的计算列排序,则 ORDER BY子句可用三种方法来表示这个计算列:
1)列表达式;2)列顺序编号;3)列别名。
【例5-21】查询选修了开课计划编号为’010101’的课程的学生学号、成绩以及加了10分后的新成绩,查询结果按原成绩降序、按新成绩升序排列。
SELECT 学号, 成绩, 成绩+10 AS New成绩
FROM 选课表
WHERE 开课号 = '010101'
ORDER BY 成绩 DESC, 成绩+10
上例中的成绩+10也可改写为:New成绩或3。
也可按SELECT子句中没有出现的列排序,此时不能用顺序编号来表示排序列。