1.表操作
1.1 表的设计理念
- 第一范式:每个列不可分割
- 第二范式:实体的每个属性都和主键完全依赖
- 第三范式:每列都和主键列直接相关
1.2 表操作
查看数据库
show databases;
选择数据库
use dname;
创建表结构
create table tname{属性名 数据类型 完整性约束条件}
查看表详细定义
show create table tname
查看表定义
describe tname
删除表
drop table tname
修改表名称
alter table tname rename (to) newtname
1.3 字段操作
添加字段
- 末尾处添加:alter table tname add 属性名 属性类型
- 第一行添加:alter table tname add 属性名 属性类型 first
- 指定字段之后:alter table tname add 属性名 属性类型 after 指定属性名
删除字段
alter table tablename drop 属性名
修改字段
- 修改数据类型:alter table tname modify 属性名 属性类型
- 修改字段名称:alter table tname change 属性名 新属性名 数据类型
修改字段名称和数据类型
alter table tname change 属性名 新属性名 新数据类型
修改字段顺序
alter table modify 属性 数据类型 first(after 指定属性名)
约束条件
- 非空nk:属性名 数据类型 not null
- 默认值:属性名 数据类型 default 默认值
- 唯一性uk:属性名 数据类型 unique
- 主键pk
单一主键:属性名 数据类型 primary key
组合主键:constraint 主键名称 primary key(属性1,属性2) /在字段写完之后直接跟上/
- 主键自增:属性名 数据类型 auto_increment
- 外键fk:constraint 外键名称 foreign key (当前表中外键属性) reference 外键所属表(映射表中的属性)
2.Mysql的数据操作
2.1 插入
插入单条数据
insert into tname(属性1,属性2,……) values(属性1的值,属性2的值……)
插入多条数据
insert into tname(属性1,属性2,……)
values(属性11的值,属性12的值……),
(属性21的值,属性22的值……),
(属性31的值,属性32的值……),
…
(属性1的值,属性2的值……);
插入查询结果
insert into tname(属性1,属性2,……)
select (属性1,属性2,……) from 查询表名 where …
2.2 更新
更新指定记录
update tname set 属性名=属性值,属性名=属性值,… wherer 条件 比如学号为1
更新全部记录
update tname set 属性名=属性值,属性名=属性值,… wherer 条件 比如年龄大于30
2.3 删除
删除指定记录
delete from tname wherer 条件 比如学号为1
删除全部记录
delete from tname wherer 条件 比如年龄大于30
3. 数据类型
3.1 整数类型
bigint(8), int(4) ,Integert(4), mediumintt(3) ,smallintt(2) ,tinyint(1)
查看数据类型信息
help int
3.2 浮点数类型和定点数类型
float(4),double(8),decimal(M,D) M为精度,字节数是M+2
3.3 日期和时间类型
year(1) :1901-2155,
date(4):1000-01-9999-12-31,
time(3):-838:59:59-838:59:59,
datetime(8):1000-01 00:00:00 – 9999-12-31 23:59:59,
timestamp(4):197001080001-2038011911407
3.4 字符类型
3.4.1 char和varchar
char(M): 0 < M < 255
varchar(M): 0 < M < 65535
text(tinytext:0-255,text:0-65535,mediumtext:0-16772150,longtext:0-429496295)
3.4.2 enum类型
属性名 enum(‘值1’,‘值2’,… ,‘值n’)
最多可以有 65535个值
如果属性非空:默认值为第一个元素
如果属性可以为空:默认为NULL
3.4.3 set类型
属性名 set(‘值1’,‘值2’,… ,‘值n’)
可以去一个或多个元素的组合。取多个元素时不同元素用逗号隔开。 最多64个
3.5 二进制
binary(M):0-M的定长二进制
varbinary(M):0-M变长二级制
bit(M):M位二进制,最大64
tinyblob:可变长二进制数据,最多255 == 1B
blob:可变长二进制数据,最多2的16次方-1 == 2B
mediumblob:可变长二进制数据,最多2的24次方-1 == 3B
longblob:可变长二进制数据,最多2的32次方-1 == 4B
4.多表查询
4.1 关系数据操作
- 并(union)
- 笛卡尔积
4.2 内连接查询
- 自连接
如:查询”zhangsan”的同班同学
select ts1.stuid,ts1.name from t_student ts1,t_student as ts2 where ts1.classno=ts2.cllassno and ts2.name=‘zhangsan’;
或
select ts1.stuid,ts1.name from t_student ts1 inner join t_student as ts2 on ts1.classno=ts2.classno and ts2.name=‘zhangsan’;
- 等值连接
- 不等连接
4.3 外连接查询
在Mysql中外连接查询会返回所操作表中至少一个表的所有金数据记录。
select field1,filed2 … filedn from tname1 left|right|full ** (outer) join **tname2 on 条件
- 左外连接
指新关系中执行匹配条件时,以关键字LEFT JOIN左边的表为参照表。
左连接的结果不仅包含连接列所匹配的行,还包括LEFT OUTER子句中指定的左表中的所有行。
如果左表中的某行在右表中没有匹配行,则在相关联的结果行中,右表的所有选择列表均为空值
- 右外连接
指新关系中执行匹配条件时,以关键字RIGHT JOIN左边的表为参照表。
如果右表中的某行在左表中没有匹配行,则在相关联的结果行中,左表的所有选择列表均为空值
4.4 复合条件连接查询
如:多个内连接同时使用
4.5 合并查询数据记录
select field1,field2, … fieldn from tb1 **union **| union all
select field1,field2, … fieldn from tb1 union | union all …
- 带有关键字UNION的并操作
UNION会把查询结果集直接合并在一起,但是会去掉重复的数据记录
- 带有关键字UNION ALL的并操作
UNION ALL会把查询结果集直接合并在一起,但是不会去掉重复的数据记录
4.6 子查询
如果使用笛卡尔积连接两个表,但两个表都特别大,会导致死机,因此,需要查看笛卡尔积大小
select count(*) from tb1,tb2
如果笛卡尔积太大,则需要考虑子查询。
在查询语句的Where或from子句中添加的查询为子查询,外层查询为主查询
- 带比较运算符的子查询
select * from t_employee
where salary >= (select salary from t_sleve1 wherer level = 3)
and salary < (select salary from t_sleve1 wherer level = 4)
- 带关键字IN的子查询
一个查询语句的条件可能落在另一个select语句的查询结果中个,这就可以通过IN来实现
- 带关键字EXISTS的子查询
如果子查询的结果至少有一行,则Exists的结果为true,负责为false:exists (select …)
- 带关键字ANY的子查询
表示满足其中任一条件:score > any(select score from … )
- 带关键字ALL的子查询
表示满足所有条件: socre >= all(select score from …)