目录

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) 比较大小

查询条件: op_{1} \Theta op_{2}

\Theta(比较运算符 ):=, >, <,>=,<= , !>, !<

op_{1} 和 op_{2}:由常量、变量、函数构成的算术/字符串表达式 

【例】查询来自杭州的所有学生。

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子句中没有出现的列排序,此时不能用顺序编号来表示排序列。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐