精华内容
下载资源
问答
  • 7.1 查询(案例:公司管理系统,有三张表EMP,DEPT,SALGRADE) eg1:显示雇员名、雇员工资以及所在部门的名字。(上面的数据来自EMPDEPT表,因此要联合查询) select EMP.ename, EMP.sal, DEPT.dname from ...

    七、 复合查询(重点)

    7.1 多表查询(案例:公司管理系统,有三张表EMP,DEPT,SALGRADE)

    eg1:显示雇员名、雇员工资以及所在部门的名字。(上面的数据来自EMP和DEPT表,因此要联合查询)

    select EMP.ename, EMP.sal, DEPT.dname from EMP, DEPT where EMP.deptno = DEPT.deptno;

    eg2:显示部门号为10的部门名,员工名和工资。

    select ename, sal,dname from EMP, DEPT where EMP.deptno=DEPT.deptno and DEPT.deptno= 10;

    eg3:显示各个员工的姓名,工资,及工资级别。

    select ename, sal, grade from EMP, SALGRADE where EMP.sal between losal and hisal;

    7.2 自连接

    自连接是指在同一张表连接查询

    eg1:显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)

    使用的子查询:

    select empno,ename from emp where emp.empno=(select mgr from emp where ename='FORD');

    使用多表查询(自查询):

    -- 使用到表的别名
    select leader.empno,leader.ename from emp leader, emp worker where leader.empno =worker.mgr and worker.ename='FORD';

    7.3 子查询

    子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询.

    7.3.1 单行子查询(单行子查询是指子查询只返回单列,单行数据)

    eg:显示SMITH同一部门的员工

      select * from EMP WHERE deptno = (select deptno from EMP where ename='smith');

    7.3.2 多行子查询(多行子查询是指返回单列多行数据)

    (1)in关键字;

    eg:查询和10号部门的工作相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的

    select ename,job,sal,empno from emp where job in (select distinct job from emp where deptno=10) and deptno<>10;

    (2)all关键字;

    eg:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

    select ename, sal, deptno from EMP where sal > all(select sal from EMP where deptno=30);

    (3)any关键字;

    eg:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号

    select ename, sal, deptno from EMP where sal > any(select sal from EMP where deptno=30);

    7.3.3 多列子查询(多列子查询则是指查询返回多个列数据的子查询语句)

    eg:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

    select ename from EMP where (deptno, job)=(select deptno, job from EMP where ename='SMITH') and ename <> 'SMITH';

    7.3.4 在from子句中使用子查询(把一个子查询当做一个临时表使用)

    eg:显示高于自己部门平均工资的员工的姓名、部门、工资、平均工资

    select ename, deptno, sal, format(asal,2) from EMP, (select avg(sal) asal, deptno dt from EMP group by deptno) tmp  bwhere EMP.sal > tmp.asal and EMP.deptno=tmp.dt;

    7.3.5 合并查询

    (1)union (该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行)

    eg:将工资大于2500或职位是MANAGER的人找出来

     select ename, sal, job from EMP where sal>2500 union (select ename, sal, job from EMP where job='MANAGER');

    (2)union all (该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行)

    eg:将工资大于25000或职位是MANAGER的人找出来

     select ename, sal, job from EMP where sal>2500 union all (select ename, sal, job from EMP where job='MANAGER');

    展开全文
  • #where或having后面:#标量子查询(单行子查询)#列子查询(多行子查询)#行子查询(多行列) 特点:子查询放在小括号内,一般放在条件的右侧,标量子查询一般配备单行操作符使用单行操作符:<> >= <= < &...

    #where或having后面:
    #标量子查询(单行子查询)
    #列子查询(多行子查询)
    #行子查询(多行多列)

    特点:子查询放在小括号内,一般放在条件的右侧,标量子查询一般配备单行操作符使用
    单行操作符:<> >= <= < >
    列子查询:一般搭配着多行操作符使用
    多行操作符:in、any、some、all

    #标量子查询
    #案例:谁的工资比ABEL高的员工信息

    SELECT *
    FROM  employees
    WHERE salary>(
    
        SELECT salary
        FROM employees
        WHERE last_name='Abel'
    );

    #案例:返回job_id与141号员工相同,salary比143号员工多的员工的姓名、job_id和工资

    SELECT
        last_name,job_id,salary
    FROM employees
    WHERE job_id=(
        SELECT job_id
        FROM employees
        WHERE employee_id=141
    )
    AND salary>(
        SELECT salary
        FROM employees
        WHERE employee_id=143
    );

    #案例:返回工资最少的员工的last_name、job_id和salary

    SELECT  last_name,job_id,salary
    FROM employees
    WHERE   salary=(
        SELECT MIN(salary)
        FROM employees
    );

    #案例:查询最低工资大于50号部门最低工资的部门id和其最低工资

    SELECT department_id,MIN(salary)
    FROM employees
    GROUP BY department_id
    HAVING  MIN(salary)>(
        SELECT MIN(salary)
        FROM employees
        WHERE department_id=50
    );

    #非法使用标量子查询

    SELECT department_id,MIN(salary)
    FROM employees
    GROUP BY department_id
    HAVING  MIN(salary)>(
        SELECT salary   #单行操作符只能搭配标量子查询,而这是列子查询
        FROM employees
        WHERE department_id=50
    );
    展开全文
  • 列子查询(多行子查询)3.行子查询(结果集一行列或多行列)三、select后面四、from后面五、exists后面(相关子查询)六、分页查询 一、sql199语法 语法 select 查询列表 from 表1 别名 on 【连接类型】 join 表2 ...

    一、sql199语法

    语法

    select 查询列表
    from 表1 别名 on 【连接类型】
    join 表2 别名 on 连接条件
    【where 筛选条件】
    【group by 分组】
    【having 筛选条件】
    【order by 排序列表】

    分类
    内连接:inner

    外连接
    左外:left 【outer】
    右外:right【outer】
    全外:full【outer】

    交叉连接:cross

    1.内连接

    语法:
    select 查询列表
    from 表1 别名
    inner join 表2 别名
    on 连接条件;
    特点:
    ①添加排序、分组、筛选
    ②inner可以省略
    ③筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
    ④inner join 连接和sql192语法中的等值连接效果一样,都是查询多表的交集

    1)等值连接

    案例1:查询员工名、部门名
    select 姓名,部门名
    from 员工表
    inner join 部门表
    on 部门表.部门id=员工表.部门id

    案例2:查询名字中包含e的员工名和工种名
    select 员工名,工种名
    from 员工表
    inner join 工种表
    on 员工表.工种id=工种表.工种id
    where 员工名 like ‘%e%’;

    案例3:查询部门个数>3的城市名和部门个数
    select count(部门id)部门个数,城市名
    from 部门表
    inner join 城市表
    on 部门表.城市id=城市表.城市id
    group by 城市名
    having count(部门id)>3

    案例4:查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序
    select count(),部门名
    from 员工表
    inner join 部门表
    on 部门表.部门id=员工表.部门id
    group by 部门名
    having count(
    )>3
    order by count(*) desc

    案例5:查询员工名、部门名、工种名,按部门名排序
    select 姓名,部门名,工种名
    from 员工表
    inner join 部门表 on 部门表.部门id=员工表.部门id
    inner join 工种表 on 工种表.工种id=员工表.工种id
    order by 部门名 desc

    2)非等值连接

    案例1:查询员工的工资级别
    select 工资,工资等级
    from 员工表
    inner join 工资等级表
    on 员工表.工资 between 工资等级表.最低工资 and 工资等级表最高工资;

    案例2:查询每个工资级别的个数>20的个数,并且按工资级别降序
    select 工资等级,count()
    from 员工表
    inner join 工资等级表 on 员工表.工资 between 工资等级表.最低工资 and 工资等级表最高工资
    group by 工资等级
    having count(
    )>20
    order by 工资等级 desc

    3)自连接

    案例1:查询员工的名字,上级的名字
    select e.姓名,m.姓名
    from 员工表 as e
    inner join 员工表 as m on e.管理者id=m.员工id

    案例2:查询姓名中包含字符k的员工的名字,上级的名字
    select e.姓名,m.姓名
    from 员工表 as e
    inner join 员工表 as m on e.管理者id=m.员工id
    where e.姓名 like ‘%k%’

    2.外连接

    应用场景:用于查询一个表中有,另一个表没有的记录
    特点
    ①外连接的查询结果为主表中的所有记录
    如果从表中有和它匹配的,则显示匹配的值
    如果从表中没有和它匹配的,则显示null
    外连接查询的结果=内连接结果+主表中有而从表没有的记录
    ②左外连接:left join 左边是主表
    右外连接:right join 有边是主表

    引入:查询男朋友不在男神表的女神名
    select b.name boys.name
    from beauty b
    left outer join boys
    on b.boyfriend_id = boys.id
    where boys.id is null

    案例1:查询哪个部门没有员工
    select d.*,e.员工id
    from 部门表 as d
    left outer join 员工表 as e on 部门表.部门id = 员工表.部门id
    where e.员工id is null

    3.全外连接

    select b.,boys.
    from beauty as b
    full outer join boys on b.boyfriend_id = boys.id;

    4.交叉连接

    select b.* ,boys.*
    from beauty b
    cross join boys;

    sql 192和 sql199

    二、子查询

    含义:出现在其他语句中的select语句,称为子查询或内查询
    外部的查询语句,称为主查询或外查询

    分类:
    按子查询出现的位置:
    select后面:标量子查询
    from后面:支持表子查询
    where或having后面:标量子查询,列子查询,行子查询
    exists后面(相关子查询)表子查询

    按结果集的行列不同
    标量子查询(结果集只有一行一列)
    列子查询(结果集只有一列多行)
    行子查询(多行多列)
    表子查询(结果集,一般多行多列)

    1.where或having后面

    1)标量子查询 (单行子查询)
    2)列子查询(多行子查询)
    3)行子查询(多行多列)

    特点:
    ①子查询放在小括号内
    ②子查询一般放在条件的右侧
    ③标量子查询,一般搭配着行操作符使用

    < >= <= <>
    ④子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
    列子查询,一般搭配着多行操作符使用
    in、any/some、all

    案例1:谁的工资比小刚高
    ①查询小刚的工资
    select 工资 from 员工表
    where 姓名=‘小刚’

    ②查询员工的信息,满足工资>①的结果
    select * from 员工表
    where 工资>(
    select 工资 from 员工表
    where 姓名=‘小刚’)

    案例2:返回job_id与141号员工相同,工资比143号员工多的员工姓名,job_id和工资
    select 姓名,job_id,工资 from 员工表
    where 工资>(
    select 工资 from 员工表
    where job_id=143)
    and job_id=(select job_id from 员工表
    where 员工id=141)

    案例3:返回公司工资最少的员工的姓名,job_id和工资
    select min(工资) from 员工表
    select 姓名,job_id,工资 from 员工表
    where 工资=(select min(工资) from 员工表 )

    案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资
    select 部门id, min(工资) from 员工表
    group by 部门id
    having min(工资)>(select min(工资) from 员工表 where 部门id=50)

    非法使用标量子查询

    2.列子查询(多行子查询)

    案例1:返回location_id是1400或1700的部门中的所有员工姓名
    ①查询location_id是1400和1700的部门编号
    select 部门id from 部门表
    where location_id in(1400,1700)

    ②查询员工姓名,要求部门号是①列表中的某一个
    select 姓名 from 员工表
    where 部门id in(
    select 部门id from 部门表
    where location_id in(1400,1700)
    )

    案例2:返回其它工种中比job_id为’TI’部门中任意工资低的员工的:工号、姓名、job_id以及工资
    ①查询job_id为’TI’部门任一工资
    select distinct 工资 from 员工表
    where job_id=‘TI’
    ②查询员工
    select 姓名,员工id,job_id,工资 from 员工表
    where 工资<any(
    select distinct 工资 from 员工表
    where job_id=‘TI’
    )and job_id<>‘TI’;

    或者
    select 姓名,员工id,job_id,工资 from 员工表
    where 工资<any(
    select max(工资) from 员工表
    where job_id=‘TI’
    )and job_id<>‘TI’;

    案例3:返回其他部门中比job_id为’TI’部门所有工资都低的员工 的员工id、姓名、job_id以及工资
    select 姓名,员工id,job_id,工资 from 员工表
    where 工资<all(
    select distinct 工资 from 员工表
    where job_id=‘TI’
    )and job_id<>‘TI’;
    或者
    select 姓名,员工id,job_id,工资 from 员工表
    where 工资<(
    select min(工资) from 员工表
    where job_id=‘TI’
    )and job_id<>‘TI’;

    3.行子查询(结果集一行多列或多行多列)

    案例1:查询员工编号最小且工资最高的员工信息
    select * from 员工表
    where(员工id,工资)=(
    select min(员工id),max(工资) from 员工表

    ①查询最小的员工编号
    select min(员工id) from 员工表
    ②查询最高的工资
    select max(工资) from 员工表

    ③查询员工信息
    select * from 员工表
    where 员工id = (select min(员工id) from 员工表)
    and 工资=(select max(工资) from 员工表)

    三、select后面

    仅仅支持标量子查询
    案例1:查询每个部门的员工个数
    select d.,(
    select count(
    ) from 员工表
    where e.部门id=d.部门id
    )
    from 部门表 as d

    案例2:查询员工号=102的部门名
    select (
    select 部门名 from 部门表 as d
    inner join 员工表e
    on d.部门id = e.部门id
    where e.部门id=102
    )as 部门名

    四、from后面

    将子查询结果当一张表,要求必须起别名
    案例:查询每个部门的平均工资的工资等级
    ①查询每个部门的平均工资
    select avg(工资),部门id from 员工表
    group by 部门id

    ②连接①的结果集和工资等级表,筛选条件平均工资between 最低工资 and 最高工资
    select ag.*,g.等级
    from(
    select avg(工资) as ag,部门id from 员工表
    group by 部门id
    )as ag_dep
    inner join 工资等级表 as g
    on ag_dep.ag between 最低工资 and 最高工资

    五、exists后面(相关子查询)

    语法:
    exists(完整的查询语句)
    结果:1或0
    select exists(select 员工id from 员工表)

    案例1:查询有员工的部门名

    select 部门名 from 部门表 as d
    where exists(
    select * from 员工表 e
    where d.部门id=e.部门id
    );
    或者
    select 部门名 from 部门表 as d
    where d.部门id in(select 部门id from 部门表)

    案例2:查询没有女朋友的男神信息
    in
    select boys.* from boys
    where id not in(select boyfriend_id from beauty)
    或者
    select boys.* from boys
    where not exists( select boyfriend_id from beauty as b
    where boys.id = b.boyfriend_id;
    )

    六、分页查询

    应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
    语法:

    select 查询列表
    from 表
    【join type join 表2
    on 连接条件
    where 筛选条件
    group by 分组字段
    having 组分后筛选
    order by 排序字段】
    limit offset,size;
    offset要显示条目的起始索引()起始索引从0开始

    案例1:查询前五条的员工信息
    select * from employees limit 0,5;

    案例2:查询第11条到25条
    select * from employees limit 10,15;

    案例3:有奖金的员工信息,并且工资较高的前10名显示
    select * from 员工表
    where 奖金率 is not null
    order by 工资 desc
    limit 0,10;

    limit (page-1)*size,size

    七、联合查询
    union 联合 合并:将多条查询语句的结果合并成一个结果
    应用场景:要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时
    特点:
    1、要求多条查询语句列数是一致的!
    2、要求多条查询的语句的查询的每一列的类型和顺序最好一致
    3、union关键字默认去重,如果使用union all 可以包含重复项

    案例:查询部门编号>90或邮箱包含a的员工信息
    select * from employees where email like ‘%a%’ or department_id>90;

    select * from employees where email like ‘%a%’
    union
    select * from employees where department_id>90;

    案例:查询中国用户中男性的信息以及外国用户中男性的用户信息
    select id,cname,csex from t_ca where csex=‘男’
    union
    select t_id,tName,tGender from t_ua where tGender=‘male’;

    展开全文
  • 多行多列子查询五、事务 数据库DCL 概述: DLC是用来为数据库建立多个账户,分配不同的权限来管理维护数据库 功能方法 格式 创建用户 CREATE USER ‘用户名’@‘主机名’ IDENTIFIED BY ‘密码’ 授权...

    数据库DCL

    概述:

    DLC是用来为数据库建立多个账户,分配不同的权限来管理和维护数据库

    功能方法 格式
    创建用户 CREATE USER ‘用户名’@‘主机名’ IDENTIFIED BY ‘密码’
    授权用户 GRANT 权限1, 权限2… ON 数据库名.表名 TO ‘用户名’@‘主机名’;
    授权的关键字有select、uodate、all等
    撤销权限 REVOKE 权限1, 权限2… ON 数据库.表名 FROM ‘用户名’@‘主机名’;
    查看权限 SHOW GRANTS FOR ‘用户名’@‘主机名’;
    删除用户 DROP USER ‘用户名’@‘主机名’;
    修改用户密码 mysqladmin -uroot -p password 新密码(注意,新密码不需要加引号)

    数据库备份和还原:

    备份格式:

    mysqldump -u用户名 -p密码 数据库 > 文件的路径

    还原格式:

    SOURCE 导入文件的路径;

    一、数据库三大范式

    概述:

    一套设计数据库表的规则

    范式列表:

    第一范式、第二范式、第三范式、巴斯科德范式、第四范式、第五范式

    第一范式:

    每一列要保证原子性,不可再分割。

    如果不满足第一范式,会导致查询数据非常麻烦,对每次查询之后的结果还要进一步处理。

    第二范式:

    1.一张表只能描述一件事情

    2.每张表必须有主键

    如果不满足第二范式,容易造成数据冗余,相同数据无法区分;

    第三范式:

    如果要引用其他表中的字段,只能引用其他表的主键列的值;

    数据库三大范式小结 说明
    1NF 最基本的要求,每一列必须具有原子性,不可再分割
    2NF 满足1NF基础上,满足下面两个条件
    每张表必须有主键
    一张表只描述一件事件
    3NF 满足2NF基础上,满足一个条件
    一张表只能引用另一张表的主键列的值。

    二、表关系

    1.表的一对一

    两种建表原则:

    1.外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一unique

    2.外键是主键:主表的主键和从表的主键,形成主外键

    一对一表关系建表原则小结 说明
    外键唯一 主表的主键和从表的外键(唯一),形成主外键关系,外键唯一
    外键是主键 主表的主键和从表的主键,形成主外键关系

    2.一对多

    建表原则:

    在副表(多方)中,外键列引用主表(一方))中主键列的值

    3.多对多

    建表原则:

    在两个表中再建一个关系表(中间表)来存放两个表中的多对多关系

    这两个外键分别指向两张表的主键,而这两个外键一起作为关系表的主键

    共同确定记录的唯一性,这样的主键也被称为联合主键

    三、多表查询

    多表查询的方式:

    交叉查询:结果就是笛卡尔积

    内连接查询:(使用最多)
    ​ 隐式内连接
    ​ 显示内连接

    外连接查询:
    ​ 左外连接查询
    ​ 右外连接查询

    全连接查询:MySQL不支持

    笛卡尔积:

    查询记录数等于多张表之积,这是一种非常不好现象,会导致获得想要的数据非常困难

    解决方式:在查询的时候加上过滤条件,从表.外键=主表.主键

    多表查询的步骤:

    1. 先确定要查询的表有哪些
    2. 然后确定要查询的字段有哪些
    3. 最后确定查询条件

    1.内连接查询

    内连接查询分类 语法
    隐式内连接 select * from 左表,右表 where 条件;
    显示内连接 select * from 左表 inner join 右表 on 条件;
    inner 关键字可以省略

    内连接查询的特点:

    使用左表的记录去匹配右表的信息,只有满足条件的才会查询出来。

    2.外连接查询

    外连接查询小结
    语法:select 字段 from 左表 left(right) join 右表 on 条件;(left左连接,right右连接)
    特点:能够保证左表(右表)的记录全部查询出来。

    左右连接没有任何区别,存在的意义也只是方便懒人,不需要更换表的位置,仅此而已。

    四、子查询

    子查询概述 说明
    什么是子查询 一条查询语句中嵌套了另一条查询语句
    里面的查询语句称为子查询语句
    外面的查询语句称为父查询语句
    子查询分类 单行单列子查询
    多行单列子查询
    多行多列子查询
    子查询应用场景 当一条查询语句使用到的数据需要通过另一条查询语句获取时

    1.单行单列子查询

    查询的数据来自某一行某一列,也就是某个确定的值

    而这个值是来自于子查询的,所以在外面的查询语句使用时,只需要使用=赋值即可

    子查询的内容直接放到小括号中当作值赋给外面查询需要的地方

    eg:

    – 先查询最高工资是多少
    select max(salary) from emp;
    – 查询工资最高的员工是谁
    select * from emp where salary = (select max(salary) from emp);

    – 先查询平均工资是多少
    select avg(salary) from emp;
    – 然后查询工资小于平均工资的员工信息
    select * from emp where salary < (select avg(salary) from emp);

    – 先查询蜘蛛精的员工工资
    select salary from emp where name =‘蜘蛛精’;
    – 然后查询工资大于蜘蛛精的员工信息
    select * from emp where salary > (select salary from emp where name =‘蜘蛛精’);

    2.多行单列子查询

    其实多行单列子查询,查到的也是一多个值,其实说白了就是一个数组

    而想要使用这个数据里面的数据,在MySQL中需要使用in来获得

    所以和上面的区别只在于把=换成in即可

    eg:

    – 多行单列子查询:子查询结果是多行单列的值

    – 查询工资大于5000的员工的部门id
    select dept_id from emp where salary > 5000;
    – 根据部门id查询部门名称
    select id, name from dept where id = 1 || id = 2;
    select id, name from dept where id in (select dept_id from emp where salary > 5000);

    – 先查询部门表获取到开发部与财务部的id
    select id from dept where name in (‘开发部’,‘财务部’);
    – 根据部门id查询部门员工信息
    select * from emp where dept_id in (select id from dept where name in (‘开发部’,‘财务部’));

    3.多行多列子查询

    这个就厉害了,查询到的一张二维表,一张过滤过的表

    想要使用其中的数据,那么最好的使用方式就是和目标表做连接

    也就是把查询的结果当一个表,然后给它改个名字去使用

    eg:

    – 查询2011年以后入职的员工信息和部门信息。
    – 先查询员工表:查询2011年以后入职的员工信息
    select * from emp where join_date > ‘2010-12-31’;
    select e.,d.
    from dept d – 要查询的表(真实存在的表)
    inner join (select * from emp where join_date > ‘2010-12-31’) e – 要连接的表(虚拟表)
    on e.dept_id = d.id; – 连接条件

    五、事务

    概述:

    将一个业务操作中的多条SQL语句当成一个整体,这些SQL语句,要么都成功,要么都是失败

    如果有一条SQL语句失败,就执行事务的回滚,所有SQL语句全部执行失败

    事务原理:

    当执行 start transction 开启事务之后,MySQL内部会准备一个日志文件来存放SQL语句

    接下来执行的SQL语句的结果都会存储到这个日志文件中

    当执行commit语句之后,才会将日志文件中的内容同步到数据库中,并清空日志文件中的数据

    执行rollback语句,则会直接清空日志文件,并不会把内容同步到数据库中

    应用场景:

    比如一个人给一个人转钱,如果不开启事务,那么万一系统在处理第二条的时候断网宕机等情况,就会导致另一次操作失败,结果就是我转了钱,但是商家没收到。

    而有可能出现这种情况的话,就需要用到事务这个功能了。

    回滚点:

    就相当在执行事务的过程中的一个记录点,如果记录,那么我可以选不回滚到最开始回滚到记录点

    这样可以避免很多SQL语句的浪费

    比如要对某个表大幅度修改,但是最后金额修改有问题,如果没有回滚点就直接回到起点了

    但是有了回滚点,你就可以在设计金额的地方设定一个回滚点,来避免回滚到最开始

    设置回滚点的语法:savepoint 名字;
    回到回滚点的语法:rollback to 名字;

    手动管理事务 语句
    开启事务 start transaction;(开启一个事务,没有结束之前,所有数据不会提交到数据库中)
    提交事务 commit;(提交一个事务,代表着一次事务的结束,并且结果不可逆)
    回滚事务 rollback;(在没有提交事务的时候使用,当执行的sql语句有问题时,可以回滚到起点或者回滚点)

    事务的四大特性:

    事务四大特性 说明
    A:atomic 原子性 事务中的多条SQL语句是一个整体,不可再分割
    要么全部执行成功,要么全部执行失败。
    C:consistence 一致性 事务前后的数据要保存一致:比如转账前后总金额要一致。
    I:isolation 隔离性 多个事务之间操作不能相互影响。
    D:durablity 持久性 事务一旦提交则对数据库的数据影响是永久的,不可逆了。

    事务的隔离级别:

    并发访问的问题 含义
    脏读 一个事务读取到了另一个事务中尚未提交的数据
    不可重复读 一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致 的,这是事务update时引发的问题
    幻读 一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是 一致的,这是insert或delete时引发的问题
    级别 名字 隔离级别 脏读 不可重复读 幻读 数据库默认隔离级别
    1 读未提交 read uncommitted
    2 读已提交 read committed Oracle和SQL Server
    3 可重复读 repeatable read MySQL
    4 串行化 serializable

    查询全局事务隔离级别

    select @@transaction_isolation;
    – 或
    select @@tx_isolation;

    修改隔离级别:

    set global transaction isolation level 级别字符串;

    展开全文
  • MySQL子查询

    2021-04-21 18:38:46
    MySQL子查询 一、子查询含义 嵌套在其他语句内部的...列子查询多行子查询):一般搭配IN,ANY,ALL,其中IN比较常用,ANYALL类似MAXMIN的用法 行子查询(多行列或一行列):使用频率较少 【注意】:标量子查
  • 子查询 根据返回结果不同分为单行子查询、多行子查询多列子查询。 单行子查询返回一行一列数据给外部的SQL语句;多行子查询返回多行单列数据给外部的主SQL语句;多列子查询返回多列(单行或多行)数据给外部的SQL...
  • Oracle 子查询和伪列

    2019-06-01 23:40:45
    常见的子查询有单行子查询、多行子查询多列子查询、做为from字句的子查询(内嵌视图查询) 1.1 、单行子查询 单行子查询是指查询结果为一行数据的子查询 实例显示与SMITH同部门的所有员工 SELECT * FROM emp...
  • 文章目录一、子查询二、Rownum 分页查询 一、子查询 子查询:在一个查询的内部...多行子查询:返回条记录 范例:查询出比雇员 7654 的工资高,同时从事 7788 的工作一样的员工 范例:要求查询每个部门的最低工
  • 多行子查询: 子查询当中返回了单列多行的数据, 两个表的结果如果不在where后面加上约束条件会形成 "笛卡尔积"; c. 多列子查询: 子查询当中返回多列数据 使用方式: 只需要在where语句后面使用"(a列,b列) = (子...
  • mysql之子查询

    2020-03-09 23:09:17
    2 列子查询 多行子查询 (一行列) 3 行子查询 (列多行) 单行和多行的特点: 1 子查询放在小括号内 2 子查询一般放在条件的右侧 3 标量子查询,一般搭配着单行操作符使用 < >= <= <> 列子...
  • Oracle 笔记之子查询

    2015-08-29 18:15:11
    那么就先行执行的这个查询就是子查询子查询分为:单行单列子查询:查的结果只有一行,且只有一个字段多行单列子查询:查询出来的结果有多行,但只有一列 多行多列子查询查询出多行多个列。通常,单行单列与多行多...
  • 子查询练习

    2020-07-22 11:42:45
    多行子查询(in not in any all) – 查询出比10号部门任何员工薪资高的员工信息 – 多列子查询(实际使用较少) – 10号部门同名同工作的员工信息 – select 后面接子查询 – 获取员工的名字部门的名字 – from...
  • SQL子查询

    2015-09-10 16:32:28
    子查询语句根据返回记录的行数分为:单行子查询和多行子查询。 单行子查询是指向外部语句返回一行记录或者不返回记录。如果返回到记录只有一列,则称为标量子查询。 如果子查询返回多列,称为多列子查询; 如果子...
  • where 或 having 后面:标量子查询 (单行)☆ 列子查询多行) √ 子查询√ exists 后面 (相关子查询):表子查询 按功能或结果集的行列数不同: 标量子查询(结果集只有一行一列) 列子查询(结果只有一...
  • 高级子查询

    2017-04-17 09:41:00
    1.多列子查询 注意的问题  5.一般不在子查询中排序,没有意义(但是在TOP-N分析中需要对子查询排序) 6.一般先执行自查询,后执行主查询 ,但是相关子查询例外 7.单行子查询只能使用单行操作符,多行子查询只能...
  • plsql的子查询

    2008-08-31 22:41:00
    1,什么是子查询 子查询在包含它的SQL语句执行前被执行,子查询产生的结果在包含它的SQL语句执行完成后就被丢弃了。所以子查询常被认为是包含它的语句范围内的临时表...单行单列子查询、多行列子查询和多列子查询...
  • MySQL笔记 8 子查询

    2021-01-02 10:09:11
    3.2 多列子查询 4 关联子查询 4.1 exists运算符 4.2 关联子查询操作数据 5 何时使用子查询 5.1 子查询作为数据源 5.2 过滤条件中的子查询 5.3 子查询作为表达式生成器 单列单行的标量子查询。 除了用于...
  • MySQL查询 9:子查询

    2020-12-04 11:21:25
    子查询 在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句 主查询 ... 列子查询: 返回的结果是一列(一列多行) 行子查询: 返回的结果是一行(一行列)
  • 多行子查询是指返回单列多行数据,都是针对单列而言。而多列子查询是指查询返回多个列数据的子查询。 查询与 SMITH 的部门岗位完全相同的所有雇员 1、查询 SMITH 的部门岗位 SELECT deptno, job FROM emp ...
  • mysql-子查询

    2020-08-02 23:00:13
    含义 出现在其他语句内部的select语句,称为子查询或内查询。 内部嵌套其他select语句的查询,称为外查询或主查询。...列子查询(结果集只有一列多行)又称多行子查询 行子查询(结果集有一行列) 表子查询
  • 子查询

    2021-04-17 13:35:22
    子查询 在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句 ...列子查询: 返回的结果是一列(一列多行) 行子查询: 返回的结果是一行(一行列) 标量子查询 查
  • 15.数据的子查询操作

    2020-08-06 22:48:01
    1. 子查询 描述:出现在其他语句后面的select语句...wherehaving子查询:标量子查询、列子查询、行子查询 exists子查询:表子查询 特点: 子查询放在小括号内 子查询一般放在条件右侧 标量子查询一般搭配单行
  • 一、子查询的分类 ... 表子查询:返回的结果是多行多列(多行多列) Exists子查询:返回的结果1或者0(类似布尔操作) ② 按照出现的位置划分 select后面: 仅仅支持标量子查询(通常与> < = 搭配...
  • 这章也算是高级查询的内容...子查询就复杂了,分为:相关子查询、非相关子查询(单行单列子查询(标量子查询)、多行单列子查询、多列子查询内联视图。其中,相关子查询最不好理解了,需要继续学习! --TBC 2016-
  • 11、子查询

    2013-08-20 16:26:00
    子查询根据返回的结果,可以分为单行子查询多行子查询和多列子查询;根据返回的数据与外层查询之间的关系,可以分为相关子查询和不相关子查询。应该说,子查询在实际开发过程中有着非常广泛的应用。 单行子查询 ...

空空如也

空空如也

1 2 3
收藏数 53
精华内容 21
关键字:

多列子查询和多行子查询