mysql基础(2/3)
定义
表:是数据库最基本的组成单元,数据库是用来存储数据的,数据库中有很多表,每一个表都是一个独立的单元,表也是一个结构化的文件,由行和列组成,行称为数据或记录,列称为字段,字段又包括:字段名称、字段类型、长度、约束。
创建表
语法格式:create table 表名称(字段名 类型(长度) 约束);
MySQL常用数据类型
数据类型 | 占用字节数 | 描述 |
---|---|---|
char | char(n) | 定长字符串,存储空间大小固定使用char(2)来表示类型或状态 |
varchar | varchar(n) | 变长字符串,存储空间等于实际数据空间只包含英文字符的字符串 |
int | 4个字节 | 表示整型,比如自增ID和表示数量 |
bigint | 8个字节 | 表示长整型,比如自增ID |
float | float(有效数字位数,小数位) | 数值型 |
double | double(有效数字位数,小数位) | 数值型 |
date | 8字节 | 表示日期和时间 |
BLOB | 二进制大对象 | |
CLOB | 字符大对象 |
varchar与char对比:
a)都是字符串
b)varchar比较智能,可以根据实际的数据长度分配空间,比较节省空间,但在分配的时候需要相关判断
c)char不需要动态分配空间,所以执行效率高,但是可能会导致空间浪费
d)若字段中的数据不具备伸缩性,建议采用char类型存储
e)若字段中的数据具有很强的伸缩性,建议采用varchar类型存储
创建表格<student学生信息表>
create table t_student(
no int(10),
name varchar(32),
sex char(1),
birth date,
email varchar(128)
)
删除表格
1)drop table t_student;
2)drop table if exists t_student;(推荐)
插入数据
1)DML语句包括:insert、update、delete;
a)插入数据insert语法
insert into 表名(字段名1,字段名2,....) values(值1,值2);
注意:字段和数值必须一一对应,字段与数据个数必须相同,数据类型必须一致;
查看建表语句
show create table t_student;
查看变量
show variables like '%char%'
设置结果编码集
set character_set_results = 'GBK'
创建表格时给字段设置默认值:default默认值
create table t_student(
no int(10),
name varchar(32),
sex char(1) default 'm',
birth date,
email varchar(128)
)
表的复制
定义:将查询结果当作一张表创建
语法结构:create table 表名 as select 查询语句;
1)完全复制emp表到emp1
create table emp1 as select * from emp;
2)选择性复制emp表到emp2:
create table emp2 as select ename,sal from emp;
将查询结果插入到某张表中
1.语法结构:insert into 表名 select 查询语句
1)从emp2表中查询出员工工资为3000的,同时将查询结果插入到emp2表中
insert into emp2 select * from emp2 where sal = 3000
2)复制emp表为emp_bak,再将emp表中数据插入到emp_bak中
create table emp_bak as select * from emp; insert into emp_bak select * from emp2 where sal = 3000;
增/删/改表结构
语法结构
1)新增:alter table 表名 add 字段名 字段类型(长度);
2)修改:alter table 表名 modify 字段名 字段类型(长度);
3)删除:alter table 表名 drop 字段名;
给表添加一个电话字段
alter table t_student add tel varchar(10);
将字段tel长度扩展到20个长度
alter table t_student modify tel varchar(20);
将t_student表中的tel字段删除
alter table t_student drop tel;
添加/修改/删除 表数据
DML数据操作语句 insert、update、delete;
insert添加数据
语法格式:insert into 表名(字段名1,字段名2....) values(值1,值 2);
update修改数据
语法格式:update 表名 set 字段名 = 字段值,字段名 = 字段值 where 条件;
注意:update如果没有条件限制,将把整张表的数据全部更新;
delete删除数据
语法格式:delete from 表名 where 条件限制
注意:若没有条件限制,会将表中所有记录全部删除;
创建表加入约束
英文单词:constraint
什么是约束?实际上是对表中数据的限制条件
设计表时加入约束的目的?保证表中数据的完整和有效
非空约束
作用:not null约束的字段不能为NULL值,必须赋具体数据;
示例:创建t_user表,name字段不能为空
drop table if exists t_user;
create table t_user(
id int(10),
name varchar(32) not null,
email varchar(128)
)
唯一性约束(unique)
作用:unique约束的字段具有唯一性,不可重复
示例:创建t_user表,name不能为空,email保证唯一
1)方法一:列级约束
drop table if exists t_user;
create table t_user(
id int(10),
name varchar(32) not null,
email varchar(128) unique
);
注意:unique约束的字段不能重复,但是可以为NULL,NULL不是一个值,也不能用等号比较;
2)方法二:表级约束
drop table if exists t_user;
create table t_user(
id int(10),
name varchar(32) not null,
email varchar(128),
unique(email)
);
3)使用表级约束给多个字段联合添加字段
drop table if exists t_user;
create table t_user(
id int(10),
name varchar(32) not null,
email varchar(128),
unique(name,email)
);
4)表级约束还可以给约束起名字,原因:以后可以通过名字操作这个约束
drop table if exists t_user;
create table t_user(
id int(10),
name varchar(32) not null,
email varchar(128),
constraint t_user_email_unique unique(email)
);
--使用information_schema
use information_schema;
--展示表
show tables;
--展示字段
desc table_constraints;
--查询出表中的唯一约束名称
select constraint_name from table_constraints where table_name = 't_user';
主键
主键设计到的3个术语:主键约束、主键字段、主键值 表中某个字段添加主键约束之后,该字段被称为主键字段,主键字段中出现的每一个数据都被称为主键值
主键作用
1)添加主键primary key的字段即不能重复也不能为空,效果与“not null nuique”相同,但本质是不同的,添加主键约束后,主键不仅会有“not null unique”作用,而且主键字段还会自动添加“索引——index”
2)一张表应该有主键,若没有,表示这张表是无效的,“主键值”是当前行数据的唯一标识
主键根据个数分类:单一主键,复合主键
1)单一主键:是给一个字段添加主键约束
列级主键约束
drop table if exists t_user;
create table t_user(
id int(10) primary key,
name varchar(32)
);
表级主键约束
drop table if exists t_user;
create table t_user(
id int(10),
name varchar(32),
constraint t_user_id_pk primary key(id)
);
2)复合主键:是给多个字段联合添加一个主键约束:
drop table if exists t_user;
create table t_user(
id int(10),
name varchar(32),
email varchar(128),
constraint t_user_id_name_pk primary key(id,name)
);
表中主键个数(只能有一个)
无论是单一主键还是复合主键,一张表中主键约束只能有一个
主键根据性质分类:自然主键、业务主键
1)自然主键:主键值若是一个自然数,并且这个自然数与业务没有任何关系,这种主键称为自然主键;
2)业务主键:主键值若和当前表中的业务紧密相关,那么这种主键值被业务主键,如果业务发生改变时,业务主键往往会受到影响,所以业务主键使用较少,大多情况使用自然主键。
MySQL中自动生成主键值(MySQL特有)
1)定义:MySQL数据库管理系统中提供了一个自增数字auto_increment,专门用来自动生成主键值。自增数字默认从1开始,以1递增:1、2、3....
drop table if exists t_user;
create table t_user(
id int(10) primary key auto_increment,
name varchar(32)
);
外键约束FK(foreign key)
外键涉及到的术语:外键约束、外键字段、外键值 给某个字段添加外键约束之后,该字段称为外键字段,外键字段中的数据称为外键值。
外键根据个数分为:单一外键、复合外键
1)单一外键:给一个字段添加外键约束
2)复合外键:给多个字段添加一个外键
注意:
①外键字段可以为NULL,外键为空的数据也叫孤儿数据;
②被引用字段必须具有unique约束
③有了外键引用之后,表分为父表和子表,父表:t_class;子表:t_student;创建表时先创建父表,在创建子表;插入数据时,先插入父表数据,再插入子表数据;
DROP TABLE IF EXISTS t_student;
CREATE TABLE t_student(
sno INT(4) PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(32),
classno INT(4),
CONSTRAINT t_student_classno_fk FOREIGN KEY(classno) REFERENCES t_class(cno)
);
DROP TABLE IF EXISTS t_class;
CREATE TABLE t_class(
cno INT(4) PRIMARY KEY,
cname VARCHAR(32)
);
重点:典型的一对多设计,在多的一方加外键
级联删除
用法:在添加级联更新与级联删除的时候,需要在外键约束后面添关键字
注意:级联更新与级联删除操作谨慎使用,因为级联操作会将数据改变或者删除
1)级联删除:on delete cascade
定义:在删除父表数据的时候,级联删除子表中数据;
a)删除外键约束
ALTER TABLE t_student DROP FOREIGN KEY t_student_classno_fk;
b)添加外键约束及级联删除功能
语法:alter table 表名 add constraint 外键名称 foreign key(外键字段) references 引用表名(引用表中字段名称) on delete cascade;
c)级联删除需求
①删除t_student中的外键
ALTER TABLE t_student DROP FOREIGN KEY t_student_classno_fk;
②增加t_student_classno_fk外键,并加入级联删除 on delete cascade;
ALTER TABLE t_student ADD CONSTRAINT t_student_classno_fk FOREIGN KEY(classno) REFERENCES t_class(cno) ON DELETE CASCADE;
级联更新
a)删除外键约束
语法:alter table 表名 drop foreign key 外键字段;
ALTER TABLE t_student DROP FOREIGN KEY t_student_classno_fk;
b)更新外键约束和添加级联更新功能
语法:alter table 表名 add constraint 外键名称 foreign key(外键字段) references 引用表名(引用表中字段名称) on update cascade
c)级联更新需求
①删除t_student中的外键
ALTER TABLE t_student DROP FOREIGN KEY t_student_classno_fk;
②增加t_student_classno_fk外键,并加入级联更新 on update cascade;
ALTER TABLE t_student ADD CONSTRAINT t_student_classno_fk FOREIGN KEY(classno) REFERENCES t_class(cno) ON UPDATE CASCADE;