zoukankan      html  css  js  c++  java
  • day3-sql常用类型

    sql介绍

    什么是sql

    • SQL 指结构化查询语言

    • SQL 使我们有能力访问数据库

    • SQL 是一种 ANSI 的标准计算机语言

    注:存在许多的版本,他们为了兼容 ANSI 用类似的方式支持主要关键词(比如selectupdatedeleteinsertwhere等)但是它们也有自己的扩展

    sql能做什么

    • SQL 面向数据库执行查询

    • SQL 可从数据库取回数据

    • SQL 可在数据库中插入新的记录

    • SQL 可更新数据库中的数据

    • SQL 可从数据库删除记录

    • SQL 可创建新数据库

    • SQL 可在数据库中创建新表

    • SQL 可在数据库中创建存储过程

    • SQL 可在数据库中创建视图

    • SQL 可以设置表、存储过程和视图的权限

    sql常用类型

    mysql客户端自带功能

    mysql> help

    server端分类命令

    mysql> help contents
    • DDL : 数据定义语言

    • DCL : 数据控制语言

    • DML : 数据操作语言

    • DQL : 数据查询语言

    注:快速记忆( D、C、M、Q、 定义、控制、操作、查询)

    sql的各种名词

    sql_mode sql模式

    注:sql_mode简而言之:定义了我们MySQL应该支持的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

    字符集和校验规则

    注:MySQL8字符集默认字符集改成了utf8mb4

    字符集(character)

    • utf8一个符号使用1~3个节点表示

    • utf8mb4(建议),最大存储长度,单个字符最多4个字节,存储与获取数据的时候,不用再考虑4字节

    差别:

    • utf8mb4 支持的编码比utf8更多

    • 举个例子: 比如,emoji字符mb4中支持,utf8不支持。emoji表情字符,1个字符占4个字节,utf8存不下。

    • 对于非BMP字符,utf8mb4使用4个字节来存储,utf8不能存储非BMP字符

    • innodb中默认最大可对767个字节建立索引

    • 使用utf8 的列最多可对255个字符建立索引

    • 使用utf8mb4 的列最多可对191个字符建立索引

    例如:

    show charset;
    create database zabbix charset  utf8mb4;
    show create database zabbix;
    • 5.7 版本设置默认字符集

    修改/etc/my.conf 文件

    1. 在[mysqld]下添加:

    character-set-server=utf8

    2. 在[mysql]下添加

    default-character-set=utf8

    校对规则

    校对规则的意思:它是一组规则,负责决定某一字符集下的字符进行比较和排序结果。

    show collation;

    比如说,有latin1字符集中的字母A和a,我们需要它们在比较的时候相等,那么,我们可以使用字符集校对规则 latin1_general_ci;这种校对规则在比较和排序的时候不区分大小写;如果我们需要他们在比较的时候不等呢?也很简单,我们可以使用字符集校对规则latin1_bin;这种校对规则会以二进制的方式对字符进行比较,很明显,a和A的二进制编码不同,比较的结果就是不等。影响到排序的操作。简单来说是大小写是否敏感

    数据类型

    数字

    类型 大小 范围(有符号) 范围(无符号) 用途
    TINYINT 1字节 (-128,127) (0,255) 小整数值
    INT 4字节 (-32 768,32 767) (0,65 535) 大整数值
    BINGINT 8字节 (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
    create database wei charset utf8mb4;    --创建表格式为utf8mb4
    use wei;
    create table t1(id int ,name varchar(64),age tinyint);
    show tables;
    +---------------+
    | Tables_in_wei |
    +---------------+
    | t1            |
    +---------------+
    1 row in set (0.00 sec)
    
    查看表内容
    desc t1;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | YES  |     | NULL    |       |
    | name  | varchar(64) | YES  |     | NULL    |       |
    | age   | tinyint(4)  | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)

    字符串类型

    类型 大小 用途
    char(长度) 0 ~ 255字符 定长字符串类型
    varchar(长度) 0 ~ 65535字符 变长字符串类型

    例如:

    • char(10):最多存10个字符,如果存储的字符不够10个,自动用空格填充剩余空间。对于磁盘空间,都会占到10个字符长度。

    • varchar(10): 最多存10个字符 , 按需分配存储空间

    补充:

    1. varchar类型,在存在数据时,会判断字符长度,然后合理分配存储空间而char类型,不会判断,立即分配空间。

      例子:

    varchar(10)

    abcde---> 1. 判断字符长度 ---> 2. 申请空间 ---> 3.存字符 4. ---> 申请1个字节存储这5个数字

    char(10)

    abcde ---> 1. 申请10个字符空间 ---> 2. 存字符+空格填充

    2. varchar类型,除了会存储字符串之外,还会额外使用 1-2字符存储长度

    3. 应用场景

      字符串固定长度的话,char类型,不固定用varchar类型

    4. 括号中数学问题

    括号中设置是字符的个数,无关字符类型。

    但是,不同种类的字符,占用的存储长度空间是不一样的。

    对于英文和数学,每个字符占1个字节长度。

    对于中文,占用空间大小要考虑字符集。

    utf8utf8mb4,每个中文,占3个字节长度。emoji字符,占4个字节长度。

    总长度不能超过数据类型的最大长度。

    日期和时间类型

    表示时间值得日期和时间类型为DATETIMEDATETIMESTAMPTIMEYEAR.

    每个时间类型有一个有效范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

    TIMESTAMP类型有专有的自动更新特性

    类型 大小 (字节) 范围 格式 用途
    DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
    TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
    YEAR 1 1901/2155 YYYY 年份值
    DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
    TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

    二进制类型

    二进制字符串类型有时候也直接被称为“二进制类型”。

    下表中列出了 MySQL 中的二进制数据类型,括号中的M表示可以为其指定长度。

    类型名称 说明 存储需求
    BIT(M) 位字段类型 大约 (M+7)/8 字节
    BINARY(M) 固定长度二进制字符串 M 字节
    VARBINARY (M) 可变长度二进制字符串 M+1 字节
    TINYBLOB (M) 非常小的BLOB L+1 字节,在此,L<2^8
    BLOB (M) 小 BLOB L+2 字节,在此,L<2^16
    MEDIUMBLOB (M) 中等大小的BLOB L+3 字节,在此,L<2^24
    LONGBLOB (M) 非常大的BLOB L+4 字节,在此,L<2^32
    • BIT 类型

    位字段类型。M 表示每个值的位数,范围为 1~64。如果 M 被省略,默认值为 1。如果为 BIT(M) 列分配的值的长度小于 M 位,在值的左边用 0 填充。例如,为 BIT(6) 列分配一个值 b'101',其效果与分配 b'000101' 相同。

    BIT 数据类型用来保存位字段值,例如以二进制的形式保存数据 13,13 的二进制形式为 1101,在这里需要位数至少为 4 位的 BIT 类型,即可以定义列类型为 BIT(4)。大于二进制 1111 的数据是不能插入 BIT(4) 类型的字段中的。

    提示:默认情况下,MySQL不可以插入超出该列允许范围的值,因而插入数据时要确保插入的值在指定范围内。

    • BINARY 和 VARBINARY 类型

    BINARYVARBINARY 类型类似于 CHARVARCHAR,不同的是它们包含二进制字节字符串。使用的语法格式如下:

     列名称 BINARY(M) 或者 VARBINARY(M)

    BINARY 类型的长度是固定的,指定长度后,不足最大长度的,将在它们右边填充 “” 补齐,以达到指定长度。例如,指定列数据类型为 BINARY(3),当插入 a 时,存储的内容实际为 “a0”,当插入 ab 时,实际存储的内容为“ab”,无论存储的内容是否达到指定的长度,存储空间均为指定的值 M。

    VARBINARY 类型的长度是可变的,指定好长度之后,长度可以在 0 到最大值之间。例如,指定列数据类型为 VARBINARY(20),如果插入的值长度只有 10,则实际存储空间为 10 加 1,实际占用的空间为字符串的实际长度加 1。

    • BLOB 类型

    BLOB 是一个二进制的对象,用来存储可变数量的数据。BLOB 类型分为 4 种:TINYBLOBBLOBMEDIUMBLOBLONGBLOB,它们可容纳值的最大长度不同,如下表所示。

    数据类型 存储范围
    TINYBLOB 最大长度为255 (28-1)字节
    BLOB 最大长度为65535 (216-1)字节
    MEDIUMBLOB 最大长度为16777215 (224-1)字节
    LONGBLOB 最大长度为4294967295或4GB (231-1)字节

    BLOB 列存储的是二进制字符串(字节字符串),TEXT 列存储的是非进制字符串(字符字符串)。BLOB 列是字符集,并且排序和比较基于列值字节的数值;TEXT 列有一个字符集,并且根据字符集对值进行排序和比较。

    主键约束

    详细请看:http://c.biancheng.net/view/2440.html

    约束主键类型:

    • Primary Key : 主键约束,作用:唯一+非空,每张表只能有一个主键,作为聚簇索引。

    • not null : 非空约束,作用:必须非空,我们建议每个列都设置非空。

    • unique key : 唯一约束,作用:必须不重复的值

    • unsigned : 针对数字列,非负数

    在创建表时设置主键约束

    在 CREATE TABLE 语句中,主键是通过 PRIMARY KEY 关键字来指定的。

    在定义列的同时指定主键,语法规则如下:

    <字段名> <数据类型> PRIMARY KEY [默认值]

    例1:在wei数据库中创建t2 数据表,其主键为id输入sql语句和运行结果为:

    use wei;
    
    create table t2
    (
    id int(11) primary key,
    name varchar(25),
    depid int(11),
    salary float
    );
    Query OK, 0 rows affected (0.20 sec)
    
    desc t2;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | NO   | PRI | NULL    |       |
    | name   | varchar(25) | YES  |     | NULL    |       |
    | depid  | int(11)     | YES  |     | NULL    |       |
    | salary | float       | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)

    在定义完所有列之后,指定主键的语法格式为:

    [CONSTRAINT <约束名>] PRIMARY KEY [字段名]

    例2:在wei数据库中创建t3 数据表,其主键为id,输入sql语句如下:

    create table t3
    (
    id int(11),
    name varchar(25),
    deptld int(11),
    salary float,
    primary key(id)
    );

    在创建表时设置复合主键

    主键又多个字段联合组成,语法规则如下:

    PRIMARY KEY [字段1,字段2,…,字段n]

    例3:创建数据表t5,假设表中没有主键id,为了唯一确定一个员工,可以把namedeptld联合起来作为主键,输入sql语句和运行结果如下:

    create table t5
    (
    name varchar(25),
    deptld int(11),
    salary float,
    primary key(name,deptld)
    );

    在修改表时添加主键约束

    在修改数据表时添加主键约束的语法规则为:

    ALTER TABLE <数据库名> ADD primary key (<列名>);

    创建并查看t6表结构,如下:

    create table t6 (id int,name varchar(25),deptld int(11),salary float);
    
    desc t6;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | YES  |     | NULL    |       |
    | name   | varchar(25) | YES  |     | NULL    |       |
    | deptld | int(11)     | YES  |     | NULL    |       |
    | salary | float       | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)

    例4:修改数据表t6,将字段id设置为主键,输入的sql语句和运行结果如下:

    mysql> alter table t6 add  primary key(id);
    Query OK, 0 rows affected (0.42 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc t6;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | NO   | PRI | NULL    |       |
    | name   | varchar(25) | YES  |     | NULL    |       |
    | deptld | int(11)     | YES  |     | NULL    |       |
    | salary | float       | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)

    其他属性

    • default : 默认值

    • comment : 注释

    sql应用

    client客户端

    • c 结束上条命令运行

    • G 格式化输出

    • q 退出MySQL会话 (CTRL+d)

    实例:

    show databases c    ---直接退出不报错
    select * from cityG  --格式化输出,但是这个表有点长
    desc t1q             ---直接退出
    Bye
    • source 导入sql脚本 ,类似于 <

    • system 调用linex命令

    实例:

    t100w.sql包下载地址:https://pan.baidu.com/s/11IQ7fVyxV9eNXVQJJyWDGg
    提取码:c5pd

    mysql> source t100w.sql
    
    mysql> system ls;
    APlayer.min.css  APlayer.min.js  ruby-1.9.3-p551.tar.gz  t100w.sql

    server服务端

    DDL数据库定义语言

    库定义:库名 库属性

    1. 创建数据库

    create database wei charset utf8mb4;

    规范:

    • 库名:小写,业务有关,不能数字开头,库名不要太长,不能使用保留字符串。

    • 必须制定字符集

    2. 查库

    mysql> show databases;
    mysql> show create database wei;

    3. 修改库

    mysql> alter database wei charset  utf8mb4;

    A ---> B

    B是字符集的严格超集。

    4. 删除库:危险 !,不代表生产操作

    注:生产数据库中,除了管理员,任何人没有删库权限

     mysql> drop database wordpress;

    表定义:

    1. 创建表

    开发工作

    CREATE TABLE `oldboy`.`wp_users`(  
      `id` INT NOT NULL AUTO_INCREMENT COMMENT '用户序号',
      `name` VARCHAR(64) NOT NULL COMMENT '用户名',
      `age` TINYINT UNSIGNED NOT NULL DEFAULT 18 COMMENT '年龄',
      `gender` CHAR(1) NOT NULL DEFAULT 'F'  COMMENT '性别',
      `cometime` DATETIME NOT NULL COMMENT '注册时间',
      `shengfen` ENUM('北京市','上海市','天津市','深圳市','重庆市') NOT NULL DEFAULT '北京市'  COMMENT '省份',
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB CHARSET=utf8mb4;

    建表规范:

    1. 表名

      • 小写字母

      • 不能数字开头

      • 表名和业务有关

      • 名字不要太长

      • 不能使用关键字

    1. 必须设施存储引擎和字符集

    2. 数据类型:合适、简短、足够

    3. 必须有主键

    4. 每个列尽量设施not null,不知道填啥,设定默认值

    5. 每个列要有注释

    6. 列名不要太长

    7. 表要有表注释

    优化建议题目:

    • id 太大,int(10)就够

    • warehouse_id 如果是数字应该换数据类型为数字的

    • station_region_id 同上

    • replenish_type 用 enum 可以节省空间

    • c_t 应该用时间类型

    • u_t 同上

    • is_deleted tinyint(1)

    • 字符集 utf8mb4 比较好

    2. 查询表

    mysql> show tables;
    mysql> desc wp_users;
    mysql> show create table wp_users;

    3. 修改表

    例子: 
    -- 1. 添加手机号列
    mysql> alter table wp_users add column shouji bigint not null unique key comment '手机号';
    -- 2. 将shouji列数据类型修改为char(11)
    mysql> alter table wp_users modify shouji char(11)  not null unique key comment '手机号';
    -- 3. 删除手机号列(危险)
    mysql> alter table wp_users drop shouji;

    4. 删除表

    drop  table wp_user;
  • 相关阅读:
    UML类图与类的关系详解
    UML用例图总结
    jQuery随机抽取数字号代码
    贪心算法
    回溯法实例详解(转)
    React 表单元素实例
    React 组件嵌套 父子关系
    React 滚动事件
    error: Error trying to parse settings: Unexpected trailing characters in PackagesUserPreferences.sublime-settings:9:2 reloading settings Packages/User/Preferences.sublime-settings
    jquery 下拉框左右选择
  • 原文地址:https://www.cnblogs.com/Mercury-linux/p/12359063.html
Copyright © 2011-2022 走看看