NO.45 SQL(基础查询)、SQL(关联查询)

为方便测试,创建表emp和表dept。

表emp
表dept

列别名

当SELECT子句中一个字段是函数或者表达式,那么在结果集中该字段的名字就是这个函数或表达式,可读性差,为此可以为列提供一个别名,这样在结果集中会使用该别名作为该

字段的名字。应当养成一个好习惯,即:凡是表达式或函数都指定一个别名。

别名本身不区分大小写,若希望别名区分大小写或者别名中包含空格,那么需要使用双引号

将其括起来。

SELECT ename,sal+NVL(comm,0)"sal" FROM emp

OR,AND用于连接多个条件使用

OR的优先级低于AND,所以若希望提高OR的优先级,可以使用括号。

查看工资高于1000,并且职位是CLERK或者SALESMAN的员工?

SELECT ename,job,sal FROM emp WHEREsal>1000 AND (job='SALESMAN' OR job='CLERK')

LIKE用于模糊匹配字符串支持两个通配符:

%:0-多个字符(任意个字符)

_:单一的一个字符

查看名字第二个字母是A的员工?

SELECT ename,sal,deptno FROM emp WHEREename LIKE '_A%'

IN(list)和NOT IN(list)

判断在列表中和不在列表中

IN,NOT IN常被用在子查询上使用。

查看职位是CLERK和SALESMAN的员工?

SELECT ename,job,sal FROM emp WHERE jobIN('CLERK','SALESMAN')

BETWEEN...AND...

判断在一个区间范围内

查看工资在1500到3000之间的员工?

SELECT ename,sal FROM emp WHERE sal BETWEEN1500 AND 3000

查看工资在1000-3000之间,20和30号部门名字中含有A的员工?

SELECT ename,sal,deptno,job FROM emp WHEREsal BETWEEN 1000 AND 3000 AND deptno IN (20,30) AND ename LIKE '%A%'

ANY(list),ALL(list)

ANY,ALL是配合>,>=,<,<=使用的

>ANY(list):大于列表之一,大于最小

>ALL(list):大于列表所有,大于最大

ANY,ALL的列表中不会给定固定值,没有实际意义,它们通常配合子查询使用。

SELECT empno, ename, job, sal, deptno FROMemp WHERE sal>ANY(3500,4000,4500)

DISTINCT关键字

DISTINCT可以将结果集中指定字段值一样的记录去重。

查看公司有哪些职位?

SELECT DISTINCT job FROM emp

可以按照多字段去重,那么这些字段值的组合没有重复记录出现在结果集中。

SELECT DISTINCT deptno,job FROM emp

ORDER BY子句

ORDER BY用于对查询的结果集按照指定字段的值进行排序。

排序分为:升序(ASC),降序(DESC).默认为升序

ORDER BY子句必须定义在SELECT语句中的最后一个子句上。

查看公司中工资的排名?

SELECT ename,sal,job FROM emp ORDER BY salDESC

查看20号部门的工资排名?

SELECT ename,sal,deptno FROM emp WHEREdeptno=20 ORDER BY sal DESC

多字段排序时,ORDER BY是有排序的优先级的,首先按照第一个字段先进行排序,当该字段中有记录值重复时,再将这些记录按照第二个字段排序。依此类推。

SELECT ename,deptno,sal FROM emp ORDER BYdeptno DESC,sal DESC

若排序的字段中含有NULL值,NULL被认定为最大值。

SELECT ename,comm FROM emp ORDER BY comm


聚合函数

聚合函数又称为分组函数,多行函数。

聚合函数的作用是对结果集指定字段的值进行统计工作的。

MAX(),MIN(),SUM(),AVG()

求最大值,最小值,总和,平均值

还有一个是对记录数的统计COUNT()

查看公司的最高工资是多少?

SELECT MAX(sal) FROM emp

SELECT MAX(sal),MIN(sal),SUM(sal),AVG(sal) FROMemp

查看公司共多少人?

SELECT COUNT(ename) FROM emp

SELECT COUNT(*) FROM emp

SELECT COUNT(1) FROM emp

聚合函数忽略NULL值。

SELECT SUM(comm),AVG(comm) FROM emp

SELECT AVG(NVL(comm,0)) FROM emp

GROUP BY子句

GROUP BY子句可以将结果集按照给定的字段值一样的记录进行分组。配合聚合函数使用可以完成分组统计工作。

查看每个部门的平均工资?

SELECT AVG(sal),deptno FROM emp GROUP BYdeptno

当SELECT中含有聚合函数时,那么凡不在聚合函数中的单独字段,都需要出现在GROUP BY

子句中。

查看每种职位的最高工资与最低工资是多少?

SELECT MAX(sal),MIN(sal),job FROM emp GROUPBY job

GROUP BY按照多字段分组时,是将这些字段值组合一样的记录看做一组。

统计同部门同职位的员工的各多少人?

SELECT COUNT(*),deptno,job FROM emp GROUPBY deptno,job

查看部门的平均工资,前提是该部门的平均工资高于2000

SELECT AVG(sal),deptno FROM emp WHEREAVG(sal)>2000 GROUP BY deptno

上面的SQL语句会抛出异常,WHERE子句中是不能使用聚合函数做为过滤条件的,原因在于过滤的时机不对。

WHERE是伴随查询表中数据逐行进行过滤使用的,用来确定结果集中可以查询出的条目数。而聚合函数是建立在查询出来的数据基础上进行统计才能得到结果,所以使用聚合函数过滤应当是在WHERE之后进行的。

HAVING子句可以根据聚合函数进行过滤,并且是用来根据条件过滤GROUP BY的分组

HAVING不能单独出现,不定义GROUP BY子句不能单独出现HAVING子句。

查看部门的平均工资,前提是该部门的平均工资高于2000

SELECT AVG(sal),deptno FROM emp GROUP BYdeptno HAVING AVG(sal)>2000

查看平均工资高于2000的那些部门的最高工资是多少?

SELECT MAX(sal),deptno FROM emp GROUP BYdeptno HAVING AVG(sal)>2000


关联查询

关联查询的结果集中的字段来自多张表。这就需要在查询的时候联合多张表进行查询,根据给定的连接条件将表与表的数据建立对应关系,再分别从这些记录中提取要查询的字段来形成结果集中的每条记录。

查看每个员工的名字以及其所在部门的名字?

SELECT ename,dname FROM emp,dept WHEREemp.deptno=dept.deptno

当在关联查询中要查询的字段在这些表中都出现时,需要使用表名来明确字段所属表。可以为表名取一个别名来简化复杂度。

SELECT e.ename,e.deptno,d.dname FROM empe,dept d WHERE e.deptno=d.deptno

在进行关联查询时若有过滤要求,那么过滤条件必须与连接条件同时成立。

查看在NEW YORK工作的员工都有谁?

SELECT e.ename,e.deptno,d.dname,d.loc FROMemp e,dept d WHERE e.deptno=d.deptno AND d.loc='NEW YORK'

关联查询中不指定连接条件或者连接条件无效时,会产生笛卡尔积,这通常是一个无意义的结果集。

SELECT e.ename,d.dname FROM emp e, dept d

N表查询至少要有N-1个连接条件。

内连接

内连接也是用来完成关联查询的。采用JOIN...ON...的形式关联多表。

查看每个员工的名字以及其所在部门名称?

SELECT e.ename,d.dname FROM emp e,dept d WHEREe.deptno=d.deptno

内连接写法:

SELECT e.ename,d.dname FROM emp e JOIN deptd ON e.deptno = d.deptno

不满足关联条件的记录不会被查询出来。

外连接

外连接在关联查询中除了可以将满足连接条件的记录查询出来之外,还可以将不满足连接条

件的记录也列出来。

外连接分为:

左外连接(LEFT),右外连接(RIGHT),全外连接(FULL)

左外连接:以JOIN左侧表做为驱动表,该表记录都要查询出来,当某条记录不满足连接条件时,那么在结果集中该条记录来自JOIN右侧表的字段的值全部为NULL。

SELECT e.ename,e.job,e.sal,d.dname,d.loc FROMemp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno

SELECT e.ename,d.dnameFROM emp e,dept d WHERE

e.deptno(+)=d.deptno------右外连接

自连接

自连接指的是当前表的一条数据可以对应当前表自己的多条数据。

自连接是为了解决数据的属性相同,但是本身又存在上下级关系的树状结构数据。

查看每个员工以及其领导的名字?

SELECT e.ename,m.ename FROM emp e,emp m WHEREe.mgr=m.empno(+)

SELECT e.ename,m.ename FROM emp e LEFTOUTER JOIN emp m ON e.mgr=m.empno

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容