Day53、表连接、合并结果集、组函数和分组、子查询、表操作(创建、删除、更新)、事务控制语句
来源:互联网 发布:webpack搭建php服务器 编辑:程序博客网 时间:2024/05/16 19:17
二、sq199中的表连接
内连接:
select字段
from表1 [inner]join 表2
on连接条件;
外连接:
左外连接:内连接的结果集+左表匹配不上的记录
select 字段
from表1 left [outer] join 表2
on连接条件;
右外连接:内连接的结果集+右表匹配不上的记录
select 字段
from表1 right [outer] join 表2
on连接条件;
全外连接:左外连接的结果集+左外连接的结果集-内连接的结果集
select 字段
from表1 full [outer] join 表2
on连接条件;
/*列出员工信息,包括id,.first_name和部门名称*/
selecte.id,e.first_name,d.name
froms_emp e join s_dept d
one.dept_id=d.id;
/*列出所有员工信息,包括id,.first_name和部门名称*/
selecte.id,e.first_name,d.name
froms_emp e left join s_dept d
one.dept_id=d.id;
或 select e.id,e.first_name,d.name
froms_dept d right join s_emp e
one.dept_id=d.id;
/*列出员工信息,包括id,.first_name和所有部门名称*/
selecte.id,e.first_name,d.name
froms_dept d right join s_emp e
one.dept_id=d.id;
或 select e.id,e.first_name,d.name
froms_dept d left join s_emp e
one.dept_id=d.id;
/*列出所有员工信息,包括id,.first_name和所有部门名称*/
selecte.id,e.first_name,d.name
froms_dept d full join s_emp e
one.dept_id=d.id;
三表查询(内连接)
select 字段
from 表1
join 表2 on 表1.字段=表2.字段
join 表3 on 表1(2).字段=表3.字段
三、合并结果集
union 合并两个结果集排重重复数据
union all 合并两个结果集不排重
select id from s_emp union
select id from s_dept;
select id from s_emp union all
select id from s_dept;
两个select语句查询的字段的类型和数量要匹配
四、组函数和分组
1、组函数
count:统计一组数据的行数 参数可以是任意类型 还可以用*
max:获取最大值 参数可以是任意类型
min:获取最小值 参数可以是任意类型
sum:获取和 参数只能是数字类型
avg:获取平均值 参数只能是数字类型
1)/*统计s_emp表中工资>1000的人数*/
Select count(salary) from s_emp wheresalary>1000;
/*统计当前用户下有多少张表*/
Select count(*) from user_tables;
/*统计s_emp表中的工资信息*/
Selectmax(salary),min(salary),sum(salary),avg(salary) from s_emp;
/*列出入职最早和最晚的员工信息*/
Select to_char(min(start_date),’yyyy-mm-dd’),to_char(max(start_date),’yyyy-mm--dd’)from s_emp;
2)组函数可以进行排重统计
distinct
select count(title) from s_emp; 25个
select count(distinct title) froms_emp; 8个
3)组函数对NULL的处理:忽略
select count(commission_pct) froms_emp; 5个
select avg(commission_pct) from s_emp; 13个
select id,count(id) from s_emp; 报错
2、分组
1)分组子句的语法
Group by 分组标准(字段或表达式)
2)按照部门分组,统计每个部门的人数
select dept_id,count(id) from s_emp
group by dept_id;
可以放到分组语句中的字段 要么是分组标准,
要么是用对应的组函数处理过的
/* 按照title分组,统计每个岗位的人数 */
select title,count(title) from s_emp
group by title;
/* 按照部门分组,统计每个部门的最高工资和平均工资 */
select dept_id,max(salary),avg(salary) from s_emp
group by dept_id;
3)按照部门分组,统计部门的平均工资,并筛选出平均工资大于1500的部门
Having 子句:分组后筛选出符合条件的组
select dept_id,avg(salary) avg_sal
froms_emp
where1=1
groupby dept_id
havingavg(salary)>1500
orderby avg_sal;
执行顺序:from where group by having select order by (from最先 order by 最后)
4)思考 : 按照部门和岗位分组,统计每个部门每个岗位的人数
select dept_id.title,count(id)
froms_emp
goupby dept_id,title
select d.name,count(e.id)
froms_emp e,s_dept d
wheree.dept_id=d.id(+)
goupby d.id,d.name
五、子查询
一条查询语句嵌套在另一条sql语句之内,执行的时候先执行内部的查询语句,把内部查询语句的结果作为外层sql语句的条件或者一部分
1、 Where子句
1) 子查询结果是单值 可以使用> 、=等运算符
/*列出和’Ben’职位相同的员工的信息*/
第一步:先查到‘Ben’的职位
select titlefrom s_emp where first_name=’Ben’;
-------查询结果’Warehouse Manager’
第二步:根据上一步的结果查询这一职位的员工
selectid,first_name,title from s_emp where tile=’Warehouse Manager’;
第三步:把上边两条语句结合起来
Selectid,first_name,titile form s_emp where title=
(select title from s_emp wherefirst_name=’Ben’);
2) 子查询的结果不是单值, 使用in(not in)这种符号
/*列出所有领导的信息*/
第一步:先查询出领导的编号
Select distinctmanager_id from s_emp;
查询结果 ---1,2,3,6,7,8,9,10,null
第二步:根据编号列出领导的first_name
Selectfirst_name from s_emp where id in(1,2,3,6,7,8,9,10,null);
第三步:把上面两条语句合并
Selectfirst_name from s_emp
where id in(Selectdistinct manager_id from s_emp);
/*列出所有普通员工的信息*/
Selectid,first_name from s_emp
Whereid not in(select distinct manager_id from s_emp where manager_id is not null);
2、 having子句
/*列出平均工资高于编号为42的部门的平均工资的部门*/
第一步:查询编号为42的部门的平均工资
select avg(salary) from s_emp where dept_id=42; ---1081.67
第二步:平均工资高于1081.67的部门
select dept_id,avg(salary)
from s_emp group by dept_id
havingavg(salary)>1081.67;
第三步:合并
selectdept_id,avg(salary)
from s_emp group by dept_id
having avg(salary)>(select avg(salary) from s_emp wheredept_id=42);
3、 from字句
一条select语句会产生一个临时的内存表,可以在临时的内存表的基础上进行进一步的查询
selectdept_id,avg_sal from
(select dept_id,avg(salary) avg_sal from s_emp group by dept_id)
where avg_sal>1500;
六、表操作
6.1、创建表和删除表(ddl 数据定义语句)
表名_姓名的缩写_座位号
表名_tzh_00
6.1.1 创建表的语法
Creat table 表名(
字段1 数据类型,
字段2 数据类型,
…..
字段n 数据类型
);
案例:创建一个员工表,包括员工的编号、姓名、入职日期
Creattable emp_tzh_00(
idnumber(3),
namevarchar2(20),
start_datedate
);
6.1.2 删除表
droptable 表名
droptable emp_tzh_00;
6.2、数据操作语句(dml)
6.2.1 insert
1)语法:
insert into 表名[(字段列表)] values(值列表);
2)写入全部数据
insert into emp_tzh_00(id,name,start_date)
values(1,’Tom’,’14-SEP-92’);
insert into emp_tzh_00(id,name,start_date)
values(2,’Jerry’,’20-AUG-91’);
3)写入部分数据(没有给值的字段必须是允许为null的)
insert into emp_tzh_00(id,name)
values(3,’Ben’);
或insert into emp_tzh_00(id,name)
values(4,’Mark’,null);
6.2.2 delete
deletefrom 表名 [where 条件]
deletefrom 表名; --- 删除表中全部数据
/*删除编号为4的记录*/
deletefrom emp_tzh_00 where id=4;
6.2.3 update:更新
update表名 set 字段=更新值[,字段=更新值,……] [where 条件];
/*更新id=3的员工的入职日期*/
updateemp_tzh_00 set start_date=’01-MAR-02’ where id=3;
commit;
updateemp_tzh_00 set id=4,name=’Ada’where id=3;
操作后查看表 select * from emp_tzh_00;
6.3、事务控制语句(TCL)
6.3.1 事务控制语句的含义
commit; ---提交事务
rollback; ---撤销没有提交的操作 只能撤销没有提交的操作,提交后就不能撤销
savepointa; ----保存点
6.3.2 事务的四大特性
1)原子性
一个事务是一个不可分割的整体
转账:
A ----- > B 转账2000
Updateaccount set balance =balance -2000 where id=A; a
Update accountset balance =balance +2000 where id=B; b
if a&&b
commit;
else
rollback;
要么一起成功,要么一起失败
2)隔离性
3)一致性
4)持久性
6.3.3 部分成功,部分失败
drop tableemp_tzh_00
/*用select 语句创建表*/
create tableemp_tzh_00 as
select id,first_name,salary from s_emp;
delete fromemp_tzh_00 where id=25;
savepoint a;
delete fromemp_tzh_00 where id=24;
savepoint b;
delete fromemp_tzh_00 where id=23;
savepoint c;
delete fromemp_tzh_00 where id=22;
select * fromemp_tzh__00;
rollback to b;
commit;
select * fromemp_tzh_00;
七、约束
对表中字段的值的限制
7.1约束的种类
1)主键约束 primary key
不允许重复
不允许为null
一个表中只能有一个主键
2)唯一约束 unique
不允许重复、
允许为null 可以有多个null
一个表中可以有多个唯一约束
3)检查约束 check(表达式)
例如:check(age>=15 and age<= 50)
4)非空约束 not null
字段的值不允许为null
5)外键约束 foreign key references
表之间的关系
外键的值必须来源于所对应的主表中主键的值或者为null
练习:
1、创建一张表,Student_xxx_NN
学号 数字 主键
姓名 字符串 非空
出生日期 日期
Creat table student_tzh_00(
stunonumber(4) primary key,
bamevarchar2(20) not kull,
birthdaydate
);
测试:
向表中写入三行数据(正确写入、学号重复的、姓名为NULL)
更新
删除
- Day53、表连接、合并结果集、组函数和分组、子查询、表操作(创建、删除、更新)、事务控制语句
- 文章标题多表查询:合并结果集,连接查询,子查询
- mysql常用基础操作语法(八)~~多表查询合并结果和内连接查询【命令行模式】
- all与any操作符和返回两个结果集和把一个结果集当表和查询结果创建表和同时更新几个字段
- 数据库SQL Server2012笔记(四)——多表查询、子查询、分页查询、用查询结果创建新表和外连接
- Oracle数据库的概念(权限、角色)以及各种操作(创建表空间、创建表、查询、更新、删除、插入)和常用函数
- oracle 连接查询,子查询,分组函数
- SQL语言多表查询、分组统计、子查询、数据表的更新操作、事务处理
- sql 分组查询和子查询语句
- sql 嵌套查询,并通过分组 和字段连接函数GROUP_CONCAT 查询出符合业务的结果集
- 数据记录的操作(insert,select,update,delete)函数和分组查询(group by),表连接(join on),嵌套查询(in)
- Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询
- Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询
- Oracle基础知识5----高级查询(分组查询、多表连接、子查询、案例)
- SQL语句聚合函数、分组、子查询及组合查询
- 表连接和分组数目查询
- 1.利用android提高的的insert,query,update,deleteAPI与execSql,rawQuery函数执行原生的插入,查询,更新,删除语句操作花费时间的对比结果
- 对象表+创建对象表+插入操作+查询操作+更新与删除操作
- HDOJ 1874 畅通工程续(最短路)
- CF 3D Least Cost Bracket Sequence
- NOIP算法总结——关于简单 线性动态规划
- C++动态内存操作
- 107. Binary Tree Level Order Traversal II (二叉树由底向上层次遍历)
- Day53、表连接、合并结果集、组函数和分组、子查询、表操作(创建、删除、更新)、事务控制语句
- OSG开源教程
- 欢迎使用CSDN-markdown编辑器
- C++与设计模式(2)--策略模式
- 110. Balanced Binary Tree (平衡二叉树判断)
- [struts2]严重: Dispatcher initialization failed java.lang.RuntimeException: java.lang.reflect.Invocati
- 浮雕效果一键工具
- CSS学习笔记:层叠和继承
- 重新学习C语言——比较两个数大小