第一范式(又称 1NF):保证每列的原子性
数据表中的每一列(字段),必须是不可拆分的最小单元,也就是确保每一列的原子性。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。
第二范式(又称 2NF):保证一张表只描述一件事情
满足1NF后要求表中的所有列,每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。
第三范式(又称 3NF):保证每列都和主键直接相关
满足2NF后,要求:表中的每一列都要与主键直接相关,而不是间接相关(表中的每一列只能依赖于主键)。
数据不能存在传递关系,即没个属性都跟主键有直接关系而不是间接关系。像:a–>b–>c 属性之间含有这样的关系,是不符合第三范式的。
数据库中的五大约束包括:
1.主键约束(Primay Key Coustraint) 唯一性,非空性;
2.唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个;
3.默认约束 (Default Counstraint) 该数据的默认值;
4.外键约束 (Foreign Key Counstraint) 需要建立两表间的关系;
5.非空约束(Not Null Counstraint):设置非空约束,该字段不能为空。
五大约束的语法示例:
添加主键约束
Alter table 表名 add Constraint 主键名 primary key(字段)添加唯一约束
Alter table 表名 add Constraint 约束名 unique(字段)添加默认约束
Alter table 表名 add Constraint 约束名 default(默认内容) for 字段名添加检查约束
Alter table 表名 add Constraint 约束名 check (字段表达)添加外键约束
Alter table 表名 add Constraint 约束名 foreign key(字段) references 表名(字段名)
CREATE TABLE `user`(
`id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户id(主键)',
`username` VARCHAR(50) COMMENT '用户姓名',
`age` CHAR(3) COMMENT '用户年龄'
);
INSERT INTO USER VALUES(2,'小二',12);
INSERT INTO USER VALUES(3,'张三',33);
INSERT INTO USER VALUES(4,'李四',24);
INSERT INTO USER VALUES(5,'王五',17);
INSERT INTO USER VALUES(6,'赵六',36);
INSERT INTO USER VALUES(7,'七七',18);
CREATE TABLE `students`(
`id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '学生id(主键)',
`name` VARCHAR(10) COMMENT '学生姓名',
`grade` VARCHAR(10) COMMENT '学生年级',
`chinese` INT COMMENT '语文成绩',
`math` INT COMMENT '数学成绩',
`english` INT COMMENT '英语成绩'
);
INSERT INTO students VALUES(1,'迪丽热巴','二年级',100,100,100);
INSERT INTO students VALUES(2,'古力娜扎','一年级',99,88,98);
INSERT INTO students VALUES(3,'马尔扎哈','三年级',46,20,99);
INSERT INTO students VALUES(4,'阿里巴巴','一年级',78,81,100);
INSERT INTO students VALUES(5,'哈哈哈哈','六年级',20,10,5);
INSERT INTO students VALUES(6,'作者本人','二年级',100,100,100);
INSERT INTO students VALUES(7,'嘻嘻哈哈','五年级',70,99,60);
INSERT INTO students VALUES(8,'哭哭啼啼','四年级',33,15,54);
列名或者表名和 MySQL 关键字冲突可以使用 ` 符号,键盘esc 下面,1 左边,Tab 上面;
注意 ==> 如果成绩类型是 varcher ,那使用排序将会显示不正确。
SELECT * FROM USER;
SELECT * FROM USER WHERE age >= 18;
SELECT username FROM USER WHERE age < 18;
SELECT u.* FROM USER AS u;
SELECT u.`username`,u.`age` FROM USER u WHERE u.`username`='小二' && u.`age`=12;
SELECT * FROM USER WHERE username='张三' && age < 18;
SELECT s.chinese + s.math + s.english FROM students s WHERE s.name = '哈哈哈哈';
(良 60-70,中70-80,优80-90,优秀90-100)
SELECT NAME FROM students WHERE chinese BETWEEN 60 AND 80;
SELECT NAME FROM students WHERE math NOT BETWEEN 60 AND 100;
SELECT s.`id`,s.`name` FROM students s WHERE !(s.`english` BETWEEN 0 AND 90);
SELECT * FROM students WHERE grade IN ('一年级','二年级');
*查询一年级,二年级,三年级以外的学生信息
where 列名 not in (值1,值2,值3);
SELECT * FROM students WHERE grade NOT IN ('一年级','二年级','三年级');
SELECT * FROM students WHERE `name` IS NULL;
where 列名 like '%巴'; -- 表示以 巴 结尾的;
where 列名 like '巴%'; -- 表示以 巴 开头的;
where 列名 like '%巴巴%' -- 表示数据里面包含 巴巴 的;
SELECT * FROM students WHERE `name` LIKE '%巴';
SELECT * FROM students WHERE `name` LIKE '作者%';
SELECT * FROM students WHERE `name` LIKE '%嘻哈%';
SELECT * FROM students WHERE `name` LIKE '%哈_';
SELECT * FROM students WHERE grade IN ('一年级','二年级','三年级') ORDER BY chinese DESC;
分页查询( beginIndex 表示从第几条数据开始(也可以说是跳过前面多少页),第一页从0开始。pageSize 表示每页显示多少条数据);
select * from 表名 where 条件 limit beginIndex , pageSize;
分页算法公式 (当前页 - 1)* pageSize;
比如说每页 10页 分页。
第一页 limit 0,10; // 显示 0-10;跳过前面0条数据
第二页 limit 10,10; // 显示 11-20;跳过前面10条数据
第三页 limit 20,10; // 显示 21-30;跳过前面20条数据
查询全部学生,每页三条数据
第一页
SELECT * FROM students LIMIT 0,3;
SELECT * FROM students LIMIT 3,3;
SELECT * FROM students LIMIT 6,3;
CREATE TABLE `city` (
`id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
`city_name` VARCHAR(100) COMMENT '城市名',
`city_year` VARCHAR(4) COMMENT '年份,yyyy',
`city_gdp` DOUBLE COMMENT '当前年份,城市一整年的GDP,单位亿元',
`city_population` DOUBLE COMMENT '当前年丰,城市的总人口,单位万人'
);
INSERT INTO city VALUES(1,'上海',2018,32679,2418);
INSERT INTO city VALUES(2,'北京',2018,30320,2171);
INSERT INTO city VALUES(3,'深圳',2018,24691,1253);
INSERT INTO city VALUES(4,'广州',2018,23000,1450);
INSERT INTO city VALUES(5,'重庆',2018,20363,3372);
INSERT INTO city VALUES(6,'上海',2019,38155,2424);
INSERT INTO city VALUES(7,'北京',2019,35371,2171);
INSERT INTO city VALUES(8,'深圳',2019,26927,1302);
INSERT INTO city VALUES(9,'广州',2019,23628,1491);
INSERT INTO city VALUES(10,'重庆',2019,23605,3372);
SELECT COUNT(*) FROM city WHERE city_year = '2019';
SELECT MAX(city_gdp) FROM city WHERE city_year = '2018';
SELECT MIN(city_gdp) FROM city WHERE city_year = '2018';
SELECT SUM(city_gdp) FROM city WHERE city_year = '2019';
SELECT AVG(city_gdp) FROM city WHERE city_year = '2019';
insert into 表名(字段1,字段2,字段3,…)values(值1,值2,值3,…);
INSERT INTO students(id,NAME,grade,chinese,math,english)
VALUES( 9,'鸡鸡鸡鸡','七年级',77,77,77);
INSERT INTO 表名(字段1,字段2,字段3) VALUES (值1,值2,值3),(值1,值2,值3); -- 插入多条数据
INSERT INTO 表名 VALUES(值1,值2); -- 针对表全字段进行插入操作
INSERT INTO 表名(字段) SELECT 字段 FROM 表2; -- 查询结果插入
INSERT INTO 表名 SELECT 字段 FROM 表2; -- 查询结果,全表插入
update 表名 set 字段=值 where 条件; -- 带条件的去修改指定数据,否则修改全表;
UPDATE students SET english = 10 WHERE `name` = '哈哈哈哈';
delete from 表名 where 条件; -- 删除数据带条件删除,否则删除全表的数据
DELETE FROM students WHERE `name` = '鸡鸡鸡鸡';
MySQL DDL 语句
MySQL CRUD 语句
MySQL 聚合函数
MySQL 多表查询