zoukankan      html  css  js  c++  java
  • 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';

  • 相关阅读:
    (网页)中的简单的遮罩层
    (后端)shiro:Wildcard string cannot be null or empty. Make sure permission strings are properly formatted.
    (网页)jQuery的时间datetime控件在AngularJs中使用实例
    Maven Myeclipse 搭建项目
    MyBatis 环境搭建 (一)
    java 常用方法
    XML 基础
    JS BOM
    js 事件
    js 的使用原则
  • 原文地址:https://www.cnblogs.com/shengjia/p/10385608.html
Copyright © 2011-2022 走看看