SQL语言(二)数据库查询语言第一部分(SQL查询)
SQL查询的基本结构
一、select子句
注意:
- SQL不允许在属性名称中使用字符
-
,例如,使用dept_name
代替dept-name
。 - SQL不区分字母的大小写。因此,你可以使用大写字母或小写字母命名表、属性等。
SQL允许在关系以及SQL表达式结果中出现重复的元组
- 若要强行去除重复,可在select后加入关键词
distinct
。 - 例,查询instructor关系中的所有系名,并去除重复
select distinct dept_name from instructor;
- SQL也允许我们使用关键词all来显式指明不去除重复(SQL默认就是all)
星号*
在select子句中,可以用来表示“所有的属性”
select *
from instructor;
select子句还可带含有+
、-
、*
、/
运算符的算术表达式,运算对象可以是常数或元组的属性
select ID,name,salary *1.05
from instructor;
二、where子句
where子句允许我们只选出那些在from子句的结果关系中满足特定谓词的元组
例,找出所有在Computer Science系并且工资超过70 000美元的教师的姓名
select name
from instructor
where dept_name =‘Comp. Sci.’and salary > 70000;
上述SQL查询语句,对应的关系代数表达式为:
比较运算符:
逻辑运算符:
三、from子句
from子句是一个查询求值中需要访问的关系列表,通过from子句定义了一个在该子句中所列出关系上的笛卡尔积。
四、更名运算
SQL提供可为关系和属性重新命名的机制,即使用as子句:old-name as new-name
-
as子句
既可以出现在select子句中,也可以出现在from子句中。 - 使用在from中是为了引用简洁和区分关系(表名)。
五、字符串运算
对字符串进行的最通常的操作是使用操作符like
的模式匹配,使用两个特殊的字符来描述模式:
- 百分号(%):匹配任意子串
- 下划线(_):匹配任意一个字符
例,找出所在建筑名称中包含子串‘Watson’的所有系名
select dept_name
from department
where building like‘%Watson%’;
为使模式中能够包含特殊字符(即%和_),SQL允许定义转义字符。我们在like
比较运算中使用escape
关键词来定义转义字符。
例,使用反斜线(\)作为转义字符
- like ‘ab%cd%’ escape ‘\’ 匹配所有以“ab%cd”开头的字符串
- like ‘ab\cd%’ escape ‘\’ 匹配所有以“ab\cd”开头的字符串
六、排列元组的显示次序
order by子句
就可以让查询结果中元组按排列顺序显示。order by子句
默认使用升序。要说明排序顺序,我们可以用desc表示降序
,或者用asc表示升序
。
例,按salary的降序列出整个instructor关系,如果有几位教师的工资相同,就将他们按姓名升序排列
select *
from instructor
order by salary desc, name asc;
七、集合运算
- SQL作用在关系上的
union
、intersect
和except
运算对应于数学集合论中的交
并
减
运算。 -
union
、intersect
和except
运算与select子句不同,它们会自动去除重复。 - 如果想保留所有重复,必须用
union all
、intersect all
和except all
。
例1,找出在2009年秋季开课,或者在2010年春季开课或两个学习 都开课 的所有课程。
(select course_id
from section
where semester =‘Fall’and year = 2009)
union
(select course_id
from section
where semester =‘Spring’and year = 2010);
例2,找出在2009年秋季和2010年春季 同时 开课所有课程
(select course_id
from section
where semester =‘Fall’and year = 2009)
intersect
(select course_id
from section
where semester =‘Spring’and year = 2010);
例3,找出在2009年秋季开课,但不在 2010年春季开课的所有课程
select course_id
from section
where semester =‘Fall’and year = 2009)
except
(select course_id
from section
where semester =‘Spring’and year = 2010);
八、聚集函数
聚集函数是以值的一个集合(集或多重集)为输入,返回单个值。
SQL提供了五个固有聚集函数:
- 平均值:avg
- 最小值:min
- 最大值:max
- 总和:sum
- 计数:count
其中,sum和avg的输入必须是数字集,但其他运算符还可作用在非数字数据类型的集合上,如字符串。
例1,找出Computer Science系教师的平均工资
select avg (salary) as avg_salary
from instructor
where dept_name=‘Comp. Sci.’;
注意:
经过一个平均之后,就没有一个相应的属性名了,所以使用as
让它变得有意义。
除了上述的五个基本聚集函数外,还有分组聚集(group by)。 group by子句中给出的一个或多个属性是用来构造分组的,在group by子句中的所有属性上取值相同的元组将被分在一个组中。having子句
类似于where子句
,但其是对分组限定条件,而不是对元组限定条件。having子句中的谓词在形成分组后才起作用,因此可以使用聚集函数。
例2,找出每个系的平均工资
select dept_name avg (salary) as avg_salary
from instructor
group by dept_name ;
注意:
任何没有出现在group by子句中的属性,如果出现在select子句中的话,它只能出现在聚集函数内部,否则这样的查询就是错误的!
例3,找出教师平均工资超过42 000美元的系。
select dept_name avg (salary) as avg_salary
from instructor
group by dept_name
having avg(salary)>42000;
九、空值
SQL允许使用null值表示属性值信息缺失。我们在谓词中可以使用特殊的关键词null
测试空值,也可以使用is not null
测试非空值。
例,找出instructor关系中元组在属性salary上取空值的教师名。
select name
from instructor where salary is null;
空值的存在给聚集运算的处理也带来了麻烦。聚集函数根据以下原则处理空值:
- 除了count(*)外所有的聚集函数都忽略输入集合中的空值
- 规定:空集的count运算值为0,其他所有聚集运算在输入为空集的情况下返回一个空值
SELECT 的执行顺序
-
关键字的顺序是不能颠倒的:
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...
-
SELECT 语句的执行顺序(在 MySQL 和 Oracle 中,SELECT 执行顺序基本相同):
FROM > WHERE > GROUP BY > HAVING > SELECT的字段 > DISTINCT > ORDER BY > LIMIT
下一篇: VUE實現購物車數量編輯頁面小案例
推荐阅读
-
SQL语言(二)数据库查询语言第一部分(SQL查询)
-
数据库查询-编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary)
-
sql之多表查询 博客分类: sql SQLF#OracleD语言MySQL
-
精通SQL--结构化查询语言详解 pdf下载高清
-
SQL语言查询基础:连接查询 联合查询 代码
-
详解SQL中的DQL查询语言
-
详解SQL中的DQL查询语言
-
SQL语言查询基础:连接查询 联合查询 代码
-
数据库(SQL Server )经典例题(二):对S表、P表、J表、SPJ表的操作——单表查询
-
Oracle数据库学习之查询的嵌套、事务控制语言、集合操作符和SQL函数讲解