本文运行的sql文件
链接:https://pan.baidu.com/s/1xkpgbJSk4dDDfHJfzaWrIg?pwd=ea11
提取码:ea11
使用前请先导入,我在plsql安装分享的sql文件,具体使用看我之前安装plsql的教程
链接:https://pan.baidu.com/s/1Vj6UsfjNDWawp9ZoCplZAA?pwd=ea11
提取码:ea11
1.当查询两张表,不加条件,会发生什么
可能很多人以为就是可能就是两张表,上下拼接在一起,如下,但这不是实际运行的情况,实际上是两表的笛卡尔积
我们开始实践
1)左键拖选中语句,执行(点左上的绿色三角)
2)展开所有页
,但很明显只有16行啊,这只是第一页,第二页还剩4个没显示出来,
所以点这个向下的绿色箭头(展开所有页)
点开后,这里所有都在一页下了,可以通过滑动查看所有的数据
3)同理,按照以上步骤运行下一句
4)同时查看两个表,(记得展开所有页)
点下红色标记的
对照3)中的dep…表和2)中的emp表…,这个employee_id=100这一行(这个对象),本来只有1行变成了展示8行
后面的department_id正好8项,全部显示了一遍
2.select基础语句编写
****(1).sql执行select时,各关键词语句运行顺序
–SQL执行顺序
FROM —> WHERE —>GROUP BY —>( HAVING ) —>SELECT —>ORDER BY
SELECT e.department_id,max(e.salary),d.department_name
FROM employees e,departments d
WHERE e.department_id=d.department_id(+)
GROUP BY e.department_id,d.department_name
HAVING e.department_id=90
order by e.department_id
*************************************************************************************–sql书写顺序(可以看出基本顺序没变,只是把select弄到第一个罢了)
select —> from —> where —> group by —> having —> order by
(重点需要记住)
1).从FROM查表开始,选定要查的表
2).过滤语句where和having,where先执行,在第二步
3).group by分组
4).如果存在having就执行
5).select 查询到想要的部分数据项
6).对5中的数据项排序
****(2).where中语句编写
除了使用比较运算符 > , <, >=, <=, !=或者<> 这两个都是不等于,还有其他关键字,用法都比较简单
这里对字符串查询需要注意比如where dep…_id=‘ABC’,和where dep…_id='abc’两个是不同的过滤,
对于sql中的’abc’这样的字符串是区分大小写的,但是sql语句不区分大小写 比如select 还是Select或SELECT都是一样的
****(3).order by语句编写
这里多列排序需要说明一下,看图了解便可
****(4).起别名,对表和列起别名
起别名,记住sql关键词运行顺序,不可打乱顺序用,尤其是对列起别名,要注意起别名的位置,列别名只能在select中起,order by中才能使用
–SQL执行顺序
FROM=> WHERE =>GROUP BY=>( HAVING ) =>SELECT =>ORDER BY
这里在select中对avg(salary)起别名为sal,所以在order by使用是可以的
=>SELECT =>ORDER BY
错误示例
在select中起别名,怎么在group by中去使用了?
=>GROUP BY=>( HAVING ) =>SELECT =>ORDER BY
但对于from表起别名,就没有限制了,反正开始就执行,在这sql语句中,哪里想用表,用别名就完事了
****(5).group by 语句编写,组函数的应用场景
1).分组的过程演示
分组,说白了是把相同类型的行合并,形成新的一行
什么是相同类型,一列(属性)下的相同数据项
还是拿上图,人(行)和age(列),age=18(这就是相同类型),所对应的行合并,便是新的行,这种行为也叫分组
下图在select,和order中使用avg(salary),
有没有想过为啥要使用,
原因是order by job_id,分组后,我们又想要salary的数据,
显然在salary合并后,产生2000和3000两个数据,必须通过一种方式(组函数)
把这两数据,合成一个新数据再取出来
这是多列分组,无非是根据dep…id和job_id当成新的数据项,分组罢了,
比如dep…id=90,且job_id=AD_VP,这两数据项当做一数据项项,这个是前提
,如果前提满足,又存在多个,则把他们分成一组
2)组函数的应用
–SQL执行顺序
FROM —> WHERE —>GROUP BY —>( HAVING ) —>SELECT —>ORDER BY
说白了,where中不能用sum()这些组函数,
如果想在where中使用avg()这些求平均,最大/最小值等
可以使用子查询,说白了就是select嵌套
内层select返回一个由AVG(salary)的值,传入where
****(6). having语句编写
3.进阶查询-子查询
(1)单行子查询
什么是单行,就是内层select返回的值是一个时,比如此处avg(salary)=8775,
8775是一个数
举个例子,(员工部门)平均工资和(所有人)平均工资,
这里一看到----员工部门,立马想到分组,由于是先group(分组)后在
select中avg(salary)自然是,员工部门分组下的平均工资,
在having中进行最关键的比较–使用子查询
(2)多行子查询
内层select返回多个值
1)in ,any ,all
注意 in和any,all不能一起用,比如where in any(内层select)
2)exist
exist和is not null一样
4.现实中,实际常使用的select操作
(1)视图
为啥要用视图,因为在很多系统中,用户操作要和数据库隔离开,
一般只给用户受限的权利,比如只给用户提供查询权限
虽然说看起来是一张表,但实际上是虚拟表,和我们数据库表分开的,可以暂时存储,也可以长期储存在数据库中,右边的view中emp_view便是
删除视图,可以用sql语句,
也可以去右边找到 view-emp_view右键删除(图形界面删除),
只要自己喜欢合适就使用,
一般来说对于建表,删表,这种ddl(数据库操作语句),一般来说,图形化界面有的话,就去用,因为方便好使
但对于创建或更改表里数据,dml(数据操作语句),因为数据繁多,所以图形化不适合,用sql语句
(2)rownum行号,常用于分页 where row<10
此处的内层(select)返回的是一张表 ,它后面的e是对(内层返回的表)起别名
这里说一下,这两使用 where rownum>=5,