欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SQL语言(二)数据库查询语言第一部分(SQL查询)

程序员文章站 2024-03-25 22:54:58
...

SQL查询的基本结构

SQL语言(二)数据库查询语言第一部分(SQL查询)

一、select子句

注意:

  1. SQL不允许在属性名称中使用字符-,例如,使用dept_name代替dept-name
  2. 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查询语句,对应的关系代数表达式为:
SQL语言(二)数据库查询语言第一部分(SQL查询)
比较运算符:
SQL语言(二)数据库查询语言第一部分(SQL查询)逻辑运算符:
SQL语言(二)数据库查询语言第一部分(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作用在关系上的unionintersectexcept运算对应于数学集合论中的 运算。
  • unionintersectexcept运算与select子句不同,它们会自动去除重复。
  • 如果想保留所有重复,必须用union allintersect allexcept 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提供了五个固有聚集函数:

  1. 平均值:avg
  2. 最小值:min
  3. 最大值:max
  4. 总和:sum
  5. 计数: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 的执行顺序

  1. 关键字的顺序是不能颠倒的:

    SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...
    
  2. SELECT 语句的执行顺序(在 MySQL 和 Oracle 中,SELECT 执行顺序基本相同):

    FROM > WHERE > GROUP BY > HAVING > SELECT的字段 > DISTINCT > ORDER BY > LIMIT
    
相关标签: 数据库