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查询语句,对应的关系代数表达式为:
在这里插入图片描述
比较运算符:
在这里插入图片描述逻辑运算符:
在这里插入图片描述

三、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
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值