(快速入门)sql语句中的select,在orclexe数据库,以及pl/sql中具体实现

本文运行的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,

1)>=, >这两运算符和rownum连用会使结果出不来

在这里插入图片描述

2)而<, <=可以直接使用,能出结果

在这里插入图片描述

3)如果要用>, >=这两,必须用select嵌套

在这里插入图片描述

(2)集合(union ,union all等)

在这里插入图片描述

在这里插入图片描述

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值