欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多表查询、事务、DCL

程序员文章站 2022-05-29 22:05:52
...

多表查询

  查询语法:

          Select

                 列名列表

          From

                 表名列表

          Where-----

SELECT

  • FROM dept,emp; – A*B组合 笛卡尔积

     分类:
    

1. 内连接查询

1).隐式内连接:用where来消除无用的内连接

SELECT
emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.dep_id = dept.id;

SELECT

    t1.name,t1.gender,t2.name

FROM

    emp t1,dept t2

WHERE

           t1.dep_id

= t2.id;

2).显示内连接

    语法:select 字段列表 from 表名1

inner join 表名2 on 条件

    SELECT * FROM

emp INNER JOIN dept ON emp.dep_id=dept.id;(inner可以省略)

3).内连接查询

    1.从哪些表中查询数据

    2.条件是什么

    3.要查询哪些字段
  1. 外链接查询(前左后右)**

1).左外连接

    语法:select 字段列表 from 表1

left [outer] join 表2 on 条件;

    查询左表所有数据以及交集部分。

2).右外连接

    语法:select 字段列表 from 表1 right

[outer] join 表2 on 条件;

    查询右表所有数据以及交集部分。

子查询

概念:查询中嵌套查询,嵌套的查询就是子查询。

SELECT * FROM
emp WHERE salary=(SELECT MAX(salary) FROM emp);

子查询的不同情况

  1. 子查询的结果是单行单列的(结果可用运算符判断 )

SELECT * FROM
emp WHERE salary<(SELECT AVG(salary) FROM emp);

  1. 子查询的结果是多行单列的

SELECT * FROM
emp WHERE dep_id IN(SELECT id FROM dept WHERE NAME=‘财务部’
OR NAME=‘市场部’);

子查询可以作为条件,用in来进行判断

  1. 子查询的结果是多行多列的

子查询结果作为一张虚拟表,一同进行后续查询

SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.join_date >
‘1994-01-01’) t2

WHERE t1.id=t2.dep_id;

(可以用普通内连接实现,AND并列多个条件即可)

事务

事务的基本介绍

1).概念:如果一个包含多个步骤业务,被事务管理,要么同时成功,要么同时失败。

2).操作:1—开启事务:start transaction

            2—回滚:rollback

            3—提交:commit

SELECT * FROM account;

UPDATE account SET balance=1000;

START TRANSACTION;

UPDATE account SET balance=balance + 500 WHERE id=1;

– 出错了。。。

UPDATE account SET balance= balance - 500 WHERE id=2;

COMMIT;

ROLLBACK;

4.数据库中事务默认自动提交

一条DML语句会自动提交一次事务

事务提交的两种方式:

  1. 自动提交:MySQL就是自动提交的(oracle默认手动提交)

  2. 手动提交:需要先开启事务,最后提交

修改事务的默认提交方式:查看事务的默认提交方式

SELECT @@autocommit;(set @@autocommit进行设置)1自动 0手动

2.事务的四大特征:

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

   2).持久性:当事务提交或回滚后,数据库会持久化的保存数据

   3).隔离性:多个事务之间相互独立

   4).一致性:事务操作前后,数据总量不变

3.事务的隔离级别(不太重要)

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

2).存在问题:

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

   2.不可重复读:在同一个事务中,两次读取到数据不一样。

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

3).隔离级别

1.read uncommitted:读未提交。

          *产生问题:上述问题均有。

2.read committed:读已提交

          *产生问题:2,3

3.repeated read:可重复读(MySQL默认)

          *产生问题:3

4.serializable:串行化

          可解决所有问题

***隔离级别安全性越来越高,但是效率越来越低

4.数据库查询隔离级别

Select @@tx_isolation

5.数据库设置隔离级别

Select global transaction isolation level 级别

DCL:管理用户,授权

1. 管理用户

1).添加用户

– 创建用户

CREATE USER ‘用户名’@‘主机名’ IDENTIFIED BY ‘密码’;

2).删除用户

DROP USER ‘用户名’@‘主机名’;

3).修改用户密码

UPDATE USER SET PASSWORD = PASSWORD(‘abc’)
WHERE USER = ‘用户名’;

SET PASSWORD FOR ‘用户名’@‘localhost’ =
PASSWORD(‘abc’);

*忘记了root用户的密码— cmd–net stop mysql停止MySQL服务(管理员运行)

                          使用无验证方式启动mysql服务-----mysqld—skip-grant-tables

                          任务管理器手动结束mysqld

                          重新启动后正常设置密码,再次重启即可

4).查询用户

– 1.切换到MySQL数据库

USE mysql;

– 2.查询user表

SELECT

  • FROM USER;

*通配符 % 表示可以在任意主机使用用户登陆

2. 授权

  1. 查询权限

SHOW GRANTS FOR ‘root’@‘localhost’;

  1. 授予权限

GRANT 权限列表(ALL) ON 数据库名.表名(.) TO ‘用户名’@‘主机名’;

  1. 撤销权限

REVOKE 权限列表 ON 数据库名.表名 FROM ‘用户名’@‘主机名’;