(三)数据查询语言(DQL)上(基本查询语句)

 

(1)语句格式      

                     

select后面接指定查询的列。

all,distinct,all显示全部查询结果,distinct对结果进行去重。

from 字句指查询的对象,比如表,试图,临时制造的关系。

where是查询的条件对结果进行限定。

group by对查询结果进行分组,分组依据为列名,取值相同的分到一组。

having 只跟在group后面,筛选出符合条件的组

order by 对查询结果按照指定列升序或者将序。

(2)select子句

select * from T;表示选择表T中的所有信息

select  tname,sal*0.95 from T;可以直接在后面用算数表达式得出数据

更名as可选,select ,from中都可以使用,如

select    tname,sal*0.05  as  tax,sal*0.95  as   income

from     T;

(3)from子句

①from后面有多个表时,是笛卡尔积不是自然连接。

where字句可以认为是连接条件。

--例:列出教授“哲学”课程的老师的教工号及姓名
 	select      T. tno , tname
		 from       T , TC , C
		   where     T.tno = TC.tno and    TC.cno = C.cno  and    cname = ‘哲学’;

②为了防止select后的内容混淆,from中常用到更名操作,利用这种方法我们可以把两个相同的表连接起来,如找爸爸的爸爸。这里sno在结果虚表中有两个所以要分清楚是哪一个。

select a.sno, sname
   from s as a, sc as b
   where a.sno=b.sno and cno=‘c1’

                                          

(4)查询语句执行顺序          

      每一步都会生成一个虚表,先执行from产生的虚表进入where进行条件筛选,然后进行分组,这里开始使用select中的别名(此时select初步完成,where中不能用别名),分完组之后生成的虚表进入having进行组的筛选此时分组使用聚合函数,最后order by进行组内排序(可以用别名),order by是最后进行的

(5)字符串操作

                                

匹配规则:

“%” 匹配零个或多个字符(匹配任意数量字符)

 “_” 匹配任意单个字符

Escape 定义转义字符,以去掉特殊字符的特定含义,使其被作为普通字符看待 如escape “\”,定义 \ 作为转义字符,则可用\%去匹配%,用\_去匹配_

示例:

select    *
       from     T
      where   tname  like  ‘张%’
--找到张姓老师的所有信息

(6)order by子句

示例:

按系名升序列出老师姓名,所在系名,同一系中老师按姓名降序排列
   select    dname,tname
      from     T,D
        where   T.dno = D.dno
  		  order by  dname  asc,tname  desc

 注意:①可以有多个排序规则,按照先后顺序,空值按最大处理。

(7)集合操作

集合并:union

集合交:intersect

集合差: except(minus)

提示   : 集合操作自动去除重复元组,如果要保留重复元组的话,必须用all关键词指明

示例:注意集合操作时两个子句操作产生的集合最好加括号,防止出错,结构也更加清晰。

--两个结果集合进行运算
查询选修了001或002号而没有选003号课程的学生号
(select     sno
	from      SC
   	where   cno= ‘001’  or  cno = ‘002 ‘)
except
	(select     sno
	    from      SC
   	    where     cno = ‘003’)

(8)聚集函数与分组

平均值:avg            最小值:min             最大值:max             总和:sum            记数:count

聚集函数返回的是一个关系,这个关系只有一个元组

查询学生总人数
SELECT count(*) FROM S;

注意:

①:count(*)和count(属性名)的区别,count(*)统计的是元组的个数,连空都会统计,count(属性名)不会统计空。

②:count(distinct 属性名)这种用法在count(*)中不允许,因为没有两条完全相同的记录。

③:除了count(*)其他聚集函数均忽略空。

依据group by列名相等进行分组,having是对组的选择。

注意:当出现group by后,select列名子句中只能出现分组属性或聚集函数。聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句。也就是说分好组之后只能选分组属性和聚集函数,只有分组属性和聚集函数是一一对应的。

解释:如下,如果select中出现 group by后面未出现的比如cno,那么一个sno可对应对个cno,结果出错不能一一对应,所以select 子句中不能出现未用来分组的属性列。

求某一类人的什么属性通常用分组。

                                         

--及格同学的平均成绩
select    sno,avg(score)
    from     SC
  	group by  sno
 	having  min(socre) >= 60

HAVING和WHERE同样是选择运算,HAVING的对象是分组,WHERE的对象是元组。

(8)空值(NULL)

                                          

不能是等于null(在判断中,在update赋值中可以等于null)。

null参与算术运算,算术表达式结果是null,参与比较运算算术表达式结果是FALSE

count(*)不会忽略空值,count(属性列)会忽略,其他的聚集函数均会忽略。

                     

(9)连接表达式(join on)

格式示例:

                                 

join为连接方式,有内外连接两种,两种连接完的表均有两个连接列。on后面为连接条件,用法类似于where。

①内连接(inner join)

                               

舍弃不匹配的元组,即不满足R.C=S.C的元组直接舍弃,注意连接完有两个C列。

②外连接(outer join)

外连接不但会返回匹配的行,还会返回不匹配的行。左外连接就是把左边的都保存了,右边缺失的补null。

---左外连接左外连接左边重要,右边不满足连接条件的用null补)

                                 

---右外连接(左边不满足条件的用null补)

---全外连接

                          

---非主体表                  

              

连接条件属性列加(*)或者(+),说明该表为非主体表,右边是非主体表则这个连接是左外连接,同理,左边是非主体表的话这个连接就是右外连接

发布了21 篇原创文章 · 获赞 4 · 访问量 6806

猜你喜欢

转载自blog.csdn.net/nailuoch/article/details/104312433