zoukankan      html  css  js  c++  java
  • Mysql学习第四天

    1、跟用户相关的命令 (了解). DCL语句
        1.1、 创建一个新的用户
            CREATE USER 用户名@地址 IDENTIFIED BY '密码';
            CREATE USER jerry@localhost IDENTIFIED BY '1234';
        1.2、为用户添加权限
            语法:GRANT 权限1, … , 权限n ON 数据库.* TO 用户名@IP
            例子:GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON day15.* TO jerry@localhost;
        1.3、撤销授权
            REVOKE权限1, … , 权限n ON 数据库.* FORM 用户名
            REVOKE CREATE,ALTER,DROP ON day15.* FROM jerry@localhost;
        1.4、查看用户的权限 SHOW GRANTS FOR 用户名@主机;
            SHOW GRANTS FOR jerry@localhost;
        1.5、修改用户密码UPDATE
            UPDATE USER SET PASSWORD=PASSWORD(‘密码’) WHERE User=’用户名’ FLUSH PRIVILEGES;
            例子: UPDATE USER SET PASSWORD=PASSWORD('1234') WHERE User='jerry' FLUSH PRIVILEGES;

    2、备份数据库 (不属于sql语句)
            mysqldump -u root -p 1234 day15 > d:/day15.sql
        恢复数据库
        2.1、需要登录到数据库中
            source d:/day15.sql;
       2. 2、mysql命令恢复,不需要登录
            mysql -u root -p day15 < d:/day15.sql

    3、多表
        我们现在使用的数据库叫做关系型数据库.
        3.1、表关系
            一对多/多对一: 在多的一方加入1的一方的外键
            多对多: 使用中间表,分别引用两方的ID
            一对一:
              1> 主键同步 两个表中有关系的记录id一致.
              2> 在1方加入 另一方的外键
              3> 在另一方加入外键.
        3.2、多表数据完整性约束
            外键约束
            增加一个外键约束
            ALTER TABLE `day16`.`emp` ADD CONSTRAINT `fk_emp_dept` FOREIGN KEY (`DEPTNO`) REFERENCES `day16`.`dept`(`DEPTNO`);
            删除一个外键约束
            ALTER TABLE `day16`.`emp` DROP FOREIGN KEY `emp_ibfk_1`;
            外键约束保证了数据的完整性.加入外键约束后, 如果主键被任何一个外键所引用.那么无法删除这条记录.只要在所有引用都删除的情况下,才可以删除这条记录.
              非空约束 not null
              唯一约束 unique
              主键约束 primary key

    4、多表查询
        笛卡尔积
            select * from emp,dept;
         这种查询会将两个表的记录 分别逐个连接. 得到的记录数 是两个表记录数相乘的结果.
         这种查询往往是没有意义的. 因为会产生很大一部分无效数据.
         开发中应避免出现笛卡尔积的情况.
      内连接
           *查询所有有部门的员工以及员工的部门信息
           select * from emp,dept where emp.deptno = dept.deptno;
        这种查询就是内连接查询.
        展示内连接的完整写法.
        select * from emp inner join dept on emp.deptno = dept.deptno;

        外连接
          左外连接
          *查询所有员工信息(包括没有部门的员工),以及部门信息.
          select * from emp left join dept on emp.deptno= dept.deptno;

         右外连接
          *查询所有部门信息(包括没有员工的部门),以及员工信息.

    =====================================================================================

    5、子查询
          概念: 就是一个查询的条件需要用到另一个查询的结果.使用子查询就是将两个sql语句嵌套一步完成.
        -- 查询出 所有员工中 工资高于名叫 SMITH 的员工信息
        -- 子查询的结果是 1行1列 => 当作一个值
        -- 传统方式 2步
         -- 1> 查询SMITH
              SELECT sal FROM emp WHERE ename='SMITH';
         -- 2> 工资高于名叫 SMITH 的员工信息
              SELECT * FROM emp WHERE sal > 800;
        -- 子查询
              SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='SMITH');

        -- 问题: 相比传统查询,子查询会提高查询效率吗? 不会
        -- 查询出 所有员工中 比 20号部门 所有员工工资都高的员工信息
        -- 子查询的结果是 多行1列 => 当作一个集合
        -- 传统
              SELECT MAX(sal) FROM emp WHERE deptno=20;
              SELECT * FROM emp WHERE sal > 3000;
       -- 子查询
          -- SELECT * FROM emp WHERE sal > (SELECT MAX(sal) FROM emp WHERE deptno=20);
          SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=20);
       -- 查询出 所有员工中 比 20 号部门最低的工资高的员工信息
       -- 子查询的结果是 多行1列
        -- 子查询
            SELECT * FROM emp WHERE sal > (SELECT MIN(sal) FROM emp WHERE deptno=20);
           SELECT * FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE deptno=20);
    -- 查询出 员工信息 以及 员工领导的名字
    -- 子查询的结果是 多行多列 => 当作一张表
            SELECT e1.`ENAME` AS 员工名称 , e2.`ENAME` AS 领导名称 FROM emp e1,emp e2   WHERE e1.`MGR` = e2.`EMPNO`;
            SELECT e1.`ENAME` AS 员工名称 , e2.`ENAME` AS 领导名称 FROM emp e1,(SELECT *  FROM emp) e2 WHERE e1.`MGR` = e2.`EMPNO`;

    子查询分类:
    一行一列,将子查询的结果当做单个值.
    多行一列,将子查询结果当做一个集合.
    多行多列,将子查询结果当做一张表.

    子查询关键字:
    all
    条件 > all(子查询) --> 大于子查询中最大值
    条件 >= all(子查询) --> 大于等于子查询中最大值
    条件 < all(子查询) --> 小于子查询中最小值
    条件 <= all(子查询) --> 小于等于子查询中最小值
    any
    条件 > any(子查询) --> 大于子查询中最小值
    条件 >= any(子查询) --> 大于等于子查询中最小值
    条件 < any(子查询) --> 小于子查询中最大值
    条件 <= any(子查询) --> 小于等于子查询中最大值

    子查询比较普通查询会不会提高效率?
    子查询不会提高效率.

  • 相关阅读:
    NodeJS优缺点及适用场景讨论
    gitHub安装步骤
    ubuntu16.04爬坑
    Dubbo入门
    oracle11g的卸载
    数据库对象的创建和管理
    oracle数据库中的面试题
    dml数据操作和tcl事务管理
    oracle sql单行函数 常用函数实例
    oracle查询语句汇总与分类
  • 原文地址:https://www.cnblogs.com/java0619/p/8397606.html
Copyright © 2011-2022 走看看