SQL 基础查询 关联查询

时间:2021-04-04 13:28:01

--SELECT用于指定要查询的列

--FROM子句指定从哪个表中查询

如果要查询所有列,可以在SELECT后面使用 * 号。

如果只查询特定的列,可以直接在SELECT后面指定列名,列名之间用逗号隔开。


使用别名:

在SQL语句中可以通过使用列的别名改变标题的显示样式,或者表示计算结果的含义。

使用语法是列的别名跟在列名后,中间可以加或不加一个"AS"关键字。

如果希望别名区分大小写字符,或者别名中包含字符或空格,则必须用双引号括起来。

SELECT empno AS id , ename "Name", sal*12 "Annual Salary" FROM emp;


WHERE子句

在select语句中,可以在where子句中使用比较操作符限制查询结果。

如果和数字比较,可以使用单引号引起,也可以不用。

如果和字符以及日期类型的数据比较,则必须用单引号引起。


使用>,<,>=,<=,!=,<>,=

使用AND , OR关键字

--在SQL操作中,如果希望返回的结果必须满足多个条件,应该使用AND逻辑操作符连接这些条件。

--在SQL操作中,如果希望返回的结果满足多个条件之一即可,应该使用OR逻辑操作符连接这些条件。


使用LIKE条件(模糊查询)

--比较操作符LIKE用来做模糊查询。

--当用户在执行查询时,不能完全确定某些信息的查询条件,或者只知道信息的一部分,可以借助LIKE来实现。

         LIKE需要借助两个通配符:

                    %:表示0到多个字符

                    _:标识单个字符

这两个通配符可以配合使用,构造灵活的匹配条件。

 -----查看名字第二个字母是A最后一个字母是N的??----------

select ename from emp where ename LIKE '_A%N';


IN  和  NOT IN

判断是否在列表中或不在列表中??

select ename,job from emp where job in ('MANAGER','CLERK');
SELECT * FROM EMP WHERE DEPTNO NOT IN(10,20);


IS NULL和 IS NOT NULL

--空值是一个比较特殊的值,比较的时候不能使用“=”号,必须使用IS NULL,否则不能得到正确的结果。

查询哪些职员的奖金数据为NULL?

SELECT ename,sal,comm FROM emp WHERE comm IS NULL;


使用ANY 和ALL 条件  (经常用于子查询)

--ALL ,ANY 不能单独使用,需要配合单行比较操作符>   >=   <    <=   一起使用

>ANY: 大于最小

<ANY: 小于最大

>ALL: 大于最大

<ALL: 小于最小

  

使用DISTINCT过滤重复:对结果集中指定字段值重复的记录进行去重。

---查询员工的部门编码?

select deptno from emp;

---查询员工的部门编码,去掉重复值?

select distinct deptno from emp;

---查询每个部门的职位,去掉重复值?(多字段去重,对字段值得组合进行去重)

select distinct deptno , job from emp;


排序

ORDER BY子句:

可以根据其后指定的字段对结果集按照该字段的值进行升序或者降序排列。

ASC: 升序,不写默认的就是升序

DESC: 降序

---查看公司的工资排名?

select ename,sal from emp order by sal desc;

ORDER BY按照多个字段排序:

首先按照第一个字段的排序方式对结果集进行排序,当第一个字段有重复值的时候才会按照第二个字段排序方式进行排序,以此类推。每个字段都可以单独指定排序方式。

select ename, deptno, sal from emp order by deptno desc ,sal asc;

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

SELECT ename , comm, from emp order by comm desc;


聚合函数:

聚合函数又叫多行函数,分组函数。聚合函数是对结果集某些字段的值进行统计的。

MAX , MIN    求给定字段的最大值与最小值。

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

select max(sal),min(sal) from emp;

AVG, SUM    求平均值和总和。

select avg(sal), sum(sal) from emp;

COUNT函数:

COUNT函数不是对给定的字段的值进行统计的,而是对给定字段不为NULL的记录数统计的。

实际上所有聚合函数都忽略NULL值统计。

select count(ename) from emp;

----通常查看表的记录数可以使用count(*)

select count(*) from emp;

----查看平均绩效?

select AVG(NVL(comm,0)) ,SUM(comm) from emp;


分组----- GROUP BY子句

可以将结果集按照其后指定的字段值相同的记录看做一组,然后配合聚合函数进行更细分的统计工作。

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

select avg(sal),deptno from emp group by deptno;

GROUP BY也可以根据多个字段分组,分组原则为这几个字段值都相同的记录看做一组。

----查看同部门同职位的平均工资?

select avg(sal),deptno,job from emp group by  deptno, job;

!!当select子句中含有聚合函数时,那么凡不在聚合函数中的其他单独字段都必须出现在GROUP BY子句中,反过来则不是必须的。


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

select avg(sal),deptno  from emp group by deptno having avg(sal)>2000;

where中不能使用聚合函数作为过滤条件,原因是过滤时机不对。

where是在数据库检索表中数据时,对数据逐条过滤以决定是否查询出该数据时使用的,所以where用来确定结果集的数据。

使用聚合函数的结果作为过滤条件,那么一定是数据从表中查询完毕(where在查询过程中发挥作用)得到结果集,并且分组完才进行聚合函数统计结果,得到后才可以对分组进行过滤,由此可见,这个过滤时机是在where之后进行的。                            

----查看平均工资高于2000的部门的最高工资和最低工资分别是多少?

select max(sal),min(sal),deptno from emp group by deptno having avg(sal)>2000;


查询语句的执行顺序

查询语句的执行顺序以下列子句次序:  //下面括号里的内容可以作答优化SQL的工作效率

1.from 子句:执行顺序为从后往前,从右往左   (数据量较少的表尽量放在后面)

2.where 子句:执行顺序为自下而上,从右到左(将能过滤掉最大数量记录的条件写在where子句的最右)

3.group by :执行顺序从左往右分组(最好在group by前使用where将不需要的记录在group by 之前过滤掉)

4.having子句: 消耗资源(尽量避免使用,having会在检索出所有记录之后才对结果集进行过滤,需要排序等操作)

5.select子句:少用*号,尽量取字段名称(oracle在解析的过程中,通过查询数据字典将*号依次转换成所有的列名,消耗时间)

6.order by子句: 执行顺序从左到右排序,消耗资源


关联查询是要添加连接条件,否则会产生笛卡尔积,笛卡尔积通常是一个无意义的结果集,它的记录是所有参与查询的表的记录数乘积的结果。避免出现,数据量大时极易出现内存溢出等现象。

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

查看在NEW YORK工作的员工?

select e.ename , d.deptno from emp e, dept d where e.deptno=d.deptno and d.loc='NEW YORK';

查看工资高于3000的员工的名字,工资,部门以及所在地?

select e.name, e.sal, e.deptno, d.dname, d.loc from emp e ,dept d where e.deptno=d.deptno and e.sal>3000;

查看SALES部门的员工名字以及部门的名字?

select e.ename, d.deptno from emp e join dept d on e.deptno=d.deptno where d.dname='SALES';


外连接

外连接除了会将满足连接条件的记录查询出来以外,还会将不满足连接条件的记录也查询出来。

外连接分为:

左外连接:以join左侧表作为驱动表(所有数据都会被查询出来),那么当该表中的某条记录不满足连接条件时来自右侧表中的字段全部显示为NULL。

自连接:当前表的一条记录可以对应当前表自己的多条记录。

自连接是为了解决同类型数据但是又存在上下级关系的树状结构数据时使用。

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

select  e.ename , m.ename from emp e, emp m where e.mgr=m.empno;

查看SMITH的上司在哪个城市工作?

select e.ename, m.ename, m.deptno, d.loc from emp e, emp m ,dept d 

    where e.mgr=m.empno and m.deptno=d.deptno and e.ename='SMITH';