多表查询

创建部门表:id(主键,自动增长)name

创建员工表:id(主键,自动增长)name 、性别、工资、入职日期、添加外键连接部门表的主键

插入数据

java 查询某个公众号所有的文章 javaweb查询功能语句_mysql


java 查询某个公众号所有的文章 javaweb查询功能语句_mysql_02


1、笛卡尔积笛卡尔积:集合A和集合B的所有组合

例如:使用以下方式查出来的数据就是笛卡尔积

java 查询某个公众号所有的文章 javaweb查询功能语句_sql_03


要完成多表查询就要消除无用的笛卡尔积,通过下述方法消除无用的笛卡尔积

2、多表查询的分类:

(1)内连接查询
(2)外连接查询
(3)子查询

多表查询——内连接查询

1、隐式内连接查询

用法:使用where语句消除无用的笛卡尔积
使用标准的sql语句查询出员工姓名、性别、员工所在的部门名称
(标准的sql语句:别名、格式)

java 查询某个公众号所有的文章 javaweb查询功能语句_数据库_04


2、显式内连接查询

语法:
Select 字段列表 from 表名1 [inner] join 表名2 on 条件;
注意:
1、从哪些表查数据
2、查询的条件是什么(哪些是有效数据哪些是无效数据)
3、查询哪些字段(不是所有的字段都需要)

外连接

新入职了一个员工,此时该员工没有被分配部门

java 查询某个公众号所有的文章 javaweb查询功能语句_数据库_05


要求:查询所有员工信息,如果有部门就查询出部门,没有就不显示

方法:按照内连接的方式无法查出没有部门信息的员工

解决方案:外连接

1、左外连接:

Select 字段列表 from 表名1 left [outer] join 表名2 on 条件

java 查询某个公众号所有的文章 javaweb查询功能语句_java_06


注意:左外连接查询出来的是左表所有的数据和与右表的交集

2、右外连接:

Select 字段列表 from 表名1 right [outer] join 表名2 on 条件
注意:右外连接查询出来的是右表所有的数据和与左表的交集

子查询

概念:查询中的嵌套查询,称嵌套查询为子查询

查询工资最高的员工信息:
1、查询最高工资是是多少
Select max(salary) from emp; 						-- 20000
2、查询工资是最高的员工
Select * from emp where salary = 20000;
可以把上面的两个步骤合并:
Select * from emp where salary=(select max(salary) from emp);

java 查询某个公众号所有的文章 javaweb查询功能语句_数据库_07


1、子查询的结果是单行单列的:

子查询可以作为条件,使用运算符去判断(单值判断的运算符)
查询员工工资小于平均工资的员工:

Select * from emp where salary < (select avg(salary) from emp);

![在这里插入图片描述]()

2、子查询的结果是多行单列的:

子查询可以作为条件,使用运算符in来判断

查询“取经部”和“恋爱部”所有员工的信息:

Select * from emp where dept_id in(select id from dept where name =’取经部’or name=‘恋爱部’);

java 查询某个公众号所有的文章 javaweb查询功能语句_java 查询某个公众号所有的文章_08


3、子查询是多行多列的:

子查询可以作为一张虚拟表参与查询。

查询入职日期在1781-01-01之后的所有员工和部门的信息:

Select * from emp where join_date > ‘1781-1-1’;

Select * from (Select * from emp where join_date > 1781-1-1) t1, dept t2 where t1.dept_id=t2.id;

java 查询某个公众号所有的文章 javaweb查询功能语句_java_09


也可以使用内连接完成要求:

Select * from emp t1,dept t2 where t1.dept_id = t2.id and t1.join_date > ‘1781-1-1’;

事务的基本介绍

  1. 概念:如果一个包含多个步骤的业务操作被事务管理,那么这些操作要么同时成功,要么同时失败
  2. 操作
(1)开启事务:start transaction;
(2)回滚:rollback;
(3)提交:commit;

(该图片来自学习视频的截图)

java 查询某个公众号所有的文章 javaweb查询功能语句_java_10

Xxx给yanzi转账500元:
1、查询余额是否大于500元
2、Xxx余额-500
3、Yan余额+500

创建一张账户表存放账户信息

java 查询某个公众号所有的文章 javaweb查询功能语句_java 查询某个公众号所有的文章_11


未使用事务时,如果转账过程中出现异常:

Update account set balance =500 where id = 1;
这是一个异常
Update account set balance = 10500 where id =2;
Select * from account;

java 查询某个公众号所有的文章 javaweb查询功能语句_mysql_12


500元消失了。。。。

  1. 事务提交的两中方式:
(1)自动提交:
①MySQL就是自动提交的(Oracle数据库是手动提交的)
②一条DML语句就会自动提交一次事务
(2)手动提交:需要先开启事务再提交
(3)修改事务的默认提交方式:
①查看事务的默认提交方式:select @@autocommit;(autocommit=1是默认提交)
②把默认提交方式修改为手动提交方式:set @@autocommit =0;
注意:手动提交必须要在最后写上commit;不然不能持久化到数据库中!
  1. 事务的四大特征
(1)原子性:事务是不可分割的最小操作单位,要么同时成功,要么同时失败
(2)持久性:当事务提交或回滚后,数据会持久化到数据库中
(3)隔离性:事务和事务之间相互独立
(4)一致性:事务操作前后,数据总量不变
  1. 事务的隔离级别(了解)
(1)概念:多个事务之间相互隔离,但是如果多个事务同时操作同一数据就会遇到一些问题
(2)解决方法:设置不同的隔离级别
(3)存在的问题:
①脏读:一个事务读取到另一个事务没有提交的数据
转账操作:两个事务,事务1向事务2转账500元但是没有提交事务,此时事务2查询到的数据是事务1成功向事务2转账500,但是事务1回滚之后,再次查询数据,数据又回到原来的状态
②不可重复读(虚读):在同一个事务中两次读到的数据不一样
报表系统中:两个事务,原数据是11,事务1把数据改为100了,但是没有提交事务,此时事务2查询到的数据是11,但是没有提交事务,向老板汇报数据是11,此时事务1提交了事务,老板再查看数据,数据变成了100。
③幻读:一个事务操作数据表中的所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改,像是出现幻觉一样

(4)隔离级别:
①Read uncommitted:读未提交
产生的问题:脏读、不可重复度、幻读
②Read committed:读已提交(Oracle默认)
产生的问题:不可重复度、幻读
③Repeatable read:可重复读(MySQL默认)
产生的问题:幻读
④Serializable:串行化
当一个事务在访问数据时,给数据加了个锁,别的事务不可以访问该数据。
可以解决所有问题
注意:隔离级别从小到大的安全性越来越高,但是效率越来越低
* 数据库查询隔离级别:select @@tx_isolation;
* 数据库设置隔离级别:
Set global transaction isolation level 级别字符串;

DCL(管理用户、授权)

1、管理用户
(1)添加用户
Create user ‘用户名’@’主机名’identify by ‘密码’;
注意:主机名:
localhost --> 该用户只能在本地主机登录
% --> 该用户可以在任意主机上登录
(2)删除用户
(3)修改用户密码
(4)查询用户