MySQL学习笔记
-
一、如何使用终端操作数据库
-
如何登陆数据库服务器
mysql -uroot -p
-
如何查询数据库服务器中所有的数据
show databases;
-
如何选中某一个数据库进行操作
use sushe;
- SQL语句中的查询
select * from admin;
-
只查询Admin_ID中的一条
select * from admin where Admin_ID=1;
-
如何退出数据库服务器
exit;
-
如何在数据库服务器中创建我们的数据库
create database test;
-
使用test数据库进行操作
use test;
-
查看数据库中的数据表
show tables;
-
创建一个数据表
CREATE TABLE pet ( name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
-
查看数据表是否创建成功
show tables;
-
查看创建好的数据表的结构
describe pet;
-
查看数据表中的记录
select * from pet;
-
如何往数据表中添加数据记录
INSERT INTO pet VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
-
再次查询
select * from pet;
-
删除数据
delete from pet where name='Fluffy';
-
修改数据
update pet set name='旺旺才' where owner='周星驰';
-
mysql常用数据类型
-
日期选择按照格式;数值字符串按照大小!
-
MySQL支持多种类型,大致可以分为三类:
-
数值
类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 byte (-128,127) (0,255) 小整数值 SMALLINT 2 bytes (-32 768,32 767) (0,65 535) 大整数值 MEDIUMINT 3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值 INT或INTEGER 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值 BIGINT 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值 FLOAT 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值 DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值 DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值 -
日期/时间
类型 大小 ( bytes) 范围 格式 用途 DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值 TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间 YEAR 1 1901/2155 YYYY 年份值 DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值 TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳 -
字符串(字符)
类型 大小 用途 CHAR 0-255 bytes 定长字符串 VARCHAR 0-65535 bytes 变长字符串 TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串 TINYTEXT 0-255 bytes 短文本字符串 BLOB 0-65 535 bytes 二进制形式的长文本数据 TEXT 0-65 535 bytes 长文本数据 MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据 MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据 LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据 LONGTEXT 0-4 294 967 295 bytes 极大文本数据 mysql建表约束
-
主键约束
-
它能够唯一确定一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得该字段不重复且不为空。
CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(20) );
- -- 联合主键
-- 联合主键中的每个字段都不能为空,并且加起来不能和已设置的联合主键重复。
CREATE TABLE user ( id INT, name VARCHAR(20), password VARCHAR(20), PRIMARY KEY(id, name) );
insert into user values(1,'张三','123');
- -- 联合主键
-
-
自增约束
- 管控id的值让他可以增长
CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) );
insert into user (name) values('zhangsan');
-
忘记创建主键约束怎么办,可以通过SQL语句设置(两种方式):
CREATE TABLE user ( id INT, name VARCHAR(20) );
-
desc user
- 修改表结构,添加主键
ALTER TABLE user ADD PRIMARY KEY(id); ALTER TABLE user MODIFY id INT PRIMARY KEY;
-
如何删除
alter table user drop primary key;
-
-
唯一约束
- 约束修饰的字段的值不能重复
create table user( id int, name varchar(20) );
-
添加唯一约束
alter table user add unique(name);
-
创建表的时候添加唯一约束
create table user( id int, name varchar(20), unique(name) ); // 或者 create table user( id int, name varchar(20) unique ); //unique(id,name)表示两个键在一起不重复就行 create table user( id int, name varchar(20), unique(id,name) );
-
删除唯一约束
alter table user drop index name;
-
modify添加
alter table user modify varchar(20) unique;
-
总结:
1、建表的时候添加约束 2、可以使用alter... add ... 3、alter... modify ... 4、删除alter ... drop ...
-
非空约束
-
修饰的字段不能为空
CREATE TABLE user ( id INT, name VARCHAR(20) NOT NULL );
-
不传入name值会报错
insert into user (id) values(1); //正确用法 insert into uservalues(1,'zhangsan');
-
-
默认约束
-
当我们插入字段值时,如果没有传值,就会使用默认值
create table user( id int, name varchar(20), age int default 10 );
-
-
外键约束
-
涉及到两个表:父表,子表
-
主表,副表
-
班级表
create table classes( id int primary key, name varchar(20) );
-
学生表
create table classes( id int primary key, name varchar(20), class_id int, foreign key(class_id) references classes(id) );
-
插入四个班
insert into calsses values(1,'一班'); insert into calsses values(2,'二班'); insert into calsses values(3,'三班'); insert into calsses values(4,'四班');
-
往对应的班级添加学生信息
insert into calsses values(1001,'一班',1); insert into calsses values(1002,'二班',2); insert into calsses values(1003,'三班',3); insert into calsses values(1004,'四班',4);
-
结论
- 主表classes中没有的数据值,在副表中,是不可以使用的。
- 主表中的记录被副表引用,是不可以被删除的。
-
数据库的三大设计范式
-
第一范式(1NF)
-
数据表中的所有字段都是不可分割的原子值
create table student( id int primary key, name varchar(20), address varchar(30) ); inser into student values(1,'张三','中国四川省成都市武侯区武侯大道100号'); inser into student values(2,'李四','中国四川省成都市武侯区武侯大道200号'); inser into student values(3,'王五','中国四川省成都市武侯区武侯大道300号');
-
字段还可以继续拆分,就不满足第一范式
create table student( id int primary key, name varchar(20), country varchar(30), privence varchar(30), city varchar(30), details varchar(30) ); inser into student values(1,'张三','中国','四川省','成都市','武侯区武侯大道100号'); inser into student values(2,'李四','中国','四川省','成都市','武侯区武侯大道100号'); inser into student values(3,'王五','中国','四川省','成都市','武侯区武侯大道100号');
-
范式,设计的越详细,对于某些实际操作可能更好,单不一定都是好处。
-
-
第二范式(2NF)
-
在满足第一范式的前提下,其他列都必须完全依赖于主键列。
-
如果出现不完全依赖,只可能发生在联合主键的情况下。
-
订单表
CREATE TABLE myorder ( product_id INT, customer_id INT, product_name VARCHAR(20), customer_name VARCHAR(20), PRIMARY KEY (product_id, customer_id) );
-
除了主键以外的列,只依赖于主键的部分字段。
-
实际上,在这张订单表中,
product_name
只依赖于product_id
,customer_name
只依赖于customer_id
。也就是说,product_name
和customer_id
是没用关系的,customer_name
和product_id
也是没有关系的。 -
拆表
CREATE TABLE myorder ( order_id int primary key, product_id int, customer_id int ); CREATE TABLE product ( id int primary key, name varchar(20) ); CREATE TABLE customer ( id int primary key, name varchar(20) );
-
拆分之后,
myorder
表中的product_id
和customer_id
完全依赖于order_id
主键,而product
和customer
表中的其他字段又完全依赖于主键。满足了第二范式的设计!
-
-
第三范式(3NF)
-
必须先满足第二范式,除开主键的其他列之间不能传递依赖
CREATE TABLE myorder ( order_id INT PRIMARY KEY, product_id INT, customer_id INT, customer_phone VARCHAR(15) );
-
表中的
customer_phone
有可能依赖于order_id
、customer_id
两列,也就不满足了第三范式的设计:其他列之间不能有传递依赖关系。CREATE TABLE myorder ( order_id INT PRIMARY KEY, product_id INT, customer_id INT ); CREATE TABLE customer ( id INT PRIMARY KEY,sql name VARCHAR(20), phone VARCHAR(15) );
-
修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计!
-
参考文献:一天学会 MySQL 数据库
-
-