终端操作
使用终端操作数据库
如何查看有什么数据库?
1 | show databases; |
如何选择数据库?
1 | use databasesName; |
如何查看该数据库中有哪些表?
1 | show tables; |
如何查询表中的数据?
1 | select * from tableName; |
如何退出数据库服务器?
1 | exit; |
如何在数据库服务器中创建自己的数据库?
1 | create database databaseName; |
如何创建一个数据表? 创建一个pet表
1 | create TABLE pet( |
注意事项:
1:var()与varchar()的区别在于var()是定常的,哪怕存储的字符串没有达到”()”中数字的上限,var()依然会占用空格来填充空间.而varchar()则是不定长的,没有达到”()”中的上限则会自动去掉后面的空格;
2:性别不要用:sex 要用:gender 一个是性 一个是性别;
3:定义最后一个字段的时候不要加”,”;
4:上面的”VAR”,”VARCHAR”,”DATE”可以用小写.不过最好用大写来表示区分关键字,若不然也许写到后面你自己都不知道这个词是数据库中的关键字还是你自己自定义的一些数据,同时一定要用英文的标点符号也必须半角输入
如何查看数据表的架构?
1 | describe tableName; |
如何插入数据?
1 | INSERT INTO pet VALUES('kk','cc','dog','1','1998-8-2',null); |
mysql 常用数据类型
注意:金钱最好用int/bigint(整数,单位用分,拿出来进行*100换成元),千万不要直接用浮点,会有精度损失.
如何删除数据
先插入数据:
1 | INSERT INTO pet VALUES('kk1','cc1','dog1','1','1998-1-2',null); |
删除语句:
1 | DELETE FROM tablesName WHRER 条件; |
修改数据:
1 | UPDATE tableName SET 字段1=值1,字段2=值2 ... WHERE 条件; |
约束
主键约束:
它能够唯一确定一张表中的一条记录,增加主键约束之后,就可以使得字段不重复而且不为空
1 | create table user( |
复合主键:
1 | CREATE TABLE user2( |
说明了复合主键只要所有的字段都不是相同的情况下可以允许其中的字段重复:
1 | INSERT INTO user2 VALUES (1,'老李','123456'); |
场景:表中有班级号以及学生座位号,我们可以用班级号+学生的座位号可以准确的定位一个学生,如:(1班5号可以准确的确定一个学生)
自增约束:
1 | CREATE TABLE user3( |
运行DESCRIBE user3;
1 | +-------+-------------+------+-----+---------+----------------+ |
唯一约束:
1 | CREATE TABLE user5( |
新增name为唯一约束:
1 | ALTER TABLE user5 ADD UNIQUE(name); |
测试:插入数据
1 | INSERT INTO user5(name) VALUES ('cc'); |
总结一下:
主键约束(primary key)中包含了唯一约束
场景:业务需求:设计一张用户注册表,用户姓名必须要用手机号来注册,而且手机号和用户名称都不能为空,那么:
1 | CREATE TABLE user_test( |
这样的话就达到了每一个手机号都只能出现一次,达到了每个手机号只能被注册一次.
用户姓名可以重复,但是手机号码却不能重复,复合正常的逻辑需求
非空约束:
在上面的蓝字中已经添加了非空约束: NOT NULL;
name和phone_number都设置了非空,先只设置name参数不设置phone_number参数试一试
1 | INSERT INTO user_test (name) VALUES ('张三'); |
会出现Field 'phone_number' doesn't have a default value
两个非空参数一起设置:
1 | INSERT INTO user_test (name,phone_number) VALUES ('张三','12345678901'); |
默认约束
1 | CREATE TABLE user6( |
运行DESCRIBE user6;
1 | +--------------+-------------+------+-----+---------+----------------+ |
应用场景:
业务需求:找正常的用户,对这些正常用户进行发放优惠卷或者积分之类的东西,而被禁封的用户我们不让其参加多动.
我们想要封用户只要将status的值从0改为1就行了,当然我们取用户的时候必须要先判断status是否是0.若是1.说明该用户已经被禁封.
先封手机号为’1234’的用户:
1 | UPDATE user6 SET status = 1 WHERE phone_number= '1234'; |
外键约束
1 | CREATE TABLE classes( |
若是像插入班级为5的数据 如:
1 | INSERT INTO student (name,class_id) VALUES ('小周',5); |
我们删除正在被学生表引用的’四班’试试:DELETE classes WHERE name = '四班';
出现:Cannot delete or update a parent row:
不能删除主表中的行
我们先删除学生表中的 ‘小李’从而解除班级中’四班’的外键约束,再来删除’四班’(因为小李引用了四班)DELETE FROM student WHERE name = '小李';
再次删除classes表中的’四班’;DELETE FROM classes WHERE name = '四班';
1 | 最后: SELECT * FROM classes; |
总结:
1.主表中没有的数据,在附表中,是不可以使用的.
2.主表中记录的数据现在正在被附表所引用,那么主表中正在被引用的数据不可以被删除
3.若要想删除,先将附表中的数据删除在删除主表数据
4.对于外键约束大家可以联想 省,市 来进行联想 (市必须要依赖于省,只要省还有一个市在引用,那么就不可以删除省,要不然市就没有省了. 那么我们想删除省,必须要将该省下所有的市全部删除之后,才可以删除这个省)
如何建表之后添加主键约束
1 | CREATE TABLE user4( |
加入主键约束:
1 | ALTER TABLE user4 add PRIMARY KEY(id); |
删除主键约束:
1 | ALERT TABLE user4 DROP PRIMARY KEY; |
使用modify 修改字段.添加约束:
1 | ALTER TABLE user4 MODIFY id INT PRIMARY key; |
给主键设置自增长:
1 | ALTER TABLE user4 MODIFY id INT AUTO_INCREMENT; |
数据库的三大设计范式
1NF
只要字段值还可以继续拆分,就不满足第一范式。
范式设计得越详细,对某些实际操作可能会更好,但并非都有好处,需要对项目的实际情况进行设定。
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 表中的其他字段又完全依赖于主键。满足了第二范式的设计!
3NF
在满足第二范式的前提下,除了主键列之外,其他列之间不能有传递依赖关系。
1 | CREATE TABLE myorder ( |
表中的 customer_phone 有可能依赖于 order_id 、 customer_id 两列,也就不满足了第三范式的设计:其他列之间不能有传递依赖关系。
1 | CREATE TABLE myorder ( |
修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计!