回顾:

1.单行函数

2.表连接

oracle中的表连接

内连接

等值连接

select e.id,e.first_name,d.name

from s_emp e,s_dept d

where e.dept_id = d.id;

select d.id,d.name dname,r.name rname

from s_dept d,s_region r

where d.region_id = r.id;

select e.id,e.first_name,r.name

from s_emp e,s_dept d,s_region r

where e.dept_id=d.id and d.region_id = r.id;

非等值连接

select e.id,e.first_name,e.salary,g.grade

from s_emp e,salgrade g

where e.salary between g.losal and g.hisal;

自连接

select distinct m.id,m.first_name

from s_emp e,s_emp m

where e.manager_id = m.id;

外连接

等值连接

select e.id,e.first_name,d.name

from s_emp e,s_dept d

where e.dept_id = d.id(+);

select d.id,d.name dname,r.name rname

from s_dept d,s_region r

where d.region_id = r.id(+);

非等值连接

select e.id,e.first_name,e.salary,g.grade

from s_emp e,salgrade g

where e.salary between g.losal(+) and g.hisal(+);

自连接

select m.id,m.first_name

from s_emp e,s_emp m

where e.manager_id(+) = m.id

and e.id is null;

  1. select d.id,d.name
  2. from s_emp e,s_dept d
  3. where e.dept_id(+) = d.id
  4. and e.id is null;

1.sql99标准中的表连接

内连接:

select 字段列表

from 表1 [inner] join 表2

on 关联条件;

  1. select e.id,e.first_name,d.name
  2. from s_emp e inner join s_dept d
  3. on e.dept_id = d.id;
  4. 三表连接:
  5. select 字段列表
  6. from 1 join 2 on 关联条件1
  7. join 3 on 关联条件2;
  8. select e.first_name,d.name,r.name
  9. from s_emp e join s_dept d on e.dept_id = d.id
  10. join s_region r on d.region_id = r.id;

外连接:

左外连接:内连接的结果集 + 左表匹配不上的数据

select 字段列表

from 左表 left [outer] join 右表

on 关联条件;

select e.id,e.first_name,d.name

from s_emp e left join s_dept d

on e.dept_id = d.id;

右外连接:内连接的结果集 + 右表匹配不上的数据

select 字段列表

from 左表 right [outer] join 右表

on 关联条件;

select e.id,e.first_name,d.name

from s_emp e right join s_dept d

on e.dept_id = d.id;

全外连接:内连接的结果集 + 两表匹配不上的数据

select 字段列表

from 左表 full [outer] join 右表

on 关联条件;

select e.id,e.first_name,d.name

from s_emp e full join s_dept d

on e.dept_id = d.id;

  1. select d.id,d.name
  2. from s_emp e right join s_dept d
  3. on e.dept_id = d.id
  4. where e.id is null;

2.集合运算(合并结果集)

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;

intersect: 取两个结果集的交集

select id from s_emp intersect

select id from s_dept;

minus: 第一个结果集 - 第二个结果集

select id from s_emp minus

select id from s_dept;

-- 两个结果集的字段列表的数量和数据类型必须匹配

select id,first_name from s_emp minus

select id,name from s_dept;

  1. select id,first_name from s_emp union
  2. select null,name from s_dept;
  1. 组函数和分组

    3.1 组函数

    1. 常用的组函数

      count(par|) : 统计一组数据的行数

      参数可以是任何类型 还可以是


      -- 统计工资高于1500的员工数

      select count(*) from s_emp where salary>1500;

      max(par) : 统计一组数据中的最大值

      min(par):统计一组数据中的最小值

      参数可以是数字、字符串、日期类型

      -- 列出最早和最晚入职的员工

      select max(to_char(start_date,'yyyy-mm-dd')),

      min(to_char(start_date,'yyyy-mm-dd'))

      from s_emp;

      sum(par) : 统计一组数据的和

      avg(par) : 统计一组数据的平均值

      参数是数字类型

      -- 列出销售部的总工资和平均工资

      select sum(salary),avg(salary)

      from s_emp e,s_dept d

      where e.dept_id = d.id and d.name='Sales';

    2. 组函数对null的处理: 忽略

      select count(commission_pct) from s_emp;

    3. 组函数 可以排重

      select sum(salary),sum(distinct salary) from s_emp;

      select count(salary),count(distinct salary) from s_emp;

3.2 分组

3.2.1 语法

group by 分组标准

  1. .....
  2. where ....
  3. group by ...
  4. ...
  5. select
  6. order by
  7. 3.2.2 分组统计每个部门的人数
  8. select dept_id,count(*) cnt
  9. from s_emp
  10. group by dept_id;
  11. /* 分组语句中列出的字段必须是分组标准
  12. 或者是组函数的参数*/
  13. select id,dept_id,count(*) cnt
  14. from s_emp
  15. group by dept_id; -- 错误
  16. 3.2.2 多列分组
  17. 分组统计每个部门的人数,显式部门的名称和人数
  18. select e.dept_id,d.name,count(e.id) cnt
  19. from s_emp e join s_dept d on e.dept_id = d.id
  20. group by e.dept_id,d.name;
  21. 分组统计每个部门的人数,列出人数超过2个的部门
  22. select dept_id,count(*) cnt
  23. from s_emp
  24. -- 错误:where子句中不能使用组函数
  25. -- where count(*)>2
  26. group by dept_id;
  27. 3.2.3 having子句
  28. 分组后,根据条件筛选出符合条件的组
  29. select dept_id,count(*) cnt
  30. from s_emp
  31. where 1=1
  32. group by dept_id
  33. having count(*)>2
  34. order by cnt;
  35. -- 语法顺序
  36. select 字段列表
  37. from 表名
  38. where 条件 -- 从表中根据条件筛选符合条件的行
  39. group by 分组标准 -- 根据分组标准分成多个组
  40. having 条件 -- 从分组结果中根据条件筛选符合条件的组
  41. order by 排序标准 排序方式;
  42. -- 执行顺序
  43. from
  44. where
  45. group by
  46. having
  47. select
  48. order by

-- 练习:列出平均工资大于1000 的部门的信息

select dept_id,avg(salary) avgsal

from s_emp

group by dept_id

having avg(salary)>1000;

  1. select d.id,d.name,avg(e.salary) avgsal
  2. from s_emp e,s_dept d
  3. where e.dept_id = d.id
  4. group by d.id,d.name
  5. having avg(e.salary)>1000
  6. order by avgsal;
  1. 子查询

    子查询指的是把一条select语句嵌入到另一条sql语句中

    执行时,先执行嵌入的子查询,然后再执行外层的sql语句

    4.1 where子句

    1. 单行单列的子查询

      -- 列出工资比'Ben'高的员工的信息

      a. 列出'Ben'的工资

      select salary from s_emp where first_name='Ben';

      -- 1100

      b. 列出工资高于'Ben'的员工的信息

      select id,first_name,salary from s_emp

      where salary>1100;

      c. 合并

      select id,first_name,salary from s_emp

      where salary>(

      select salary from s_emp where first_name='Ben'

      );
    2. 多行单列的结果集

      子查询的结果集为多值时,不能使用比较运算符

      需要使用处理多值的运算值,比如in、not in、any、all等

      (any、all要和比较运算符配合使用:>any、<all)

      -- 使用子查询列出所有的领导的信息

      a) 列出领导的编号

      select distinct manager_id from s_emp;

      -- null,1,2,3,6,7,8,9,10

      b) 根据编号,列出领导的信息

      select id,first_name,title from s_emp

      where id in(null,1,2,3,6,7,8,9,10);

      c) 合并

      select id,first_name,title from s_emp

      where id in(

      select distinct manager_id from s_emp);

      -- 使用子查询列出普通员工的信息

      select id,first_name,title from s_emp

      where id not in(

      select distinct manager_id from s_emp

      where manager_id is not null);
    3. 使用exists

      -- 列出有员工的部门的信息

      select * from s_dept d where exists(

      select * from s_emp e where e.dept_id=d.id

      );

4.2 having子句

-- 列出平均工资高于公司平均工资的部门的信息

select dept_id,avg(salary) from s_emp

group by dept_id

having avg(salary)>(

select avg(salary) from s_emp

);

4.3 from子句

一个select语句产生的结果集,可以看成是一个内视图或者匿名视图,只能在当前语句使用

select id,name,yearsal from

(select id,first_name name,12*salary+1000 yearsal from s_emp) e

where yearsal>15000;

  1. -- 列出工资高于本部门平均工资的员工的信息
  2. a) 列出每个部门的编号及其平均工资
  3. select dept_id,avg(salary) avgsal from s_emp
  4. group by dept_id;
  5. -- 相当于包含dept_idavgsal两个字段的一张表 s
  6. b) 使用表连接(s_emps) 实现功能
  7. s_emp: id,first_name,salary
  8. s: avgsal
  9. 关联字段: s_emp.dept_ids.dept_id
  10. select e.id,e.first_name,e.salary,s.avgsal
  11. from s_emp e,(
  12. select dept_id,avg(salary) avgsal
  13. from s_emp
  14. group by dept_id) s
  15. where e.dept_id = s.dept_id
  16. and e.salary > s.avgsal;

4.4 select之后

外连接的另一种实现方式,并且更为灵活

-- 列出员工及其所在部门的信息

select id,first_name,salary,(

select name from s_dept d where e.dept_id=d.id

) dname

from s_emp e;

  1. -- 练习:列出所有和'Mark'在同一部门的员工的信息
  2. select id,first_name,dept_id from s_emp
  3. where dept_id=
  4. (select dept_id from s_emp where first_name='Mark');

对象名_姓名缩写_座位号

xxxx_zsm_00

5.表的操作

5.1 表的创建和删除

5.1.1 标识符的命名

1) 由a-z、A-Z、0-9、_、$、#构成

2)必须用字母开头

3) 不能和关键字重名

4) 不能和其他的数据库对象重名

5) 1-30位

5.1.2 创建表

-- 语法

create table 表名(

字段名 数据类型,

....

字段名 数据类型

);

create table testid_zsm_00(

id number,

name varchar2(20)

);

5.1.3 删除表

drop table 表名;

drop table testid_zsm_00;

5.2 数据操作语句(DML)

-- 创建一个测试表

三个字段:

编号 数字

名字 字符串

入职日期 日期

create table emp_zsm_00(

id number(7),

name varchar2(20),

start_date date

);

  1. 5.2.1 插入语句(insert) -- 一次一整行
  2. 1) 语法
  3. insert into 表名[(字段列表)] values(值列表);
  4. 字段列表的数量和顺序和值列表的数量和顺序必须一致
  5. 2) 不省略字段列表
  6. -- 写入全部字段
  7. insert into emp_zsm_00(id,name,start_date)
  8. values(1,'test1','13-OCT-17');
  9. commit;
  10. -- 写入部分字段 ( 没有给值的字段必须允许为null )
  11. insert into emp_zsm_00(id,name)
  12. values(2,'test2');
  13. commit;
  14. 3) 省略字段列表(相当于给出了全部字段,并且顺序和表结构一致)
  15. -- 给全部字段提供值
  16. insert into emp_zsm_00 values(3,'test3',sysdate);
  17. commit;
  18. insert into emp_zsm_00 values(4,'test4',
  19. to_date('2017-10-13','yyyy-mm-dd'));
  20. commit;
  21. -- 给部分字段提供值
  22. insert into emp_zsm_00 values(5,'test5',null);
  23. commit;

5.2.2 更新语句(update)

1) 语法

update 表名 set 字段 = 新值[,字段 = 新值,...]

[where 条件];

2) -- 更新 把入职日期改为'2017-01-20'

update emp_zsm_00 set start_date='12-JAN-17';

  1. 3) -- id=1的名字改为'Ben',入职日期改为当前日期
  2. update emp_zsm_00 set name='Ben',
  3. start_date=sysdate where id=1;
  4. commit;
  5. 5.2.3 删除语句(delete) -- 整行删除
  6. 1) 语法
  7. delete [from] 表名 [where子句];
  8. 2) 删除表中全部数据
  9. delete from emp_zsm_00;
  10. rollback; -- 撤销没有提交的操作
  11. 3) where子句的删除
  12. delete from emp_zsm_00 where name like 'test%';
  13. commit;

5.3 事务控制语句 (TCL)

select: 和事务无关

ddl: 隐式提交的事务

dml: 默认需要显式提交

  1. 5.3.1 事务控制语句的含义
  2. commit; 确认事务(提交所有未提交的操作)
  3. savepoint 保存点; 定义保存点
  4. rollback; 回滚事务(撤销所有未提交的操作)
  5. rollback to 保存点; 回顾到保存点的位置
  6. 5.3.2 事务的四大特性(ACID)
  7. 1) 原子性:事务中的语句是一个不可分割的整体
  8. 转账:
  9. 账户表:account
  10. 字段:id balance
  11. A账户---> B账户 2000
  12. update account set balance = balance - 2000
  13. where id='A';
  14. a
  15. update account set balance = balance + 2000
  16. where id='B';
  17. b
  18. if a&&b
  19. commit;
  20. else
  21. rollback;
  22. 要么全部成功,要么全部失败
  23. 2)一致性
  24. 事务执行的结果必须是使数据库从一种一致性状态变为另一种一致性状态
  25. 3) 隔离性
  26. 一个事务对数据的改变,在提交之前,对于其他的事务是不可见的。
  27. 4) 持久性
  28. 事务一旦提交,对数据的改变就是永久的

5.3.3 部分成功 部分失败

-- 删除表中全部数据 属于ddl语句,不能撤销

truncate table emp_zsm_00;

  1. insert into emp_zsm_00(id,name) values(1,'test1');
  2. savepoint a;
  3. insert into emp_zsm_00(id,name) values(2,'test2');
  4. savepoint b;
  5. insert into emp_zsm_00(id,name) values(3,'test3');
  6. savepoint c;
  7. insert into emp_zsm_00(id,name) values(4,'test4');
  8. select * from emp_zsm_00;
  9. rollback to b;
  10. commit;
  11. select * from emp_zsm_00;

练习:

1.使用select语句建表:

drop table emp_zsm_00;

create table emp_zsm_00 as select * from s_emp;

2.给所有'Carmen'的下属涨工资

  1. 查询'Carmen'的编号
  2. 根据'Carmen'的编号 查询其下属的编号
  3. 根据员工编号 改工资

    3.删除和'Ben'同部门的员工

表操作(day03)的更多相关文章

  1. Mysql常用表操作 | 单表查询

    160905 常用表操作 1. mysql -u root -p 回车 输入密码   2. 显示数据库列表 show databases     3. 进入某数据库 use database data ...

  2. Sql Server系列:数据表操作

    表是用来存储数据和操作数据的逻辑结构,用来组织和存储数据,关系数据库中的所有数据都表现为表的形式,数据表由行和列组成.SQL Server中的数据表分为临时表和永久表,临时表存储在tempdb系统数据 ...

  3. 学习MySQL之单表操作(二)

    ##单表操作 ##创建表 CREATE TABLE t_employee( empno ), ename ), job ), MGR ), Hiredate DATE DEFAULT '0000-00 ...

  4. python——Django(ORM连表操作)

    千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...

  5. mysql数据表操作&库操作

    首先登陆mysql:mysql -uroot -proot -P3306 -h127.0.0.1 查看所有的库:show databases; 进入一个库:use database; 显示所在的库:s ...

  6. SQL server基础知识(表操作、数据约束、多表链接查询)

    SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...

  7. Python之Django--ORM连表操作

    一对多 class UserType(models.Model): caption = models.CharField(max_length=32) class UserInfo(models.Mo ...

  8. spark使用Hive表操作

    spark Hive表操作 之前很长一段时间是通过hiveServer操作Hive表的,一旦hiveServer宕掉就无法进行操作. 比如说一个修改表分区的操作 一.使用HiveServer的方式 v ...

  9. [SAP ABAP开发技术总结]内表操作

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. 微信的token验证

    微信的token验证 在微信公众平台的基本配置中,需要输入token,这个token不是那个access_token springmvc验证代码: @RequestMapping(value=&quo ...

  2. Eclipse搭建maven开发环境

    上一篇学习了maven开发环境的搭建,而且手动编写了一个mavenproject,可是这样子效率非常低下.今天带大家学习在eclipse下搭建maven开发环境. 经常使用的maven命令 mvn c ...

  3. Hibernate学习笔记(八) — 懒载入与抓取策略

    懒载入(Load On Demand)是一种独特而又强大的数据获取方法,它可以在用户滚动页面的时候自己主动获取很多其它的数据,而新得到的数据不会影响原有数据的显示,同一时候最大程度上降低server端 ...

  4. 最全Linux 与 Linux Windows 文件共享

    前提说明: windows主机信息:192.168.1.100 帐号:abc password:123 共享目录:share linux主机信息:192.168.1.200 帐号:def passwo ...

  5. hdu4738Caocao's Bridges

    什么?有人要炸我的桥?!D飞他(心疼周瑜大都督) 这个就是求割边/桥了. #include<cstdio> #include<iostream> #include<cst ...

  6. 洛谷P3808 & P3796 AC自动机模板

    题目:P3808:https://www.luogu.org/problemnew/show/P3808 P3796:https://www.luogu.org/problemnew/show/P37 ...

  7. 1tb等于多少g 1TB和500G有什么区别

    转自:http://www.a207.com/article/view_39392 移动硬盘.U盘是生活中常见的用品,他们的内存大小是什么标准.很多人对于1tb等于多少g和1tb和500g有什么区别不 ...

  8. xx网络--工具集合

    -- D:\workspace\bajie_projram\BJ.srfcb\BJ.srfcb\BJ.srfcb 8jielicai_New\App_Code\common\pg.cs---GetHt ...

  9. VS2015 右侧导航插件地址

    右侧导航插件: https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.ProductivityPowe ...

  10. P1375 嵌套矩形

    题目Problem 嵌套矩形 Time Limit: 1000ms    Memory Limit: 131072KB 描述Descript. 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形 ...