• PYTHON1.day20


    上次内容回顾
    1. 约束
       1)什么是约束:数据库层面提供的数据
          检查规则,目的保证数据的完整性、
          一致性、正确性。这些规则是强制性
       2)类型:非空、唯一性、主键、默认值、
         自增长、外键约束
    2. 索引
       1)什么是索引:提高查询效率
       2)原理:避免全表扫描
       3)类型:
          普通索引、唯一索引
          单列索引、组合索引
       4)优缺点
         - 优点:提高查询效率,唯一索引保证
           数据唯一性,快速找到数据
         - 缺点:额外空间,额外时间,降低增、
           删、改效率
       5)索引使用原则
         - 在恰当的字段,使用恰当索引
         - 索引不宜过多
         - 对于频繁变更的表不宜建太多索引
         - 在经常用于查询、排序、分组的
           字段上建立索引
         - 字段值太少不适合建立索引
         - 很少查询的字段不是和建立索引
         - 数据量太少不适合建立索引
         - 二进制类型字段不适合建立索引
        
    今天内容
    1. 数据导入导出
       1)导出
         - 格式:
           select查询语句
           into outfile '文件名称'
           fields terminated by '字段分隔符'
           lines terminated by '行分隔符'

         - 示例:导出acct表中数据
           第一步:查看secure_file_priv变量值
             show variables like 'secure_file%'

           第二步:执行导出
             select * from acct
             into outfile
             '/var/lib/mysql-files/acct.csv'
             fields terminated by ','
             lines terminated by ' ';
           第三步:查看导出结果(Linux命令行中执行)
             sudo cat /var/lib/mysql-files/acct.csv
         
       2)导入
         - 格式:
           load data infile '文件路径'
           into table 表名
           fields terminated by '字符分隔符'
           lines terminated by '行分隔符';

         - 示例:
           load data infile
           '/var/lib/mysql-files/acct.csv'
           into table acct
           fields terminated by ','
           lines terminated by ' ';
       
          
    2. 子查询(重点)
       1)什么是子查询:一个查询语句中嵌套了另
          一个查询,也叫嵌套查询。

       例如:
          select * from acct
          where cust_no in ( -- 外层查询
            select cust_no from customer
            where status = 1 -- 子查询
          )

         说明:
           括号中的部分称为子查询
           子查询返回一个集合
           子查询的结果要和条件要求匹配
           先执行子查询,再执行外层查询
           子查询只执行一遍
       2)使用子查询的情况:一个查询语句无法
          实现或实现不方便,使用子查询
       3)单表子查询:子查询、外层查询是一个表
         - 语法:
           select 字段列表 from 表A where 条件
           (select 字段列表 from 表A)

         - 示例:查询账户表中,余额大于平均
           余额的账户
           select * from acct where balance >
           (select avg(balance) from acct)
           -- 等价于:
           select * from acct
           where balance > 6612.50

       4)多表子查询:子查询、外层查询非同一个表
         - 语法:     
           select 字段列表 from 表A where 条件
           (select 字段列表 from 表B where 条件)
         
         - 示例:查询所有发生过交易的账户信息
           select * from acct where acct_no in
           (select acct_no from acct_trans_detail)

          
           -- 查询所有没有发生过交易的账户
           select * from acct_new where acct_no not in
           (select distinct acct_no from acct_trans_detail)   distinct#去重

          
           -- 查询发生过1500元以上交易金额的账户
            select * from acct where acct_no in
           (
             select acct_no from acct_trans_detail
             where amt > 1500
           )

          
    3. 连接查询(联合查询)(重点,难点!!!)
       1)什么是连接查询:将两个(或以上)的表连接
          起来,得到一个查询结果(一个表)
       2)什么情况下使用联合查询:当从一个表中无法
          查询到想要的全部数据时使用
          (前提是多表之间有关联关系)
       3)格式
         - select 字段列表 from 表A,表B
           where 关联条件
           -- 如果关联不正确,产生笛卡儿积
       
          select a.acct_no, a.balance, b.amt
           from acct a, acct_trans_detail b
           where a.acct_no = b.acct_no;-- 关联条件
         
        
       4)笛卡尔积
         - 定义:两个集合的乘积,表示用集合中的
           元素两两组合,产生新的集合
         - 意义:表示两个集合所有组合的可能
           如:A集合表示学生,B集合表示课程
               A*B 表示所有学生选课的可能组合

              A集合表示所有声母,B集合表示所有韵母
               A*B 表示所有发音的可能组合
         - 笛卡儿积和关系:
           笛卡尔积中包含不存在、无意义的组合
           将这部分组合排除,就得到关系(二维表)
          
       5)连接的分类
         a)内连接:没有匹配(或关联)到的记录不显示
           - 格式:select 字段列表 from 表A
                   inner join 表B
                   on 关联条件

           - 示例:查询账户、户名、交易日期、交易金额
             select a.acct_no, a.acct_name,
                    b.trans_date, b.amt
             from acct a inner join acct_trans_detail b
             on a.acct_no = b.acct_no;   
           
             课堂练习:编写一个查询语句,从acct和customer
             表做内连接查询,查询结果包含的字段有:
             acct_no  acct_name  cust_no  tel_no
             select a.acct_no, a.acct_name,
                    b.cust_no, b.tel_no
             from acct a inner join customer b
             on a.cust_no = b.cust_no;
             或
             select a.acct_no, a.acct_name,
                    b.cust_no, b.tel_no
             from acct a, customer b
             where a.cust_no = b.cust_no;       
        
         b)外连接: 分为左连接、右连接
           - 左连接:左表为主(第一个表),左表的数据
             全部显示,右表数据去匹配。如果匹配到,
             将右表字段的值连接在后面,如果没有匹配
             到,则填NULL

           - 格式:
             select 字段列表 from 表A
             left join 表B
             on 关联条件

           - 示例:查询账号、户名、交易日期、交易金额
             如果某账户没有交易明细,则交易日期、交易
             金额字段填写空值
             select a.acct_no, a.acct_name,
                    b.trans_date, b.amt
             from acct a
             left join acct_trans_detail b
             on a.acct_no = b.acct_no;

            
             课堂练习:编写一个查询语句,从acct和customer
             表做左连接(acct为左表)查询,查询结果包含
             的字段有:
             acct_no  acct_name  cust_no  tel_no
             select a.acct_no, a.acct_name,
                    b.cust_no, b.tel_no
             from acct a left join customer b
             on a.cust_no = b.cust_no;
            
           - 右连接:以右表(第二个表)为主表,右表的值
             全部显示,左表进行匹配,匹配到则填入左表
             的值,匹配不到则填空值
             格式:
               select 字段列表 from 表A
               right join 表B
               on 关联条件
              
             示例:查询账号、户名、交易日期、交易金额
             右表(交易明细)全部显示,如果没有匹配到
             账号、户名,则填空值
             select a.acct_no, a.acct_name,
                    b.trans_date, b.amt
             from acct a
             right join acct_trans_detail b
             on a.acct_no = b.acct_no;

    4. 权限管理
       1)权限:用户可以进行哪些操作
       2)分类:
         - 用户类:创建/删除用户,给用户授权
         - 库/表操作:创建/删除/修改库
                      创建/删除/修改表   
         - 数据操作:增、删、改、查

       3)权限用户分类
         - root:最高权限用户,可以执行所有操作
         - 大权限用户:可以执行数据库大部分操作
         - 小权限用户:只能查询
        
       4)权限表:MySQL中存放权限设置表
         - user表:最重要的权限表,记录允许连接到
                      服务器的账号、权限信息
         - db表:记录授权库的信息
         - table_priv表:记录授权表的信息
         - columns_priv表:记录授权字段的信息
        
       5)如何授权
         - 语法:
           grant 权限列表 on 库名.表名
           to '用户名'@'客户端地址'
           [identified by '密码']
           [with grant option]      该授权用户有无授权权限 
     
         - 说明:
           权限列表:用户可以执行的操作
             all privileges: 所有权限
             select: 表示select单个权限
             select,update,delete,...:分别指定权限

          库名.表名
             *.*       表示所有库下所有表
             bank.acct 表示bank库下acct表
             bank.*    表示bank库下所有表
           客户端地址
             %         表示所有客户端
             localhost 表示本机
             192.168.0.5  表示指定IP地址的机器
           [with grant option]:对其他用户授权权限

          
         示例1:对Tom用户授权,能对所有库、所有表
         进行查询,限定只能从本机登陆
         并将密码设置为'123456'
           grant select on *.* to 'Tom'@'localhost'
           identified by '123456';
           Flush PRIVILEGES;   -- 刷新权限并生效
           -- 重新用Tom登陆执行查询、插入验证
           -- 查看user表中的权限,首先进入mysql库
           select * from user where user='Tom'G
         
         课堂练习:对bank_user用户授权,能对bank库
         下所有表所有表增、删、改、查,限定能从
         任意客户端登陆,并将密码设置为'123456'
         grant insert,delete,update,select
         on bank.* to 'bank_user'@'%'
         identified by '123456';

  • 相关阅读:
    电子书下载:Pro jQuery
    神鬼传奇小技巧:教你如何修改自己想要的时装
    用虚拟机玩游戏的方法!! 开3D加速!
    如何让DevExpress的DateEdit控件正确显示日期的周名
    SOAP Version 1.2
    Delphi中的容器类
    <神鬼传奇>客户端终极优化精简方法
    今日阅读20090102基本数据结构
    判断一个char[]里是否包含两个连续的\r\n
    蛙蛙推荐:改进同步等待的网络服务端应用
  • 原文地址:https://www.cnblogs.com/shengjia/p/10385608.html
Copyright © 2020-2023  润新知