zoukankan      html  css  js  c++  java
  • MySQL笔记(2)-- CURD多表操作、库表操作、约束条件、字段类型

    • insert语法:方式一支持插入多行,方式二不支持;方式一支持子查询,方式二不支持
      方式一:insert into tableName(column,column...) values(str,str...);
      方式二:insert into tableName set column=str,column=str...;
      子查询插入:insert into tableName(column,column...) 子查询
      (1)insert into tableName(column,column...) select str,str....;
      (2)insert into tableName(column,column...) select str,str.... from tableName where 条件;
      使用union进行多行插入:
      insert into tableName
      select str,str... union
      select str,str... union
      ....
    • update更新多表联合语法
      sql92语法:
        update tableName 别名1,tableName 别名2 ...
        set 别名1.column=value,别名2.column=value....
        where 连接条件【表1和表2的连接条件】
        and 筛选条件;
      sql99语法:
        update tableName 别名1
        inner|left|right join tableName 别名2
        on 连接条件
        set 别名1=value....
        where 连接条件  
    • delete多表删除语法:truncate删除全表,自增字段索引重置为0;单表delete from 表名 where 条件【 limit 条目】;truncate不支持事务,无法进行回滚
      sql92语法:
        delete 别名1,别名2 ...
        from tableName 别名1,tableName 别名2...
        where 连接条件【表1和表2的连接条件】
        and 筛选条件;
      sql99语法:
        delete 别名1,别名2 ...
        from tableName 别名1
        inner|left|right join tableName 别名2
        on 连接条件
        where 连接条件
      truncate语法:truncate table tableName;  
    • 库表操作:【】表示可省略
      • 库创建:create database [if not exists]库名
      • 库修改:rename database 旧名 to 新名
      • 更改库的字符集:alter database 库名 character set 编码格式(gbk)
      • 删除库:drop database if  exists 库名
      • 表创建: create table if not exists 表名( 列名 列类型【(长度)约束】......)
      • 表修改:
        • alter table 表名 add|drop|modify|change column 列名 【列类型 约束】
        • alter table 旧表名  rename to 新表名
        • 修改列名:alter table 表名 change 【column】 旧列名 新列名 类型
        • 修改列的类型和约束:alter table 表名 modify column 列名 类型
        • 列添加: alter table 列名 add column 列名 类型 【first|after 列名】
        • 删除列:alter table 表名 drop column 列名
        • 表删除:drop table if exists 表名
        • 查看表信息:desc 表名; 查看当前库的所有表 show tables; 
        • 复制表的结构:create table 新表名 like 库中的表名  
          • 复制表的结构和数据:create table NewTableName select * from 库表名
          • 复制部分的结构和数据:create table NewTableName select column,column.. from 库表名 where 条件
          • 复制部分的结构:create table 新表名 select column,column.. from 库表名 where  0【条件是false】
    • 约束条件:主键和唯一都可以保证数据的唯一;主键不能存null,唯一可以存null,但只能存一个null;主键最多只有1个,唯一可以多个。主键和唯一都可以组合,等插入的值判断是根据组合判断,比如唯一UNIQUE(id,number),数据(1,1)和(1,2)、(1,2)和(2,2)没问题,(1,1)和(1,1)就报错不行。【不推荐进行组合,不稳定】;外键得先删除从表再删除主表,外键在从表中,该外键必须是主表的主键。
      • 六大约束:
        • NOT NULL:非空,用于保证该字段的值不能为空,比如姓名,学号等;
        • DEFAULT:默认,用于保证该字段有默认值,比如性别;
        • PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空,比如学号,编号等;
        • UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空,比如座位号;
        • CHECK:检查约束【MySQL中不支持】,比如年龄,性别;
        • FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自与主表的关联列的值,在从表中添加外键约束,用于引用主表中某列的值,比如学生表的专业编号等;
      • 约束的分类:
        • 列级约束:六大约束语法上都支持,但外键的约束没有效果
          • 添加列级约束:
            alter table tableName modify column 字段名 字段类型 新约束;
        • 表级约束:除了非空,默认,其他的都支持
          • 添加表级约束:在各个字段的最下面:【constraint 约束名】约束类似(字段名)
            alter table tableName add 【constraint 约束名】约束类型(字段名)【外键的引用】;
      • 查看表的所有索引,包括主键、外键、唯一:
        show index form tableName;
    • 标识列设置自动增长,只能是数值,默认值是1,最多只能设置一列为自增长;
    • 字段类型:
      • 整数:默认有符号,int unsigned 表示int无符号类型,即不允许存储负数,int(7) zerofill 表示插入的数据不够7位进行剩余位数左填充补上0【使用zerofill默认表示无符号,不支持负数】【为整型类型指定宽度,例如int(11),对大多数应用是没有意义的,它不会限制值的合法范围,只是规定了MySQL的一些交互工具(比如MySQL命令行客户端)用来显示字符的个数。对于存储和计算来说,int(1)和int(20)是相同的。】
      • 小数:定点型的精度比浮点型高,如果要求插入的数据精度较高比如货币运算,考虑使用定点型;
        • M表示整数部分+小数部分,D表示小数部分,如果超过位数,则使用临界值;字段设置定点型没有限定M和D,M默认是10,D默认是0,当插入数据的小数点后面有数据时,会发出警告;浮点型没有限定M和D,则字段的精度与插入数据的精度一致;【MySQL5.0及其以上版本将数字打包保存到一个二进制字符串中(每4个字节存9个数字),例如DECIMAL(18,9)小数点两边将各存储9个数字,一个使用9个字节:小数点前的数字用4个字节,小数点后的数字用4个字节,小数点本身占用1个字节。DECIMAL只是一种存储格式,在计算中DECIMAL会转换为double类型。】
        • 节省空间可以使用float,使用字节少的类型;
      • 字符型:char【M默认为1】存储固定长度字符,空间的耗费比较高,效率高;varchar存储可变长度字符,空间耗费节省,效率低。【固定长度值可以存储char,比如sex为1/0,或男女】
      • binary和varbinary保存二进制字符串
      • 枚举:要求插入的值必须属于列表中指定的值之一,就是说在创建字段为enum类型时,需指定列表值是什么,进行insert时,插入的值在指定列表值中,如果插入的不在指定范围内,默认插入为空字符串,插入字母,忽略大小写
        • 如果列表成员为1-255,则需要1个字节存储;
        • 如果列表成员为255-65535,则需要2个字节存储;
        • 最多可以有65535个不同的列表成员(实际限制小于3000);
        • 每个成员被分配从1开始的索引值;
        • 空字符串作为错误值的索引值为0,可以使用select语句找出那些被指定无效枚举值的数据行;
          SELECT * FROM tableName WHERE enum_col=0;
        • NULL的索引为NULL;
        • 枚举值不能是0或空字符串;
        • enum在底层的存储方式是以整型进行存储的,比如这样的字段sex enum('male' , 'female' , 'both' , 'unknow')在查询时where sex='male'和where sex=1是等效的;
      • set不区分大小写,用于保存集合:和enum枚举类型类型,可以保存0-64个成员。【set类型一次可以选取多个成员作为插入值,enum枚举只能选一个】
        • 根据成员个数的不同,存储所占的字节也不同
          成员数           字节数
          1-8                 1
          9-16                2
          17-24               3
          25-32               4
          33-64               8
          create table tab_set(
              set1 set('a','b','c','d')
          )
          insert into tab_set values('a');
          insert into tab_set values('a,b');
          insert into tab_set values('a,c,d');
      • 日期型:查看当前时区show variables like 'time_zone';设置为其他时区 set time_zone='+9:00';datetime不受时区影响,timestamp受时区影响。
  • 相关阅读:
    hdu2155 小黑的镇魂曲(dp)
    hdu2155 小黑的镇魂曲(dp)
    hdu2158 最短区间版大家来找碴
    hdu2158 最短区间版大家来找碴
    hdu2102 水搜索
    hdu2102 水搜索
    hdu 2058 枚举区间和个数
    hdu 2058 枚举区间和个数
    hdu4982 暴搜+剪枝(k个数和是n,k-1个数的和是平方数)
    hdu4982 暴搜+剪枝(k个数和是n,k-1个数的和是平方数)
  • 原文地址:https://www.cnblogs.com/huangrenhui/p/12456250.html
Copyright © 2011-2022 走看看