zoukankan      html  css  js  c++  java
  • mysql-2-DML、DDL

    DML语法

    插入:

    方式1:
    insert into 表名(列名1,......) 
    values(值1,......)
    
    方式2:
    insert  into 表名(列名1,......) 
    values(值1,......),
    values(值1,......),
    ......
    
    方式3:
    insert  into 表名()(
    	select ....;
    )
    
    方式4:
    insert into 表名 
    set 列名=值,
    ......
    

    更新:

    update 表名
    set 列名=值,......
    [where 筛选条件] 
    
    • 修改多表的记录语法:

    sql92语法:

    update 表1 别名,表2 别名
    set 列=值,..: ..
    where 连接条件 and 筛选条件;
    

    sql99语法:

    update 表1 别名
    [inner/left/right] join 表2 别名 on 连接条件
    set 列=值,......
    where 筛选条件;
    

    删除

    delete from 表名
    [where 筛选条件]
    
    不加筛选条件即删除整表
    
    多表删除 和更新类似
    
    删除全表:truncate table 表名
    

    truncate和delete对比:

    • 假如表有自增长列,删除数据后,自增序号从删除点后一个序号开始
    • truncate无返回值,delete有返回值
    • truncate无法回滚,delete可回滚

    DDL语法

    关键字 说明
    create 创建
    rename 重命名
    alter 修改
    drop 删除
    if/if not exists 判断存在

    数据库操作

    选择数据库:
    use 数据库名;
    
    创建数据库:
    create datebase 库名
    create datebase if not exists 库名   先判断数据库是否存在
    
    修改库:
    rename database 旧库名 to 新库名      5.1.7存在,已废弃
    
    更改库字符集:
    alter database 库名  character set 字符集
    
    删除库:
    drop database if exists 库名
    

    表操作

    • 表操作
    创建表:
    create table 表名(
    	列名 类型 [约束] [约束] ...,
    	....,
    )
    
    修改表名:
    alter table 旧表名 rename to 新表名
    
    删除表:
    drop table 表名
    
    表复制:
    # 仅仅复制表结构
    create table 表名 like 被复制的表名; 
    # 复制表结构和数据,加where可限定复制部分数据
    create table 表名 select * from 被复制的表名;   
    # 复制表的某些字段
    create table 表名 select 字段1,... from 被复制的表名 where 0;
    
    • 列操作

    格式:alter table 表名 add|drop|modify|change column 列名 【列类型 约束】;

    修改列名:
    alter table 表名 change column 旧列名 新列名 [类型]
    
    修改列的类型或约束:
    alter table 表名 modify column 列名 新类型
    
    添加新列:
    alter table 表名 add column 列名 类型
    
    删除列:
    alter table 表名 drop column 列名	
    

    常见数据类型

    数值型:

    创建表时定义字段类型说明:

    整型:Tinyint、Smallint、editmint、Int/Integer、Bigint

    • 不设置符号,默认有符号,想设置无符号在创建表时添加unsigned关键字
    • 插入数值超出整型范围,报【out for range异常】,并插入临界值
    • 不设置长度,有默认长度值

    小数:

    浮点数: Float(M,D)、Double(M,D)

    定点数: DEC(M,D)/DECIMAL(M,D)

    • M=整数和小数共几位数,D=精度几位数 超出范围插入临界值
    • M和D都可以省略
    • 如果是float和double,会根据插入数据进度来决定精度

    选择类型原则:所选择的类型越简单越好,能保存数值类型越小越好

    字符型:

    短文本:Char(M)、Varchar(M)

    • char表固定长度,varchar即可变长度(根据插入数据角色长度)
    • char费空间、效率高,varchar省空间、效率低。
    • char省略M默认1,varchar不可省

    长文本:Text(文本)、Blob(较大的二进制)

    其他:Binary、Varbinary、Enum、Set

    • Binary、Varbinary用于保存较短的二进制

    • Enum即枚举,Set即集合,在创建表格时指定只能插入的数据

    日期型:

    日期:Date、Datetime、Timestamp(时间戳)、Time、Year

    • Datetime范围1000-9999,Timestamp范围1970-2038

    • Datetime不受时区影响,Timestamp受时区影响,

    更换时区:
    set time_zone = 时区
    

    常见约束

    关键字 约束名 说明
    NOT NULL 非空 保证该字段不能为null。如:姓名、学号
    DEFAULT 默认值 如果插入没规定其他值,会添默认值。如:性别
    UNIQUE 唯一 保证值唯一性,可为空。如:座位号
    PRIMARY KEY 主键 本表主要的列可做主键
    FOREIGN KEY 外键 关联其他表格,限制两表关系,本表字段值必须是其他表字段值(一般是其他表的主键列)
    CHECK 检查 自定义检查约束限制条件(mysql不支持)。

    添加约束时机:

    • 创建表时
    • 修改表时

    列级约束:

    • 六大约束语法上都支持,但外键没效果,

    表级约束:

    • 默认、非空约束不支持

    例如:创建表添加约束

    # 添加列级约束
    CREATE TABLE stuinfo (
        id INT PRIMARYKEY, # 主键 主键默认必须非空,唯一
        stuName VARCHAR(20) NoT NULI, # 非空
        gender CHAR(1)  CHECK(gender='男' OR gender ='女'),# 检查
        seat INT UNIQUE, # 唯一
        age INT DEFAULT 18, # 默认约束
        majorid INT FOREIGN KEY REFERENCEs major(id) # 外键 引入major表的id字段
    )
    
    # 添加表级约束   格式:字段下面添加  [constraint约束名] 约束类型(字段名)
    CREATE TABLE stuinfo (
        id INT,
        stuname VARCHAR(20),
        gender CHAR(1),
        seat INT,
        age INT,
        majorid INT,
        
        CONSTRAINT pk PRIMARY KEY(id),# 主键
        CONSTRAINT uq UNIQUE(seat), # 唯一键
        CONSTRAINT ck CHECK(gender='男'OR gender='女'),# 检查
        CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES  major(id) # 外键
    );
    
    

    列级约束和表级约束有什么区别?

    • 约束范围不一样

    • 列级约束是定义在列属性中的,而表级约束是定义在列之后的,两者本质上没什么区别

    • 如果约束需要同时对多列进行约束那么就只能采用表级约束,因为表级约束面向的是表(当然就包括所有列)

    • 列级约束只能针对该列进行约束。如:gender字段中check约束

    什么时候用列级,什么时候用表级?通用写法:

    • 外键定义表级约束

    外键:

    • 要求在从表设置外键关系
    • 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
    • 主表的关联列必须是一个key(一般是主键或唯—)
    • 插入数据时:先插入主表,再插入从表。删除数据时,先删除从表,再删除主表。

    修改表时删除约束

    # 1.期制除非空约束
    ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
    # 2.删除默认约束
    ALTER TABLE stuinfo MODIFY COLUMN age INT ;
    # 3.册除主键
    AITER TABLE stuinfo DROP PRIMARY KEY;
    # 4.册除唯一
    AITERT ABLE stuinfo DROP INDEX seat;
    # 5.删除外键
    AITER TABLE stuinfo DROP FOREIGN KEY 外键名
    

    标识列

    标识列又称自增长列。

    可以不用手动插入值,系统提供默认的序列值。

    # 建表时设置标识列
    CREATE TABLE tab_identity(
    	id INT PRIMARY KEY AUTO_INCREMENT, # AUTO_INCREMENT标识自增长
        name VARCHAR(20)
    );
    
    # 查看系统自增量,每次增加步长的值
    SHOW VARIABLES LIKE '%auto_inerement%';
    

    标识列必须和主键搭配吗?

    • 不一定,但要求是一个key
    • 标识列至多只有一个
    • 标识列类型只能是数值型
    • 可设置每次增量的步长值,
    • 可修改标识列初始值,即第一次插入数据时指定标识列的值
  • 相关阅读:
    bind 与Eval的区别
    GDI+
    文件读写
    “六度分离”和 洪泛(Search flooding)搜索
    Internet streaming 现在谁是霸主?
    苹果提供高清HD下载SO贵
    关于Youtube 的平均文件尺寸与GFS
    [笔记+整理]随机网络和无标度网络
    2008年中国广播电视广告额增长超15%
    笔记:Mobile CDN 和IPTV CDN有哪些不同
  • 原文地址:https://www.cnblogs.com/xiaoaiying/p/14349882.html
Copyright © 2011-2022 走看看