MySQL学习(5)----多表查询、事务、DCL

1.多表查询

mysql> select * from employee;
+----+------+-----+--------+
| id | name | age | dep_id |
+----+------+-----+--------+
|  1 | 张三 |  24 |      1 |
|  2 | 刘备 |  27 |      2 |
|  3 | 关于 |  22 |      2 |
+----+------+-----+--------+
3 rows in set

mysql> select *from department;
+----+----------+--------------+
| id | dep_name | dep_location |
+----+----------+--------------+
|  1 | 研发部   | 广州         |
|  2 | 销售部   | 深圳         |
+----+----------+--------------+
2 rows in set

mysql> select *from employee,department;
+----+------+-----+--------+----+----------+--------------+
| id | name | age | dep_id | id | dep_name | dep_location |
+----+------+-----+--------+----+----------+--------------+
|  1 | 张三 |  24 |      1 |  1 | 研发部   | 广州         |
|  1 | 张三 |  24 |      1 |  2 | 销售部   | 深圳         |
|  2 | 刘备 |  27 |      2 |  1 | 研发部   | 广州         |
|  2 | 刘备 |  27 |      2 |  2 | 销售部   | 深圳         |
|  3 | 关于 |  22 |      2 |  1 | 研发部   | 广州         |
|  3 | 关于 |  22 |      2 |  2 | 销售部   | 深圳         |
+----+------+-----+--------+----+----------+--------------+
6 rows in set

笛卡尔积:取集合A和B的所有组成情况。要完成多表查询要消除无用的数据。

1.1内连接查询:

       /**  查询哪些字段?     从哪些表中查询数据?    条件是什么?**/

           <1>隐式内连接:使用where 条件消除无用数据。

                          SELECT
                                  employee.`name`,
                                  employee.dep_id,
                                  department.dep_name
                           from

                                  employee,

                                  department
                           WHERE
                                   employee.dep_id = department.id       

           <2>显式内连接:

                                 语法:select  字段列表  from   表名1  【inner】  join  表名2   on  条件

                                  select  *  from  employee  inner  join  department  on  employee.dep_id=department.id;

1.2外连接查询:

          <1>左外连接:查询左表所有记录及其交集部分

                                  语法:select  字段列表  from   表名1(左)   left  【outer】  join  表名2(右)   on  条件

          <2>右外连接:查询右表所有记录及其交集部分

                                  语法:select  字段列表  from   表名1(左)   right  【outer】  join  表名2(右)   on  条件

1.3子查询:

        定义:查询中嵌套查询,称嵌套的查询为子查询。

       <1>子查询的结果是单行单列的。(子查询可以作为条件,使用运算符去判断)

                              例如:查询员工中年龄最大的员工的信息

                              select  * from  employee   where  employee.age=(select max(age) from employee); 

        <2>子查询的结果是多行单列的。(子查询可以作为条件,使用  in 去判断)

                              例如:查询销售部和研发部所有的员工信息

                              select   *   from  employee

                              where  employee.dep_id
                                          in( select  id  from  department  

                                                 where  dep_name='研发部'   or dep_name='销售部' );

       <3>子查询的结果是多行多列的。(子查询可以作为一张虚拟表,进行表的查询)

                            例如:查询入职日期是2011-11-1之后的员工信息和部门信息

                            select  *  from department  t1 ,(select * from employee where employee.join_date > 2011-11-1) t2

                            where  t1.id=t2.dept_id;

2.事务

2.1基本介绍:

        <1>概念:如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。

        <2>操作:开启事务:start   transaction;

                         回滚:rollback;

                         提交事务:commit;

        <3>事务提交的两种方式:

                        自动提交:MySQL默认是自动提交,Oracle默认手动提交

                        手动提交:先开启,再提交。(开启但不提交,会自动回滚)

        <4>查看事务的默认提交方式:select   @@autocommit;(0代表手动提交,1代表自动提交)

        <5>修改事务的默认提交方式:set   @@autocommit=0;(0代表手动提交,1代表自动提交)

2.2事务的四大特征:

        <1>原子性:不可分割的最小操作单位,要么同时成功,要么同时失败。

        <2>持久性:事务提交或回滚后,数据库会持久化的保存数据。

        <3>隔离性:多个事务之间相互独立。

        <4>一致性:事务操作前后,数据总量不变。 

2.3事务的隔离级别:

        概念:多个事务之间隔离的,相互独立的,如果多个事务操作同一批数据,则会引发问题,设置不同的隔离级别可以解决这些问题。

        存在问题:

                       <1>脏读:一个事务,读取到另一个事务中没有提交的数据。

                       <2>不可重复读(虚读):在同一事务中,两次读取到的数据不一样。

                       <3>幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。

        隔离级别:

                       <1>read   uncommitted:读未提交

                                                       产生的问题:脏读,不可重复读,幻读

                       <2>read  committed:读已提交

                                                      产生的问题:不可重复读,幻读

                       <3>repeatable  read:可重复读(MySQL默认的隔离级别)

                                                     产生的问题:幻读

                       <4>serializable:串行化

                                                     可解决所有问题

           /**隔离级别安全性越高,效率越低**/

        查询隔离级别:select @@tx_isolation;

        设置隔离级别:set  global  transaction  isolation   level   级别字符串;

3.DCL 

            1.管理用户

                    <1>添加用户:create  user  '用户名'@'主机名'  identified  by  '密码';

                    <2>删除用户:drop  user  '用户名'@'主机名';

                    <3>查询用户:use  mysql;  #切换到mysql表

                                            select  *  from user;  #查询user表

                    <4>修改用户: update user set password =password('新密码') where user='用户名';

                                            set  password  for '用户名'@'主机名'=password('新密码');

            2.权限管理

                   <1>查询权限:show grants  for '用户名'@'主机名';

                   <2>授予权限:grant  权限列表  on  数据库名.表名  to  '用户名'@'主机名';

                   <3>撤销权限:revoke  权限列表  on  数据库名.表名   from  '用户名'@'主机名';

发布了19 篇原创文章 · 获赞 0 · 访问量 585

猜你喜欢

转载自blog.csdn.net/qq_44617005/article/details/102870578
今日推荐