SQL语法
DML(数据管理语言) 一、多表查询
1、基本概念
再之前使用的查询操作之中,都是从一张表中进行搜索,那么如果有一个查询语句需 显示多张表的数据,则就必须应用到多表查询操作,而多表查询操作的语法如下:
SELECT [DISTNCT] *|字段 [别名] [,字段 [别名]] FROM 表名称[别名][,表名称[别名],??] [WHERE 条件(s)]
[ORDER BY字段[ASC | DESC]][,字段[ASC | DESC]]; 这与之前的操作相差不多,仅是在指定查询的表的范围的时候增加了需要一起查询的表名称或者别名。
但是如果进行多表查询之前,必须先查询出几个数据——雇员表和部门表中的数据量,这个操作可以通过COUNT()函数来完成。这个函数会返回该表所含的记录数量。
SELECT COUNT(*) FROM emp ; SELECT COUNT(*) FROM dept ;
2、笛卡尔基
下面完成一个基本的多表查询:
SELECT * FROM emp,dept ;
执行完这个语句之后回显56行记录,但是emp表只有14条记录而dept表只有4条记录。实际上控制台回显的是14*4条记录,如图:
上述的问题则是数据库中的笛卡尔积即多张数据表的沉积的意思。
最简单的解决办法就是关联字段的形式,而emp表和dept表之间存在关联字段,可以从这个字段的判断开始。
1
此时,需要注意的是:再多表查询时,不同的表含有相同的字段名称的时候访问这些字段必须加上表名称即变成:表.字段。
SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno ; 此时的查询结果回显中已经不再会有笛卡尔积,但是这只是在显示的时候进行过滤,所以在数据量比较大的时候这种方法奇差无比。
同时,在开发中常使用别名来替代表名称:
SELECT * FROM emp e,dept d WHERE e.deptno=ddeptno ;
这样在表名称比较长的时候可以非常方便的进行操作。
3、基本方法(步骤)
范例:查询出以为雇员的编号、姓名、职位、部门名称、位置。
a) 确定所需要的数据仪表
|-emp表:可以查询出雇员的编号、姓名、职位 |-dept表:可以查询除部门的名称和位置
b) 确定数据表的关联字段:emp.deptno=dept.deptno ; SELECT e.empno,e.ename,e.job,d.dname,d.loc FROM emp e,dept d
WHERE e.deptno=d.deptno ;
范例:要求查询出每一位雇员的姓名、职位、领导的姓名
A)确定所需要的表:
|-emp表(雇员):取得雇员的姓名、职位、领导编号; |-emp表(领导):取得雇员的姓名(领导的姓名);
B)确定关联字段:emp.mgr=memp.empno (雇员的领导编号=领导(雇员的)的雇员编号)
第一步:查询每一位雇员的姓名和职位
SELECT e.ename,e.job
2
FROM emp e ;
第二步:查询领导信息,加入自身关联
SELECT e.ename,e.job,m.ename FROM emp e,emp m WHERE e.mgr=m.empno
范例:查询出每个雇员的编号、姓名、基本工资、职位、领导的姓名部门的名称及位置 SELECT e.empno,e.ename,e.sal,e.job,m.ename,d.dname LEADERNAME,d.loc LOCALTION
FROM emp e,emp m,dept d
WHERE d.deptno=e.deptno AND e.mgr=m.empno ;
范例:求出每一个雇员的编号、姓名、工资、部门名称、工资等级
SELECT e.empno,e.ename,e.sal,d.dname,s.grade FROM emp e,dept d,salgrade s
WHERE (e.deptno=d.deptno) AND (e.sal BETWEEN s.hisal)
s.losal
AND
;
3
4、左右连接
这是Oracle数据库独有的指的是查询判断条件的参考方向
a) (+)=:表示右链接 b) =(+):表示左连接 不用可以区分是左还是右,只需要根据查询结果而定,如果发现有些需要的数据没有显示出来就使用此符号改变连接方向。
二、SQL:1999语法
除了上述的表连接操作之外,在SQL语法之中,也提供了一套用于表连接的操作SQL,格式如下: SELECT table1.column,table2.column FROM table1 [CROSS JOIN table2] | [NATURAL JOIN table2] | [JOIN table2 USING(column name)] | [JOIN table2 ON(table1.column_name=table2.column_name)] | [LEFT|RIGHT|FULL.OUTER JOIN table2 ON(table.column_name=table2.column_name)] ; 以上实际上属于多个语法的联合,下面分块说明语法的使用。
1、交叉连接(CROSS JOIN):用于产生笛卡尔积
SELECT * FROM emp CROSS JOIN dept ;
笛卡尔积本身并不是属于无用的内容,在某些情况下还是需要应用的。
2、自然连接(NATURAL JOIN):自动找到匹配的关联字段,消除笛卡尔积
SELECT * FROM emp NATURAL JOIN dept ;
但是并不是所有的字段都是关联字段,设置关字段需要通过约定指定;
3、JOIN...USING子句:用户指定一个消除笛卡尔积的关联字段
SELECT * FROM emp JOIN dept USING(deptno) ;
4、JOIN...ON子句:用户指定一个可以消除笛卡尔积的关联条件
SELECT * FROM emp JOIN dept ON(emp.deptno=dept.deptno) ;
5、连接方向的改变:
|-左(外)连接:LEFT OUTER JOIN...ON ; |-右(外)连接:ROGHT OUTER JOIN...ON ; |-全(外)连接:FULL OUTER JOIN...ON ; —>把两张表中没有的数据都显示
SELECT * FROM emp RIGHT OUTER JOIN dept ON(emp.deptno=dept.deptno) ; *在Oracle之外的数据库,都是用以上的SQL:1999语法。
4
三、统计函数及分组查询(重点,难点)
1、统计函数
之前学过的一个COUNT()函数,实际上就是一个统计函数,常用的统计函数有:
|-COUNT():查询表中的数据记录; |-AVG():求出平均值; |-SUM():求和;
|-MAX():求出最大值 ; |-MIN():求出最小值;
范例:测试COUNT()、AVG()、SUM(),统计出公司所有的雇员,每个月支付的工资和平均工资:
SELECT COUNT(*) 公司人数,SUM(sal) 每月支付工资总数,AVG(sal) 平均工资数 ; 注意:COUNT()函数主要功能是进行数据的统计,但是一张表内如果没有记录,COUNT()函数依然还会返回数据,只是返回的数据是0.
SELECT COUNT (enname) FROM BONUS ;
如果使用其他的函数,则有可能返回null,但COUNT()肯定会返回一个具体的数值。
2、分组统计
当数据有重复的时候,分组才有意义。而如果想要分组,则需要使用GROUP BY子句来完成,此时的SQL语法如下:
SELECT [DISTNCT] *|分组字段1 [别名] [,分组字段2 [别名],...] | 统计函数 FROM 表名称[别名][,表名称[别名],??] [WHERE 条件(s)]
[GROUP BY 分组字段1[,分组字段2,...]]
[ORDER BY字段[ASC | DESC]][,字段[ASC | DESC]]; 范例:按照部门分组,求出每个部门的人数,平均工资
SELECT deptno,COUNT(deptno),AVG(sal) FROM emp
GROUP BY deptno ;
范例:按照只为分组求出每个职位的最高和最低工资。
SELECT job,COUNT(job),MIN(sal),MAX(sal) FROM emp
GROUP BY job ;
注意:一旦分组之后对语法产生了新的限制,对于分组也有以下要求:
|-分组函数可以在没有分组的时候单独使用,可是不能出现其他的查询字段; |-如果现在要进行分组的话,则SELECT子句之后,只能出现分组的字段和统计函数,其他字段不能出现
|-分组函数允许嵌套,但是嵌套之后的分组函数的查询之中,不能再出现任何其他字段。
范例:查询出每个部门的名称、部门的人数、平均工资。 ? 确定所需要的数据表:
|-dept表:每个部门的名称、位置;
|-emp表:统计出部门的人数、平均工资 ;
5
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Oracle11g学习笔记二在线全文阅读。
相关推荐: