mysql语法3

mysql语法3

1.多表关系(了解)

-- 常见关系
-- 一对一,多对一的一种特例场景
-- 一对多:实际开发中使用最频繁
多对多的关系:实际开发中使用居多

2.数据库设计范式

-- 1NF:数据库表中的每一列不可在拆分的原子数据项,必须独立的列;
-- 2NF:在1NF基础上,数据库表中非主键字段必须完全依赖于主键字段,完全依赖是指不能存在仅依赖主键一部分的列。
-- 3NF:在2NF基础上,任何非主列不得传递依赖于主键。 

3.多表查询

1)内连接
隐式内连接---看不到join关键字,使用where条件
	语法:select 字段列表 from 表名名1,表名名2 where  连接条件
	如:
		select 
   			e.*,
    		d.*
		from
  			emp e, --表一
  			dept d --表二
		where e.`dept_id` = d.`id` ; --连接关系
显示内连接---inner join 关键字,inner可以省略
	语法:select 字段列表 from 表名名1 inner join 表名名2  on 连接条件; 
	如:
		SELECT 
   			e.*,
    		d.*
		FROM
  			emp e --表一
		INNER JOIN 
			dept d --表二
		ON 
  			e.`dept_id` = d.`id` ; --连接关系
实际开发中:内连接优先使用where隐式内连接(SQL优化的一种)
2)外连接
左外连接(推荐)
	语法:select 字段列表 from 表名1  left outer join 表名2  on 连接条件
	outer可以省略
右外连接
	语法:select 字段列表 from 表名1  right outer join 表名2  on 连接条件
	outer可以省略
3)子查询
注意:select 语句嵌套select语句,
这种场景实际开发使用很少
查询的效率比较低
常用where条件使用比较运算符
或者使用in集合语句
或者使用一条select语句的结果作为一个"虚表"和其他表查询

情况1:使用where 条件使用比较运算符
-- 需求:查询最高工资的员工信息
-- 1)查询最高工资是多少
-- select max(salary) from emp ; -- 16000
-- 2)查询员工的工资是16000的员工信息
-- select  * from emp where salary = 16000 ;
-- 一步走
SELECT * FROM emp WHERE salary =  (SELECT MAX(salary) FROM emp ) ;

情况2:使用in集合语句
-- 需求:查询在市场部或者财务部的员工信息
-- 1)先查询出市场部和财务部的id
-- select id from dept where name = '市场部' or name = '财务部' ;
-- 2)查询dept_id是2或者3的员工信息
-- select * from emp where emp.`dept_id` in(2,3) ;
-- 一步走
SELECT 
  * 
FROM
  emp 
WHERE emp.`dept_id` IN 
  (SELECT 
    id 
  FROM
    dept 
  WHERE NAME = '市场部' 
    OR NAME = '财务部') ;

情况3:使用一个select语句查询的结果集 当前一张"虚表"和其他表进行关联查询
-- 需求:查询入职日期大于"2020-01-14"的员工信息以及部门名称信息
-- 1)按照这个条件先查询员工信息
SELECT * FROM emp WHERE join_date > '2020-01-14'
-- 2)将上面查询的结果集当做一张"虚表" 和部门表查询
-- 一步走
SELECT 
  t.*,
  d.name '部门名称' 
FROM
  (SELECT 
    * 
  FROM
    emp 
  WHERE join_date > '2020-01-14') t 
  LEFT OUTER JOIN dept d 
    ON t.dept_id = d.id ;
-- 上面这个语法---使用where 内连接查
SELECT
    e.*,
    d.`name` '部门名称'
FROM
    emp e,
    dept d 
WHERE 
	e.`join_date` >'2020-01-14' 
	AND 
	e.`dept_id` = d.`id` ;   

4.数据库的事务

1)概念
事务:就是当前整个业务操作同时要执行多个sql或者多张表的sql的时候,使用事务.
将业务整体管理起来,要么这个多个sql同时执行成功,要么同时执行失败;
2)语法
-- 开启事务
START TRANSACTION ;
-- 张三给李四转500
UPDATE account SET balance =balance- 500 WHERE id = 1 ;
-- 转账出问题了
-- 李四 +500 
UPDATE account SET balance = balance+500 WHERE id = 2 ;
-- 上面出问题了,回滚:回滚到在更新之前:默认的回滚点
ROLLBACK ;
-- 如果没有问题,正常提交--- 添加,删除,修改 ,必须提交事务!
COMMIT ;

-- 关系型数据库事务的特点(重点)--- 传统型事务的特点
-- ACID 
-- 原子性:使用事务管理的业务操作(执行多个sql),要么同时执行成功,要么同时失败
-- 一致性:在事务管理的业务操作过程中,执行之前和执行之后它的数量总量不变
-- 隔离性:业务和业务之间是独立,业务又需要被事务管理,事务和事务之间是独立的,相互之间不影响,分离开来!
-- 持久性:针对增删改操作,只要提交事务,即使关机了,数据永久保存!
3)查询隔离级别
-- mysql5.1以上查询事务的隔离级别 
SELECT @@tx_isolation ; -- mysql的默认隔离级别就是 repeatable read ;

-- mysql8.0 查询事务隔离级别
SELECT @@transaction_isolation ;

事务的隔离级别四种:分别从小到大,安全性(从低到高),执行效率(从高到低)
 read uncommitted;  读未提交, 会导致最严重的问题 "脏读"(一个事务读到另一个没有提交事务)
 read committed ;   读已提交,可以有效防止脏读,但是会现在一个问题"不可重复读"(在提交事务之前和事务,数据不一致!)
 repeatable read ;  可重复读(mysql默认隔离级别) , 可以有效防止脏读以及不可重复读,会出现"幻读"
 serializable ; 串行话  级别最高,安全性最高,效率低!

SET GLOBAL TRANSACTION ISOLATION LEVEL  REPEATABLE READ ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值