一.登录和退出数据库服务器
二.基本语法
– 显示所有数据库show databases;
– 创建数据库create database test;
– 选择需要操作的数据库use test;
– 显示数据库中的所有数据表show tables;
– 创建数据表
1 | create table pet( |
注意事项:
- var()与varchar()的区别在于var()是定长的,哪怕存储的字符串没有达到”()”中数字的上限,var()依然会占用空格来填充空间,而varchar()是不定长的,没有达到”()”中的上限则会自动去掉后面的空格;
- 定义最后一个字段的时候不要加”,”;
– 查看创建好的数据表的结构
– describe pet;desc pet;
说明:
1 | +-------+-------------+------+-----+---------+-------+ |
Field: 字段的名称
Type: 字段的类型,可以有int var varchar
Key: 是否是关键字,如可以定义为 primary key
Default: 若该字段没有主动设置值的时候,该字段的默认值是什么
– 查看数据表中的数据select * from pet;
– 往数据表中插入数据insert into pet values('Puffball', 'Diane', 'hamster', 'f', '1999-03-30', NULL);
insert into pet values('旺财', '周星驰', '狗', '公', '1990-01-01', NULL);
– 还有一种写法,代表我只在name和owner字段上面插入数据,其他皆为NULL/默认值的数据insert into pet(name, owner) values ('xx','cc');
– 删除数据
– 语法: delete from tableName where 条件;delete from pet where name = '旺财';
– 修改数据
– 语法:update tableName set 字段1=值1, 字段2=值2, … where 条件;update pet set name = '旺旺财' where owner = '周星驰';
– 删除表
– 语法:drop table tableName;drop table test;
mysql 常用数据类型
见 菜鸟教程
– 数据类型如何选择?
- 日期选择按照格式
- 数值和字符串按照大小(常用:int float double char varchar text)
注意: 金钱最好用int/bigint(整数,单位为分,拿出来进行*100换成元),千万不要直接用浮点,会有精度丢失.
总结:
- 增加: insert
- 删除: delete
- 修改: update
- 查询: select
三.mysql建表约束
主键约束
1. 主键约束
它能够唯一确定一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得该字段不重复且不为空
1 | create table user( |
运行desc user
后:
1 | +-------+-------------+------+-----+---------+-------+ |
– 修改表结构,添加主键(比较少用到,要用的时候再百度就行)alter table user add primary key(id);
– 删除主键(比较少用到,要用的时候再百度就行)alter table user drop primary key;
– 使用modify修改字段,添加约束(比较少用到,要用的时候再百度就行)alter table user modify id int primary key;
2. 联合主键
联合主键中的每个字段都不为空,且联合的主键加起来不重复
1 | create table user2( |
自增约束
– auto_increment
– 管控字段,让字段自动增长
1 | create table user3( |
唯一约束
– 约束修饰的字段的值不可以重复
1 | create table user5( |
– 删除唯一约束alter table user5 drop index name;
– modify 添加alter table user5 modify name varchar(20) unique;
总结:
- 主键约束包含了唯一约束.
- 建表的时候就添加约束
- 可以使用
alter table tableName add unique(字段);
- 可以使用
alter table tableName modify 字段名 字段类型 unique;
应用场景:
业务需求:设计一张用户注册表,用户姓名必须要用手机号来注册,而且手机号和用户名称都不能为空,那么:
1 | CREATE TABLE user_test( |
运行 DESCRIBE user_test;
1 | +--------------+-------------+------+-----+---------+----------------+ |
这样的话就达到了每一个手机号都只能出现一次,达到了每个手机号只能被注册一次.
用户姓名可以重复,但是手机号码却不能重复,符合正常的逻辑需求
非空约束
– 修饰的字段不能为空 NULL
1 | create table user6( |
– 移除非空约束alter table user6 modify name varchar(20);
默认约束
– 就是当我们插入字段值的时候,如果没有传值,就会使用默认值
– 传了值,就不会使用默认值
1 | create table user7( |
– 移除默认约束alter table user7 modify age int;
外键约束
– 涉及到两个表:父表,子表(主表,副表)
1 | --班级 |
总结:
- 主表classes中没有的数据,在副表中,是不可以使用的.
- 主表中的记录被副表引用,则主表中该记录是不可以被删除的.(如副表(students)中引用了4班,则主表(classes)中的4班那条记录不能被删除)
- 若要想删除,先将副表中的数据删除再删除主表数据
四.数据库的三大设计范式
1.第一范式
1NF
– 数据表中的所有字段都是不可分割的原子值
1 | create table student2( |
1 | create table student3( |
总结: 范式设计得越详细,对某些实际操作可能会更好(可以单独对某个字段进行操作,如只选中国,或只选广东省等),但并非都有好处(如取完整地址时需要一个个拼接),需要对项目的实际情况进行设定。
2.第二范式
2NF
– 必须在满足第一范式的前提下,第二范式要求,除主键外的每一列都必须完全依赖于主键(依赖就是相关的意思).
– 如果要出现不完全依赖,只可能发生在联合主键的情况下.
1 | -- 订单表 |
实际上,在这张订单表中,product_name
只依赖于 product_id
,customer_name
只依赖于 customer_id
。也就是说,product_name
和 customer_id
是没有关系的,customer_name
和 product_id
也是没有关系的。
– 存在问题:除主键外的其他列,只依赖于主键的部分字段
– 解决:拆表
1 | create table myOrder( |
– 分成三个表之后,就满足了第二范式的设计,因为myOrder
表中的product_id
和customer_id
完全依赖于主键order_id
,而product
和customer
中的其他字段也完全依赖于主键,满足第二范式的设计.
3.第三范式
3NF
– 必须在满足第二范式的前提下,除开主键外的其他列之间不能有传递依赖关系.
1 | create table myOrder( |
– 存在问题: 在myOrder中,customer_phone
依赖于order_id
,但它还依赖于customer_id
,而customer_id
又依赖于order_id
,所以存在传递依赖,不满足第三范式的要求.
– 解决:
1 | create table customer( |
– 修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计!