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
  • 标识列至多只有一个
  • 标识列类型只能是数值型
  • 可设置每次增量的步长值,
  • 可修改标识列初始值,即第一次插入数据时指定标识列的值
posted @ 2021-01-30 18:02  小艾影  阅读(97)  评论(0编辑  收藏  举报