多表很难水很深弄懂要慢慢理解

多表查询和事务

多表的查询

1.笛卡尔积

SELECT*FROM 表1,表2; -- 计算公式 表1*表2

2.内连接查询:

    A.隐式:SELECT*FROM 表1,表2 WHERE 表1.列1=表2.列2;-- 其中的表可以取别名(常用)
    B.显式:SELECT*FROM 表1 INNER JOIN 表2 ON 表1.列1=表2.列2;-- INENR可以省略
        ①.特点 两表交集部分取数据多的
        ②.两表内连接查询的时候 最多的结果数是交集多的 最少0条(完全不相交)

3.外连接查询

    A.左外连接:SELECT*FROM 表1 LEFT OUTER JOIN 表2 ON 表1.列1=表2.列2;-- outer可以省略 特点:左表的全部内容+左右表的交集 
    B.右外连接:SELECT*FROM 表1 RIGHT OUTER JOIN 表2 ON 表1.列1=表2.列2;-- outer可以省略 特点:右表的全部加上左右表的交集
    C.例如:两个表左外连接查询的时候,
            表1有5条数据,表2有10条数据
            左表是 表1,右表是 表2
            最多14条,最少5条

4.子查询:一个查询语句的结果是下一个查询语句的条件.

    A.一个查询语句的结果是下一个查询语句的条件.
                                            查到的最高工资的员工作为条件
    SELECT * FROM yuangong WHERE gongzi = (SELECT MAX(gongzi) FROM yuangong);
    B.多行单列,主要采用的 IN(选项1,选项2,选项3)
                                        查询到的市场部和财务部的ID作为条件
    SELECT * FROM yuangong WHERE id IN (SELECT id FROM yuangong WHERE name IN ('财务部','市场部')); 
    C.多行多列,作为虚拟表,进行的连接查询.
        (代码都是举例的相应替换就好) 查询入职日期是2011-11-11日之后的员工信息和部门信息
        ①:子查询结果                 
        SELECT * FROM bumen t1 ,(SELECT * FROM yuangong WHERE yuangong.join_date > '2011-11-11') t2 WHERE t1.id = t2.bumen_id;
        ②:普通内连接
        SELECT * FROM bumen t1 , yuangong t2  WHERE  t1.id = t2.bumen_id AND t2.join_date > '2011-11-11';

5、多表查询的分析思路:

        A.确定查询的表         FROM 表名称...
        B.查询的条件           WHERE  条件...  ---> 需要查看表结构(主外键) 大小...
        C.查询的结果           SELECT 结果...

数据库事务

1、事务的概念

    在多个操作的SQL语句当中,要么同时成功执行,要么同时失败执行。

2、操作步骤:

    A.开启事务                              START TRANSACTION
    B.回滚(出问题了,需要回到开启事务之前)       ROLLBACK
    C.提交(正常执行,将改变的数据提交结束事务) COMMIT

3、查看和修改事务的提交方式

    A.查看事务的提交方式 SELECT @@autocommit;
    B.修改事务的提交方式 SET @@autocommit = 0;  -- 0表示手动提交,1表示自动提交

4、事务的四大特征

    A.原子性: 在事务的多个SQL语句当中,不可以分割开来
    B.持久性: 发生回滚和提交的时候,数据持久的保存在硬盘上面
    C.隔离性: 尽可能的多个事务之间没有影响
    D.一致性: 事务前后的总量不能改变

5、隔离级别

    A.存在问题
        a.脏读:事务X读取到事务Y,未提交的数据.
        b.虚读(不可重复读):在同一个事务当中,两次读取的数据不一样。
        c.幻读:事务X在操作数据库当中所有的记录,事务Y在添加一条新的记录。事务X读取不到自己的修改
    B.对应的级别
        a. READ UNCOMMITED 读未提交 (出现"脏读","虚读","幻读")
        b. READ COMMITED  读提交 (出现"虚读","幻读")  ---> Oracle 默认采用
        c. REPEATABLE READ 可重复读 (出现"幻读") ---> MySQL 默认采用
        d. SERIALIZABLE 串行化 (可以解决所有问题,效率低)
    C.设置和查看隔离级别
        a.查看隔离级别
            SELECT @@TX_ISOLATION;
        b.设置隔离级别
            SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;

DCL管理用户

1、创建用户(账号密码)

    语法: CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';  -- 主机名 本机 localhost 任意主机 %

2、删除用户(账号)

    语法: DROP USER '用户名'@'主机名';

3、修改用户密码

    语法1: UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';
    语法2: SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');

4、查询用户(账号密码)

    语法: USE mysql;  SELECT * FROM user;  -- 先要使用mysql自己的数据库,然后查询user表

5、忘记了超级管理员用户密码之后的解决方案:

    a. cmd 输入 net stop mysql  -- 停止mysql服务 需要管理员运行该cmd
    b. 使用无验证方式启动mysql服务: mysqld --skip-grant-tables
    c. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
    d. use mysql;
    e. update user set password = password('你的新密码') where user = 'root';
    f. 关闭两个窗口
    g. 打开任务管理器,手动结束mysqld.exe 的进程
    h. 启动mysql服务
    i. 使用新密码登录。

6、数据库权限

    A.查询权限
        语法: SHOW GRANTS FOR '用户名'@'主机名';
    B.授予权限
        语法: GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';  -- 标准格式
        语法: GRANT ALL ON *.* TO 'zhangsan'@'localhost';  -- 给张三本机用户授予所有的权限
    C.撤销权限
        语法: REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
        案例: REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';  -- 撤销李四在所有机器上面的 UPDATE 权限

猜你喜欢

转载自blog.csdn.net/LIDIADIA/article/details/82390440