美文网首页
The Road of DBA 3_MySQL_SQL基础应用

The Road of DBA 3_MySQL_SQL基础应用

作者: Linux_淡忘 | 来源:发表于2019-06-17 13:35 被阅读0次

    1.SQL介绍

    结构化查询语言
    SQL标准:SQL 92 SQL 99
    5.7以后符合SQL92标准的严格模式
    通过sql_mode控制住
    
    1.1SQL作用
    SQL用来管理和操作MySQL内部的对象
    对象即库和表
    库:库名,属性
    表:表名,表属性,列,记录,列属性和约束  
    
    1.2 SQL语句的类型
    DDL(data definition language):数据定义语言
    DCL(data control language):数据控制语言
    DML(data manipulation language):数据操作语言
    DQL(data query language):数据查询语言
    
    1.3 数据类型
    1.3.1 作用

    控制数据的规范性,让数据有具体含义,在列上进行控制

    1.3.2种类

    字符串

    char
        char(20)
        定长长度,上限20
        存储数据时,一次性提供20字符长度的存储空间,磁盘空间固定,如果数据未占满20位,则剩余由空格填充
    varchar
        varchar(20)
         可变长度的字符串类型
         存数据时,按需进行存储空间分配。
         存数据时, 首先进行字符串长度判断,
         比如需存储的字符串是10个字符,只会分配10个字符长度的存储空间,并且会用单独占用一个字符长度来记录此次数据的字符长度
         字符长度超过255之后,需要两个字节长度记录字符长度
    enum
         enum('monday','tuesday','sunday',........)
         枚举
         枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。
    数据行较多时,会影响到索引的应用
    注意:数字类禁止使用enum类型!!
    
    image

    数字

    tinyint  : -128~127
    int       :-2^31~2^31-1
    说明:手机号是无法存储到int的。一般是使用char类型来存储收集号
    
    image

    时间

    DATETIME 
    范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
    TIMESTAMP 
    1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
    timestamp会受到时区的影响
    
    image

    二进制

    #有但是此处不研究
    
    image.png

    面试题:

    1.char和varchar的区别
    char        |    varchar
    255         |    65535
    定长        |     变长
    固定存储空间|按需分配
    
    2.char和varchar的选择
    (1)char类型,固定长度的字符串列,比如手机号,身份证,银行卡号,性别等
    (2)varchar类型,不确定长度的字符串,可以使用
    悬念:为什么影响索引高度?
    

    2.表属性

    存储引擎: engine=InnoDB
    (5.1版本为MyISAM)
    字符集:charset=utf8mb4
    utf8 中文占3字节
    utf8mb4 中文占4字节
    utf8mb4是utf8的严格超集
    utf8mb4支持emoji
    排序规则(校对规则)collation
    主要是针对英文字符串大小写问题
    

    3.列的属性和约束

    <1>PK
          主键:(Primary key)
    概念 :
    主关键字(主键,primary key)是被挑选出来,作表的行的惟一标识的候选关键字。一个表只有一个主关键字。
    主关键字又可以称为主键。主键可以由一个字段,也可以由多个字段组成,分别成为单字段主键或多字段主键。 
    作用:
    1)保证实体的完整性; 
    2)加快数据库的操作速度 
    特点:
    1) 一个表中只能有一个主键。如果在其他字段上建立主键,则原来的主键就会取消。在ACCESS中,虽然主键不是必需的,但最好为每个表都设置一个主键。 
    2)主键的值不可重复,也不可为空(NULL)。
    
    3)主键值不能被重用
    
    提示:虽然并不总是需要主键,但是多数数据库设计者都会保证他们创建的每个表具有一个主键,以便以后的数据库的操作和管理。
    数字列,整数列,无关列,自增的,聚集索引列
    是一种约束,也是一种索引类型,在一个表中只能有一个主键。
    
    <2>非空 Not NULL
    我们建议,对于普通列来讲,尽量设置not null
    默认值(default):数字列的默认值使用0,字符串类型的设置为null字符串或者nil
    <3>唯一 unique
        不能重复
    ###<4>索引  key
    <4>default 默认
    <5>自增 auto_increment
        针对数字列
        可以设置起点和偏移量
    <6>无符号 unsigned
        针对数字列,必须跟在定义数据类型后面
    <7>注释 comment
    

    5.SQL语句应用

    DDL 数据定义语言

    建表建库规范
    1.库名,表名必须是小写
    为啥?开发和生产平台可能会出问题
    2.不能以数字开头
    3.不支持  -   支持   _
    4.内部函数名不能使用
    5.名字和业务功能有关(his,)
    
    
    建库
    mysql> create database xxxx charset utf8mb4;
    Query OK, 1 row affected (0.05 sec)
    mysql> show create database xxxx;
    +----------+------------------------------------------------------------------+
    | Database | Create Database                                                  |
    +----------+------------------------------------------------------------------+
    | xxxx     | CREATE DATABASE `xxxx` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
    +----------+------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> create database oldguo1;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> show create database oldguo1;
    +----------+--------------------------------------------------------------------+
    | Database | Create Database                                                    |
    +----------+--------------------------------------------------------------------+
    | oldguo1  | CREATE DATABASE `oldguo1` /*!40100 DEFAULT CHARACTER SET latin1 */ |
    +----------+--------------------------------------------------------------------+
    1 row in set (0.00 sec)
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | oldguo1            |
    | performance_schema |
    | sys                |
    | world              |
    | xxxx               |
    | zhihu              |
    +--------------------+
    8 rows in set (0.00 sec)
    
    
    改库
    mysql> show create database oldguo1;
    +----------+--------------------------------------------------------------------+
    | Database | Create Database                                                    |
    +----------+--------------------------------------------------------------------+
    | oldguo1  | CREATE DATABASE `oldguo1` /*!40100 DEFAULT CHARACTER SET latin1 */ |
    +----------+--------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> alter database oldguo1 charset utf8;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> show create database oldguo1;
    +----------+------------------------------------------------------------------+
    | Database | Create Database                                                  |
    +----------+------------------------------------------------------------------+
    | oldguo1  | CREATE DATABASE `oldguo1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
    +----------+------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    删库(生产禁用)
    mysql> drop database oldguo1;
    Query OK, 0 rows affected (0.05 sec)
    
    
    

    建表
    create table oldguo (
    ID int not null primary key AUTO_INCREMENT comment '学号',
    name varchar(255) not null comment '姓名', 
    age tinyint unsigned not null default 0 comment '年龄',
    gender enum('m','f','n') NOT null default 'n' comment '性别'
    )charset=utf8mb4 engine=innodb;
    
    改表
    1.改表结构
    例子:
    添加列:
    --在上表中添加手机号列 +86 
    alter table stu add telnum char(14) not null unique default +86 comment '手机号';
    添加状态列
    alter table stu add state tinyint  unsigned not null default 1 comment '状态列';
    删除列
    alter table stu drop state;
    查看列信息:
    desc stu;
    在name行后面加QQ列
    alter table stu add  qq varchar(20) unique not null  comment 'QQ' after name;
     desc stu;
    在name行之前加wechat列
    alter table stu add  wechat varchar(20) unique not null  comment '微信' after id;
    在第一列加
    alter table stu add sid varchar(20) unique not null comment 'sid' FIRST;
    修改某一列属性modify
    alter table stu modify name char(20) not null comment '名字';  
     删除以上添加的列(不代表生产操作)
    切到oldboy
    USE oldboy;
    查看表列信息
    DESC oldguo;
    查看建表语句
    SHOW CREATE TABLE 
    建个一模一样的表
    CREATE TABLE oguo LIKE oldguo;
    
    
    从数据库找表
    mysql> SELECT table_schema ,table_name  FROM information_schema.tables  WHERE table_name='stu';
    +--------------+------------+
    | table_schema | table_name |
    +--------------+------------+
    | xxxx         | stu        |
    +--------------+------------+
    1 row in set (0.00 sec)
    
    mysql> 
    
    

    online-ddl:pt-osc
    删表

    alter table stu drop xxxx列名;
    

    DML数据操作语言

    insert插入

    最简单的插入数据方法
    INSERT INTO stu VALUES(1,'zyl','1234','18');
    最规范的插入数据方法
    insert into stu(name,qq,age) VALUES('zyl','123456','12');
    查看表数据(不代表生产操作)
    mysql> select * from stu;
    +----+------+--------+-----+
    | id | name | qq     | age |
    +----+------+--------+-----+
    |  1 | zyl  | 1234   |  18 |
    |  2 | zyl  | 123456 |  12 |
    +----+------+--------+-----+
    2 rows in set (0.00 sec)
    
    <*>书写规范:字符串加‘’,数字不加,根据定义类型进行区分
    
    <*>报错分析:列定义有unique,重复插入数据会报下列错误。
    [SQL] insert into stu(name,qq,age) VALUES('ss','123459',16);
    [Err] 1062 - Duplicate entry '123459' for key 'qq'
    
    

    update(操作有分享)

    替换第二行的qq号码
    update stu set qq='123' where id=2;
    

    delete

    需求1:将一个大表清空
    delete from stu;
    delete from stu where id=2;
    物理层次删除,删除区
    truncate table stu;
    面试题:delete和truncate区别
    1.delete是逻辑删除,逐行删除,而且不会降低自增长的起始值,
    效率很低,碎片很多,会 影响到性能
    2.truncate属于物理删除,原理是将表段中的区进行清空,不会产生碎片,且性能较高,
    但是truncate只能进行表的全部清空
    需求:使用update替代delete,进行伪删除
    1. 添加状态列state (0代表存在,1代表删除)
    
    ALTER TABLE oldguo ADD state TINYINT NOT NULL DEFAULT 0 ;
    
    2. 使用update模拟delete 
    DELETE FROM oldguo WHERE id=6;
    替换为
    UPDATE oldguo SET state=1 WHERE id=6;
    SELECT * FROM oldguo ;
    
    3. 业务语句修改
    SELECT * FROM oldguo ;
    改为 
    SELECT * FROM oldguo WHERE state=0;
    
    

    DQL

    select
    show

    相关文章

      网友评论

          本文标题:The Road of DBA 3_MySQL_SQL基础应用

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