zoukankan      html  css  js  c++  java
  • K002004-0x03MySQL的SQL基础

    K002004-0x03MySQL的SQL基础
    1.SQL介绍
    结构化的查询语言,关系型数据库中用的一类语言。
    SQL标准 89 92 99 03
    MySQL

    2.SQL类常用型
    2.1 mysql自带的功能
    mysql> help
    2.2 server端命令
    mysql> help contents

    DDL:数据定义语言
    DCL:数据控制语言
    DML:数据操作语言
    DQL:数据查询语言

    3.SQL的各种名词
    3.1 SQL_mode SQL模式
    作用:规范SQL语句书写方式。
    mysql> SELECT @@sql_mode;
    ONLY_FULL_GROUP_BY,
    STRICT_TRANS_TABLES,
    NO_ZERO_IN_DATE,
    NO_ZERO_DATE,
    ERROR_FOR_DIVISION_BY_ZERO,
    NO_AUTO_CREATE_USER,
    NO_ENGINE_SUBSTITUTION

    例子:
    比如说:在现实的数学角度,除法运算中,除数不能为0.
    当MySQL中需要做除法运算时,为了保证符合现实的数学逻辑,也要求保证除数不能为0.
    所以MySQL通过设定sql_mode参数值,规范我们的除法运算,从而保证违背现实数学逻辑的sql语句
    再比如说:
    现实情况下,我们描述日期是,0年0月0日 在现实中是不被允许的。
    NO_ZERO_IN_DATE
    NO_ZERO_DATE

    3.2 字符集(charset)及校对规则(collation)
    字符集:
    utf8 :最大存储长度,单个字符最多3个字节
    utfmb4 (建议):最大存储长度,单个字符最多4个字节
    差别:
    utfmb4支持的编码比utf8更多
    举个例子:比如,emoji字符在mb4中支持,utf8中不支持。emoji字符,一个字符占用4个字节
    例如:
    #5.7 默认是Latin1
    mysql> show charset
    mysql> create database zabbix1 charset utf8mb4;
    Query OK, 1 row affected (0.00 sec)

    mysql> show create database zabbix1;
    +----------+---------------------------------------------------------------------+
    | Database | Create Database |
    +----------+---------------------------------------------------------------------+
    | zabbix1 | CREATE DATABASE `zabbix1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
    +----------+---------------------------------------------------------------------+
    1 row in set (0.00 sec)

    mysql>

    校对规则:
    每种字符集,有多种校对规则(排序规则)
    show collation;
    作用:影响到排序的操作。简单来说就大小写是否敏感。

    3.3 数据类型
    3.3.1 数字:整数、小数
    名词 存储长度 二进制数字 十进制数值范围
    tinyint 1B =8 bit 00000000~11111111 0~255,-128~127
    int 4B =32bit 0~2^32-1,-2^31~2&31-1
    bigint 8B =64bit 0~2^64-1,-2^63~2&63-1

    mysql> create database oldboy charset utf8mb4;
    mysql> use oldboy;
    mysql> create table t1(id int,name varchar(64),age tinyint);
    mysql> show tables;
    +------------------+
    | Tables_in_oldboy |
    +------------------+
    | t1 |
    +------------------+
    mysql> desc t1;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(64) | YES | | NULL | |
    | age | tinyint(4) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+

    3.3.2 字符串类型
    char(长度):定长字符串类型 255字符
    varchar(长度):变长字符串类型 65535字符
    例如:
    char(10):最多存10个字符,如果存储的字符不够10个,自动以空格填充剩余的空间。对于磁盘空间,都会占到10个字符长度。
    varchar(10):最多存10个字符,按需分配空间
    补充:
    1、varchar类型,在存储数据时,会先判断字符长度,然后合理分配存储空间
    而char类型,不会判断,立即分配空间。
    varchar(10)
    abcde --->1 判断字符长度 ----> 2.申请空间 ------>3.申请1个字节 存储5这个数值
    char(10)
    abcde --->1 申请10个字符空间 ------>2 存字符+空格填充
    在固定长度的列中,还会选择推荐char类型。
    2、varchar类型,除了会存储字符串外,还会额外使用1-2字节存储字符长度。
    abcdef --》6+1
    aaaaaaaaaaaaaaaaaaaa...254 ,254+1
    aaaaaaaaaaaaaaaaaaaa...1000,1000+2
    3.应用场景
    字符串固定长度用char类型,不固定用varchar类型
    4.括号中数值问题
    括号中,设置的是,字符的个数,无关字符类型。
    但是,不同类的字符,站哟的存储空间是不一样的。
    对于英文和数字,每个字符占1个字节长度。
    utf8,utf8mb4,每个中文占3个字节长度。emoji字符,占4个字节长度。
    总长度不能超过数据类型的最大长度。

    彩蛋:以上两种数据类型选择需考虑周全,会影响到索引应用。

    enum('北京市','浙江','..') 枚举类型
    1 2 3 “下标索引”
    说明:属于字符串类型。
    作用:
    例如:
    id telnum name shenfen sheng
    1 18911112222 huanu 330xxxx 浙江省
    ..34个

    彩蛋:以上数据类型选择需考虑周全,会影响到索引应用。
    3.3.3 时间类型
    datetame(8字节)
    范围1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
    timestamp(4字节)
    范围1970-01-01 00:00:00~2038-01-09 03:14:07
    timestamp会受时区影响

    3.3.4 二进制类型

    3.3.5 json(nosql)

    id:101
    name:'zhangsan'


    3.4 约束
    Primary Key :主键约束,作用:唯一且非空,每张表只能有一个主键,作为聚簇索引
    not null :非空约束,作用:必须非空,我们建议每个列都设置为非空
    unique key :唯一约束,作用:必须是不重复的值
    unsigned :针对数字列,作用:非负数

    3.5 其他属性
    default :默认值
    comment :注释

    4.SQL的应用
    4.1 client
    c 结束上一行命令的执行
    G 格式化输出
    q 退出mysql会话(ctrl + D)
    source 导入sql脚本,类似于<
    system 调用Linux命令

    tee 记录日志
    notee 退出记录日志

    4.2 server
    Linux中一切皆命令,Linux中一切皆文件。
    MySQL一切皆SQL,MySQL一切皆库、表。 ---oldguo
    4.2.1 DDL 数据库定义语言
    (1)库定义:库名 库属性
    创建库:
    CREATE DATABASE cnblogs CHARSET UTF8MB4;
    规范:
    1.库名:小写,与业务有关,不要数字开头,库名不要太长,不能使用保留字符串
    2.必须制定字符集
    查询库:
    show database;
    show create database cnblogs;
    修改库:
    alter database cnblogs charset utf8mb4;
    A --> B
    B是A字符集的严格超集。
    删除库:危险,不代表生产操作。
    注意:生产数据库中,除了管理员,任何人没有权限删除库。
    DROP DATABASE zabbix1;
    (2)表定义
    (2.1)创建表
    CREATE TABLE `vp_users` (
    `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '用户序号',
    `name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '用户名' COLLATE 'utf8mb4_bin',
    `age` TINYINT(4) NOT NULL DEFAULT '18' COMMENT '年龄',
    `gender` CHAR(1) NOT NULL DEFAULT 'F' COMMENT '性别' COLLATE 'utf8mb4_bin',
    `cometime` DATETIME NOT NULL COMMENT '注册时间',
    `shengfen` ENUM('北京市','上海市','广东省') NOT NULL DEFAULT '北京市' COMMENT '省份' COLLATE 'utf8mb4_bin',
    PRIMARY KEY (`id`) USING BTREE
    )
    COLLATE='utf8mb4_bin'
    ENGINE=InnoDB
    ;

    建表规范:
    1、表名;
    小写字母
    不能数字开头
    表名要和业务有关
    名字不要太长(建议20个字符以内)
    不能使用关键字
    2、必须设置存储引擎和字符集
    3、数据类型:合适、简短、足够
    4、必须要有主键
    5、每个列尽量设置not null,不知道填什么,设定默认值
    6、每个列要有注释
    7、列明不要太长


    (2.2)查询表
    show tables;
    desc wp_users;
    show create table wp_users;

    (2.3)修改表
    例子:
    --1、添加手机号列
    ALTER TABLE wp_users ADD COLUMN tel BIGINT NOT NULL UNIQUE KEY COMMENT '手机号';
    --2、将tel列数据类型改为char(11)
    ALTER TABLE wp_users modify tel CHAR(11) NOT NULL UNIQUE KEY COMMENT '手机号';
    --3、删除手机号列(危险)
    ALTER TABLE wp_users DROP tel;
    (2.4)删除表
    drop table wp_users;

  • 相关阅读:
    Mariadb/Mysql命令行常用命令
    Apache
    Web网页服务器软件——介绍
    力扣 2021.02.22
    openwrt 广告屏蔽大师 Plus+ 广告屏蔽
    AWX安装
    Command "python setup.py egg_info" failed with error code 1
    《Can you feel my world》--王力宏
    csv文件读入转字典
    每日一题力扣110 平衡二叉树
  • 原文地址:https://www.cnblogs.com/huanu/p/13339939.html
Copyright © 2011-2022 走看看