美文网首页
MySQL(Mariadb)总结2 - SQL知识点汇总

MySQL(Mariadb)总结2 - SQL知识点汇总

作者: drfung | 来源:发表于2017-11-10 09:49 被阅读38次
    • 开发DBA:
      数据库设计(E-R关系图)、SQL开发、内置函数、存储例程(存储过程和存储函数)、触发器、事件调度器(event scheduler)
    • 管理DBA:
      安装、升级,备份、恢复,用户管理、权限管理,监控、分析、基准测试,语句优化(SQL语句),数据字典,按需要配置服务器(服务器变量:MyISAM, InnoDB, 缓存, 日志)

    SQL语言组成部分

    DDL:
    DML:
    完整性定义语言:DDL的一部分功能
    主键、外键、惟一键、条件、非空、事务
    视图定义:虚表,存储下来的SELECT语句
    事务控制:
    嵌入式SQL和动态SQL:
    DCL:授权

    数据类型的功能:

    1. 存储的值类型
    2. 占住的存储空间大小
    3. 定长和变长
    4. 如何被索引及排序
    5. 是否能够被索引

    数据字典:

    系统编目(system catalog)
    保存数据库服务器上的元数据(表名,表的属性等)

    元数据:

    • 关系的名字
    • 每个关系的各字段的名字
    • 各字段的数据类型和长度
    • 约束
    • 每个关系上的视图的名字及视图的定义
    • 授权用户的名字
    • 用户的授权和账号信息
    • 统计类数据
      • 每个关系字段的个数
      • 每个关系中的行数
      • 每个关系的存储方法

    保存元数据的数据库:

    • mysql
    • information_schema
    • performance_schema(虚库)

    Developing With MySQL

    数据类型

    • 字符型
      • char
      • varchar
      • binary
      • varbinary
      • text
      • blob
    • 数值型
      • 精确数值型
        • 整型
        • 十进制数据:decimal
      • 近似数据型
        • 单精度浮点型
        • 双精度浮点型
    • 日期时间型
      • 日期型
      • 时间型
      • 日期时间型
      • 时间戳
    • 布尔型
    • 内建类型
      • Enum
      • Set

    数值类型

    • TINYINT

    • SMALLINT

    • MEDIUMINT

    • INT

    • BIGINT

    • DECIMAL

    • FLOAT

    • DOUBAL

    • BIT

    字符型:

    • CHAR

    • VARCHAR

    • TINYTEXT

    • TEXT

    • MEDIUMTEXT

    • LONGTEXT

    • BINARY

    • VARBINARY

    • TINYBLOB

    • BLOB

    • MEDIUMBLOB

    • LONGBLOB

    • ENUM

    • SET

    日期时间型:

    • DATE
    • TIME
    • DATETIME
    • TIMESTAMP
    • YEAR

    字符型常用字段修饰符

    NOT NUll
    NULL
    DEFAULT [string] 不适用于TEXT类型
    CHARACTER SET [字符集]
    - 查询当前使用的字符集 show VARIABLES LIKE '%char%'
    - 查询支持的字符集 shwo CHARACTER SET
    COLLATION '规则' 排序规则
    - 查看排序规则 show COLLATION

    AUTO_INCREMENT 自动增长,非空,且唯一,支持索引,非负
    UNSIGNED 无符号

    SQL模式SQL_MODE

    mysql模式有TRADITIONAL,STRICT_TRANS_TABLES,STRICT_ALL_TABLES

    设定服务器变量值:(仅用于支持动态的变量)

    支持修改的服务器变量:

    • 动态变量: 可以MySQL运行时修改
    • 静态变量: 于配置文件中修改其值,并重启后方能生效

    服务器变量从其作用范围来讲,有两类:

    • 全局变量:服务器级别,修改之后仅对新建的会话生效
    • 会话级别: 会话级别, 仅对当前会话有效

    查看服务器变量:

    show [{GLOBAL|SESSION}] VARIABLES [LIKE ''];
    select @@{GLOBAL|SESSION}.VARIABLE_NAME;
    SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='SOME_VARIABLE_NAME';
    SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='SOME_VARIABLE_NAME';
    

    修改服务器变量

    前提:仅管理员有权限修改全局变量
    SET {GLOBAL|SESSION} VARIABLE_NAME=VALUE;
    

    注意:无论是全局还是会话级别的动态变量修改,在从其mysqld后都会失效;想永久生效,只能在配置文件[mysqld]中定义。

    Mysql中的大小写区分

    1. SQL关键字及函数名不区分大小写
    2. 数据库、表及数据名称的大小写区分与否取决于底层的OS及FS
    3. 存储过程、存储函数及事件调度器的名字不区分大小写,但是触发器区分
    4. 表别名区分大小写
    5. 对字段中的数据,如果字段数据类型为Binary类型,则区分大小写,非Binary不区分大小写

    DDL语句

    数据库操作(mysql里database和schema没有区别)

    CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] [CHARACTER SET=''] [DEFAULT] [COLLATE='']
    DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
    ALTER {DATABASE|SCHEMA} db_name [DEFAULT] [CHARACTER SET=''] [DEFAULT] [COLLATE='']
    

    表操作

    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]
    
    (create_definition,...):
        字段的定义:字段名、类型和类型修饰符
        键、约束或索引:
        PRIMARY KEY, UNIQUE KEY, FOREIGN KEY, CHECK
        {INDEX|KEY}
        
    [table_options]
        ENGINE [=] engine_name
            mysql> SHOW ENGINES;
        AUTO_INCREMENT [=] value
        [DEFAULT] CHARACTER SET [=] charset_name
        [DEFAULT] COLLATE [=] collation_name
        COMMENT [=] 'string'
        DELAY_KEY_WRITE [=] {0 | 1}
        ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
        TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]
        
    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name # 复制表数据,这种方式的表的属性将会丢失
        [(create_definition,...)]
        [table_options]
        select_statement
        
    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name # 复制表结构
        { LIKE old_tbl_name | (LIKE old_tbl_name) }
        
    DROP [TEMPORARY] TABLE [IF EXISTS]
        tbl_name [, tbl_name] ...
        [RESTRICT | CASCADE]
       
    ALTER TABLE tbl_name
         [alter_specification [, alter_specification] ...]
         
    RENAME [TO|AS] new_tbl_name #改表名
    
    CONVERT TO CHARACTER SET charset_name [COLLATE collation_name] #修改字符集或者排序
    

    MyISAM表,每表有三个文件,都位于数据库目录中:

    • tb_name.frm: 表结构定义
    • tb_name.MYD: 数据文件
    • tb_name.MYI: 索引文件

    InnoDB表,有两种存储方式

    1. 默认:每表有一个独立文件和一个多表共享的文件
    • tb_name.frm: 表结构的定义,位于数据库目录中;
    • ibdata#: 共享的表空间文件,默认位于数据目录(datadir指向的目录)中;
    1. 独立的表空间:
    • tb_name.frm: 每表有一个表结构文件
    • tb_name.ibd: 一个独有的表空间文件
    练习题:
    
    新建如下表(包括结构和内容):
    
    ID    Name          Age     Gender     Course
    1     Ling Huchong   24      Male       Hamogong
    2     Huang Rong    19      Female     Chilian Shenzhang
    3     Lu Wushaung   18      Female     Jiuyang Shenggong
    4     Zhu Ziliu     52      Male       Pixie Jianfa
    5     Chen Jialuo   22      Male       Xianglong Shiba Zhang
    6     Ou Yangfeng   70      Male       Shenxiang Bannuo Gong
    
    1、新增字段:
        Class 字段定义自行选择;放置于Name字段后;
    
    2、将ID字段名称修改为TID;
    
    3、将Age字段放置最后;
    

    DML语句

    SELECT语句的执行流程:

    FROM clause --> WHERE clause --> GROUP BY --> HAVING clause --> ORDER BY ... --> SELECT --> LIMIT

    SELECT语句:
    DISTINCT:指定的结果相同的只显示一次;
    SQL_CACHE:缓存于查询缓存中;
    SQL_NO_CACHE:不缓存查询结果;

    MySQL的查询操作:

    • 单表查询:简单查询
    • 多表查询: 连续查询
    • 联合查询:

    选择和投影:

    • 投影: 挑选要显示的字段
      • select 字段1,字段2,... FROM tb_name;
    • 选择:挑选符合条件的行
      • SELECT 字段1,... FROM tb_name WHERE 子句;

    布尔条件表达式操作符:

    =
    <=>
    <>
    <
    <=
    >
    >=
    
    IS NULL
    IS NOT NULL
    
    LIKE: 支持的通配符: %(任意长度的任意字符), _(任意单个字符)
    
    RLIKE, REGEXP: 支持使用正则表达式
    
    IN: 判断指定字段的值是否在给定在列表中;
    
    BETWEEN ... AND ...: 位于指定的范围之间
    

    组合条件测试:

    NOT, !
    AND, &&
    OR, ||
    

    聚合函数:

    SUM(), AVG(), MAX(), MIN(), COUNT()
    

    练习:导入hellodb.sql,以下操作在students表上执行
    1、以ClassID分组,显示每班的同学的人数;
    2、以Gender分组,显示其年龄之和;
    3、以ClassID分组,显示其平均年龄大于25的班级;
    4、以Gender分组,显示各组中年龄大于25的学员的年龄之和;

    多表查询及子句查询

    联接查询:事先将两张或多张表join,根据join的结果进行查询;

    cross join: 交叉联结
    (a+b)(c+d+e)=

    自然联结:
    等值联结
    条件比较

    外联结:
    左外联结:只保留出现在左外连接运算之前(左边)的关系中的元组;
    left_tb LEFT JOIN right_tb ON 连接条件
    右外联结:只保留出现在右外连接运算之后(右边)的关系中的元组;
    left_tb RIGHT JOIN right_tb ON 连接条件
    全外联结

    自联结:

    别名:
    表别名
    字段别名

    练习:导入hellodb.sql,完成以下题目:
    1、显示前5位同学的姓名、课程及成绩;
    2、显示其成绩高于80的同学的名称及课程;
    3、求前8位同学每位同学自己两门课的平均成绩,并按降序排列;
    4、显示每门课程课程名称及学习了这门课的同学的个数;

    思考:
    1、如何显示其年龄大于平均年龄的同学的名字?
    2、如何显示其学习的课程为第1、2,4或第7门课的同学的名字?
    3、如何显示其成员数最少为3个的班级的同学中年龄大于同班同学平均年龄的同学?
    4、统计各班级中年龄大于全校同学平均年龄的同学。

    子查询

    在查询中嵌套的查询
    用于WHERE中的子查询
    1、用于比较表达式中的子查询
    子查询的返回值只能有一个;
    2、用于EXISTS中的子查询
    判断存在与否
    3、用于IN中的子查询;
    判断存在于指定列表中
    用于FROM中子查询:
    SELECT alias.col,... FROM (SELECT clause) AS alias WHERE condition

    MySQL不擅长于子查询:应该避免使用子查询;

    总结:MySQL的联结查询及子查询
    联结:
    交叉联结
    内联结
    外联结
    左外
    右外
    自联结
    子查询:
    用于WHERE中的子查询
    用于条件比较:子查询只能一个值
    用于IN:子查询可以返回多个值
    EXISTS:子查询可以返回多个值
    用于FROM子句的子查询

    MYSQL视图(虚表)

    存储下来的select语句
    创建:
    create view 视图名 as select语句
    删除:
    drop view 视图名

    相关文章

      网友评论

          本文标题:MySQL(Mariadb)总结2 - SQL知识点汇总

          本文链接:https://www.haomeiwen.com/subject/esnvmxtx.html