Oracle-day4:分组查询(带条件)、DDL建表、约束、主从表

一、内容回顾

/*------------------内容回顾------------------------上周内容回顾--1、单表的基础查询--A、select * from emp;--B、列的运算 --数字类型运算 + - * /--函数运算 mod ceil floor round upper lower--C、取别名--列、表达书取别名--*表示所有的列和列同时存在时要写成:表名.*--D、表取别名 用表名的地方要用别名替换--E、条件筛选 where --比较运算符 > >= < <= <> !=--逻辑运算符 not > and > or--between A and B  相当于  >=A and <=B--日期的表示:date'日期格式字符串','两位天数-中文月份-4位年份',--to_date('日期格式字符串','yyyy-mm-dd')--日期的截取to_char(日期,'字符串') yyyy、mm、dd、yyyy-mm-dd--F、in和 not in--G、空值 is null、非空值 is not null--H、条件判断 case when语句--2、子查询查询要用圆括号括起来--A、单行值子查询    比较运算符来连接--B、多行值子查询    in或者not in 来连接--C、from子查询     用查询取替换表  with as语句、rownum--3、分组查询--A、聚合函数  count(*) sum() avg() max() min()--sum()非空求和 --avg() 非空求平均值--count(列名)非空计数*/

二、分组查询

/*----------------一、分组/聚合函数 ------------------分组函数只能从一组的值中计算出一个汇总的信息所以在以上给出的查询例题中,分组函数是将查询所获得满足条件的记录行为作为一组并返回一个统计值如果要想“对多个组分别进行统计汇总”例如:分别计算emp表中每个部门职工的最低工资、最高工资、平均和总工资、则是要在查询命令中使用到【 group by】子句进行分组查询,Oracle会把查询到的行分成多个组,对于每一个组返回一个汇总信息--------------分组查询的基本语法--------------------select 字段名from 表名[where 过滤条件][group by 字段];---------------group by:一致性:在包括 group by 子句的查询中,select子句后面的列名表中,除统计聚合函数以外,均应包含在:group by 子句中即:列名表中除聚合函数外中不能出现 group by 分组子句,不存在的列名,否则出错
*/-- 1、计算出公司支付给每个工种的总工资               
-- 1.1 
select job,sum(sal)
from emp
group by job -- 按照工种来分组
;-- 2、统计各部门的人数、工资总和、平均工资
select deptno,count(deptno),sum(sal),avg(sal) 
from emp
group by deptno
;-- 3、(多列分组)计算每个部门中每个工种各有多少职工数
select deptno,job,count(*),count(emptno)
from emp
group by deptno,job
;-- 3.1 带上排序,也是需要group by后面的列名
select deptno,job,count(*),count(empno)
from emp
group by deptno,job
order by deptno,job
;-- 4、查询员工工资最低为其部门最低工资的员工的编号和姓名及工资
-- 4,1 找出每个部门的最低工资
select deptno,min(sal) minssal
from emp
group by deptno
;-- 4.2 where 多行子查询
select *
from emp
where (deptno,sal) in(select deptno,min(sal) minssalfrom empgroup by deptno
)
;

三、带条件的分组查询

/*------------二、带条件的分组查询利用"group by"子句将选择到的进行分组时,可以使用 having子句用于限制选择的组(进一步筛选),having子句的作用同where子句相似,都是指定查询条件。不同的是where子句对行进行选择,检查每条记录是否满足条件,而having子句是检查 分组之后的各组 是否满足条件。having子句是配合group by子句使用,在没有"group by"子句时不能用,并且group by和having子句在命令中要出现在where子句之后。--------- 语法 ------------select 字段/表达式    from 表名 where 单条记录的过滤条件group by 字段having 分组函数的比较表达式 对group by 分组后的结果进一步筛选 having后面不能使用别名 不能单独使用order by 排序;------where 和 having 他们的区别是什么? -------
--1. 先筛选再分组,用使用where筛选,速度上更快
--2. where在group by 之前使用的,having是在group by之后使用的 
--3. where不能筛选聚合函数的结果,having可以
--4、当要求的条件是某个具体的单值条件(条件能在表中查询到)先用where条件筛选,如果是需要通过聚合函数计算得出--的条件,先要用group by分组,然后再用having筛选。   
*/
/*-----------注意事项--------
1、分组函数只能出现在select、having、order by 子句中
2、如果在select语句同时含有group by、having、orderby,那么他们的顺序是group by、having、order by
3、group by 有一个原则,就是 select 后面的所有字段(除聚合函数外),必须出现在 group by 后面,否则,有语法错误(重要)
4、有having 一定有group by,having筛选时不能使用该查询的别名            */-- 1、查询各工种组的年平均工资,要求每个工种组至少在3人以上(统计3人以上的工种的年平均工资)
-- 1.1 先分组 group by:年平均工资=平均工资*12
select job,avg(sal),avg(sal)*12 yearsal,count(empno),count(*)
from emp
group by job
;-- 1.2 在分组后进一步筛选:having + 聚合函数
select job,avg(sal),avg(sal)*12 yearsal,count(empno),count(*)
from emp
group by job
having count(empno) >= 3
;-- 2、查询出至少有两名秘书CLERK的所有部门的部门号和人数,并按人数降序排序。
-- 2.1 先找出所有工种是:CLERK的记录
select * from emp where job = 'CLERK';-- 2.2 对第一步结果进行分组
select deptno,count(*),count(empno)
from mep where job = 'CLERK'
group by deptno;-- 2.3 对第二部进行having筛选
select deptno,count(empno) c1,count(*) c2,count(1) c3
from emp
where job = 'CLERK'
group by deptno
having count(empno) >= 2 -- having子句内不能用别名
;-- 2.4 排序
select deptno,count(empno) c1,count(*) c2,count(1) c3
from emp
where job = 'CLERK'
group by deptno
having count(empno) >= 2 -- having子句内不能用别名
order by count(empno)
;-- 3、查询出所有经理和销售人员的年平均工资,并按年平均工资降序排序。
-- 3.1 先找出所有的经理和销售员 where
select * from emp where job = 'MANAGER' or job = 'SALESMAN';-- 3.2 对第一步的结果进行分组 group by
select job,avg(sal),avg(sal)*12 yearavg
from emp
where job in('MANAGER','SALESMAN')
group by job;-- 3.3 排序 -- 排序可以用别名和表达式的select job,avg(sal)*12 yearsal
from emp
where job in('MANAGER','SALESMAN')
group by job
order by yearsal desc
;

四、分组练习题

-- 三、分组强化练习题 ----1. 显示平均工资为>2000的职位
select job,avg(sal)
from emp
group by job
having avg(sal) > 2000
;--2. 计算工资在2000以上,职位平均工资大于3000的职位及平均工资
select job,avg(sal) 
from emp
where sal > 2000
group by job
having avg(sal) > 3000
;--3. 找每个部门的最高和最低的工资
select deptno,max(sal),min(sal)
from emp
group by deptno
;--4. 找每个部门中每种职位的最高和最低的工资
select deptno,job,max(sal),min(sal)
from emp
group by deptno,job
order by deptno,job
;   --5. 显示出工作名称(job)中包含"MAN"的平均工资,最高工资,最低工资及工资总和
select job,avg(sal),max(sal),min(sal)
from emp
where job like '%MAN%' -- 1、先找出包含MAN的记录
group by job
;--6. 显示出20号部门的员工人数
select count(empno)
from emp
where deptno = 20
;   --7. 显示出平均工资大于2000的部门名称(及平均工资)
-- dept表-- deptno 部门编号-- dname 部门名称-- loc 部门所在地
-- 7.1 先从emp表中查询到平均工资
select deptno,avg(sal) from emp
group by deptno having avg(sal) > 2000;-- 7.2 子查询筛选
select * from dept
where deptno in(select deptnofrom empgroup by deptno having avg(sal) > 2000
)
;--8. 显示每个部门每种工种平均工资大于2500的部门及工种
select deptno,job,avg(sal)
from emp
group by deptno,job
having avg(sal) > 2500
;--9. 显示出工种名称job中包含"MAN",并且平均工资大于1000的职位名称及平均工资
select job,avg(sal)
from emp
where job like '%MAN%'
group by job
having avg(sal) > 1000
;--10. 列出最低工资大于1500的各种工种
select deptno,min(sal)
from emp
group by deptno
having min(sal) > 1500
;

-----------------------------------------

一、DDL创建普通表

/*-- 1、创建一个新的表格create table 表名(列名1 数据类型 约束条件,列名2 数据类型 约束条件,...列名n 数据类型 约束条件);-- 1.1 常用的数据类型:number、varchar2、char、date
*/-- 1、创建一个表
create table user_info(user_name varchar2(30),user_sex char(3),height number(5,2),user_time date
);-- 2、PLSQL用菜单信息创建一个表
-- 导航栏table --> 右键 新建 -- > 创建表格窗口 输入表名
-- --> 列 选项页 -- 填入列名 数据类型 等
-- --> 点击 应用报存按钮 生成表 
select t.*,t.rowid from user_info t;

二、约束

/*二、约束条件--1、唯一约束 unique值不能重复,值唯一,但可以为空null--2、非空约束 not null值不能为空null,但是一个列的值的默认值是可以为空的--3、主键 primary key常用于唯一标识,一个表中只需要有一个主键key--4、检查约束 check检查值是否满足某个条件,属于表对象,必须要有名字--5、外键 references也属于表对象,必须要有名字 主从表--6、默认值 default当暮云给列指定一个值的时候,该列的值默认为default定义的值,若没有default指定默认值,则是null--7、添加注释-- 7.1 表注释comment on table 表名 is '注释内容'-- 7.2 列注释               comment on column 表名.字段 is '用户名'-- 7.3 删除其注释信息,只需要在 is后设置空字符串即可*/
-- 2.1 创建一个有约束的表
create table user_info3(user_id number(8) primary key, -- id 主键约束user_name varchar2(30) not null,  -- 非空约束user_sex char(3) default '男' check(user_sex='男' or user_sex = '女'), -- 默认值,检查约束height number(5,2) check(height>0), user_time date default sysdate -- 默认为系统时间
);-- 2.2 给info3的表添加注释信息
comment on table user_info3 is '用户信息表user_info3';-- 2.3 给列添加注释信息
comment on column user_info3.user_id is '用户编号';-- 2.4 删除表注释信息-- 2.5 数据字典表
select * from user_col_comments; -- 列的注释信息
select * from user_tab_comments; -- 表的注释信息
select * from user_tables; -- 表在系统中存储的信息

三、外键约束 主从表

/*三、外键约束 主从表作用:保持主从表的数据一致性
*/
-- 3.1 新建主表 班级表
create table class1(clsno varchar2(20) primary key,clsname varchar2(30) not null unique,bz varchar2(20)
);-- 3.2 新建从表 学生表
create table student1(sno varchar2(20) primary key,sname varchar2(30) not null,ssex char(3) default '男' check(ssex='男' or ssex='女'),sage number(3) check(sage>=6),bir date,clsno varchar2(20) references class1(clsno) -- 每个学生都有一个班级,外键连接的是主表的class1(clsno)列
);-- 3.3 往class1和student填数据
select c.*,c.rowid from class1 c;
select t.*,t.rowid from student1 t;

四、表练习


/*四、表练习
*/
-- 练习一、
-- 1、创建 student001表 学生表
create table student001(sno varchar2(3) not null primary key,sname varchar2(4) not null,ssex varchar(2) not null,sbirthday date,class varchar2(5) not null+2
);-- 2、创建course表
create table course001(cno varchar2(5) not null primary key,cname varchar2(10) not null,tno varchar(10) not null references student001(sno)
);-- 3、创建teacher教师表
create table teacher001(tnp varchar(10) primary key,tname varchar2(20)
);-- 4、创建 score表
create table score001(sno varchar2(3) not null references teacher001(tnp),cno varchar2(5) not null references course001(cno),degree number(10,1) not null
);-- 练习二
---主表:create table sxb0828(ssno char(6) primary key,stel number(7) not null check(stel between 6330000 and 6339999));---从表:create table stu0828(sno char(6) primary key,sname varchar2(30) not null,ssex char(3) check(ssex='男' or ssex='女'),sage number(3) check(sage >0),mz varchar2(30) default '汉族' not null ,cardid varchar2(18) not null unique,ssno char(6) not null references sxb0828(ssno) );--建表先建主表再建从表,删除表时先删除从表再删主表 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/57669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出SSD:固态存储核心技术、原理与实战(文末赠书)

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 内容简介 作者简介 使用Python做一个计算器 本期赠书 近年来国家大力支持半导体行业&#xff0…

MySQL----索引

一、索引的概念 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于c语言的链表通过指针指向数据记录的内存地址&#xff09;。使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找到该…

Mysql--技术文档--MVCC(Multi-Version Concurrency Control | 多版本并发控制)

MVCC到底是什么 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;是一种并发控制机制&#xff0c;用于解决并发访问数据库时的数据一致性和隔离性问题。MVCC允许多个事务同时读取数据库的同一数据&#xff0c;而不会相互干扰或导致冲突。 在传统的并发控制机制中…

基于Spring实现博客项目

访问地址:用户登录 代码获取:基于Spring实现博客项目: Spring项目写博客项目 一.项目开发 1.项目开发阶段 需求评审,需求分析项目设计(接口设计,DB设计等&#xff0c;比较大的需求,需要设计流程图&#xff0c;用例图,UML, model中的字段)开发&#xff0b;自测提测(提交测试…

DOM破坏绕过XSSfilter例题

目录 一、什么是DOM破坏 二、例题1 三、多层关系 1.Collection集合方式 2.标签关系 3.三层标签如何获取 四、例题2 五、例题3 1.代码审计 2.payload分析 一、什么是DOM破坏 DOM破坏&#xff08;DOM Clobbering&#xff09;指的是对网页上的DOM结构进行不当的修改&am…

Redis之GEO类型解读

目录 基本介绍 基本命令 geoadd 命令 geopos 命令 geodist 命令 georadius 命令 georadiusbymember 命令 geohash 命令 基本介绍 GEO 主要用于存储地理位置信息&#xff08;纬度、经度、名称&#xff09;添加到指定的key中。该功能在 Redis 3.2 版本新增。 GEO&…

C++炸弹小游戏

游戏效果 小人可以随便在一些元素&#xff08;如石头&#xff0c;岩浆&#xff0c;水&#xff0c;宝石等&#xff09;上跳跃&#xff0c;“地面”一直在上升&#xff0c;小人上升到顶部或者没有血的时候游戏结束&#xff08;初始20点血&#xff09;&#xff0c;小人可以随意放炸…

计算机网络MTU和MSS的区别

在计算机网络中&#xff0c;MTU代表最大传输单元&#xff08;Maximum Transmission Unit&#xff09;&#xff0c;而MSS代表最大分节大小&#xff08;Maximum Segment Size&#xff09;。 1.MTU&#xff08;最大传输单元&#xff09;&#xff1a; MTU是指在网络通信中&#x…

原神世界中的顺序表:派蒙的趣味数据结构讲解

派蒙&#xff0c;那个总是带着疑问眼神的小家伙&#xff0c;是原神世界中的小精灵。他总是充满好奇心&#xff0c;无论是对新的冒险者&#xff0c;还是对各种奇妙的现象。而他的另一个身份&#xff0c;则是原神世界中的数据结构大师。 一天&#xff0c;派蒙遇到了旅行者小森&a…

对开源自动化测试平台MeterSphere的使用感触

1&#xff1a;该平台可以通过接口&#xff0c;参数&#xff0c;配置的维护&#xff0c;然后继续接口自动化“一键测试”&#xff0c;功能还是挺强大的&#xff0c;具体的使用需要研究 MeterSphere的官网&#xff1a;MeterSphere - 专业测试云 2&#xff1a;一键测试在生产环境…

网络服务第二次作业

[rootlocalhost ~]# vim /etc/httpd/conf.d/vhosts.conf <Virtualhost 192.168.101.200:80> #虚拟主机IP及端口 DocumentRoot /www/openlab #网页文件存放目录 ServerName www.openlab.com #服务器域名 </VirtualHost> …

python实现/直播服务器/聊天服务器/的多种解决方案

python有哪些技术栈 实现直播服务器 在Python中&#xff0c;您可以使用以下技术栈来实现直播服务器&#xff1a; Flask&#xff1a;Flask是一个轻量级的Web框架&#xff0c;可用于构建直播服务器的后端。您可以使用Flask编写API端点来处理直播流的控制和管理。 Django&#xf…

两种数据库引擎和聚簇(非聚簇)索引

一&#xff1a;两种数据库引擎区别及如何选择&#xff1f; InnoDB和MyISAM的区别&#xff1f; 1&#xff1a;InnoDB支持事务&#xff0c;而MyISAM不支持事务。这是MYSQL将默认引擎从MYISAM变为INNODB的重要原因之一。 2&#xff1a;INNODB支持外键&#xff0c;而MYISAM不支持…

易云维®FMCS厂务系统创造工厂全新的“数字低碳智能”应用场景

近年来&#xff0c;新一代信息技术的高速发展为传统工业与制造业领域带来了新的机遇。信息技术加持下的制造技术发展出了新的生产方式、产业形态与管理模式。通过搭建FMCS厂务系统进行数字化转型来实现数据互联互通与业务高效协同&#xff0c;助力企业向安全、绿色、节能、高效…

上海港股通开通条件是什么?港股通交易佣金最低多少?

上海港股通权限开通条件有&#xff1a; 1、申请权限开通前20个交易日证券账户日均资产不低于50万元; 2、进行港股知识测试&#xff0c;且测试分数不低于80分; 3、风险承受能力等级需要匹配&#xff0c;无投资经验期限的门槛 港股通的股票范围是香港联合交易所恒生综合大型股…

MATLAB图论合集(二)计算最小生成树

今天来介绍第二部分&#xff0c;图论中非常重要的知识点——最小生成树。作为数据结构的理论知识&#xff0c;Prim算法和克鲁斯卡尔算法的思想此处博主不详细介绍&#xff0c;建议在阅读本帖前熟练掌握。 对于无向带权图&#xff0c;在MATLAB中可以直接以邻接矩阵的方式创建出来…

Flutter实现StackView

1.让界面之间可以嵌套且执行动画。 2.界面的添加遵循先进后出原则。 3.需要使用AnimateView&#xff0c;请看我上一篇博客。 演示&#xff1a; 代码&#xff1a; Stack: import package:flutter/cupertino.dart;///栈&#xff0c;先进后出 class KqWidgetStack {final Lis…

JVM知识点(一)

1、JVM基础概念 &#xff08;1&#xff09;JVM、JRE、JDK JRE&#xff1a;JVM基本类库组成的运行环境就是JRE。JVM自己是无法完成一次编译&#xff0c;处处运行的&#xff0c;需要有一个基本类库告诉JVM如何操作运行&#xff0c;如如何操作文件&#xff0c;连接网络等&#x…

JVM 给对象分配内存空间

指针碰撞空闲列表TLAB 为对象分配空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来。 指针碰撞&#xff1a;&#xff08;Bump The Pointer&#xff09; 堆的内存是绝对规整的&#xff0c;内存主要分为两部分&#xff0c;所有使用过的内存被放在一边&#x…

LeetCode每日一题:823. 带因子的二叉树(2023.8.29 C++)

目录 823. 带因子的二叉树 题目描述&#xff1a; 实现代码与解析&#xff1a; dp hash 原理思路&#xff1a; 823. 带因子的二叉树 题目描述&#xff1a; 给出一个含有不重复整数元素的数组 arr &#xff0c;每个整数 arr[i] 均大于 1。 用这些整数来构建二叉树&#x…