-- 数据库的常用操作
-- 管理数据:查看、添加、修改、删除数据
-- 查询数据:查询所有字段、查询指定字段、查询时指定别名、查询时合并列、查询时添加常量列、查询时取出重复数据
-- 条件查询、分页查询、查询后排序、聚合(统计)查询、分组查询、分组后筛选(条件)、子查询
-- 数据约束
-- 约束分类:默认值、非空、唯一、主键、自增长约束、外键、级联操作
-- 数据库设计:第一范式、第二范式、第三范式
student表数据:
MySQL语句:
-- 查看数据库
SHOW DATABASES;
-- 使用数据库
USE day15;
-- 查看表
SHOW TABLES;
SELECT * FROM student;
-- 查询数学成绩大于60小于90的学生
SELECT * FROM student WHERE math BETWEEN 60 AND 90;
-- 查询姓名不等于李一的学生
SELECT * FROM student WHERE NAME<>'李一';
-- 为表添加一列性别默认为难
ALTER TABLE student ADD COLUMN gender CHAR(1) DEFAULT '男';
-- 将id为7的性别改为女
UPDATE student SET gender='女' WHERE id=7;
-- 添加数据
INSERT INTO student VALUES(8,'婓南苇',99,100,100,'女');
-- 删除数据
DELETE FROM student WHERE id = 8 ;
-- 修改数据
UPDATE student SET NAME='李诗雁',gender='女' WHERE id =4;
UPDATE student SET gender=NULL WHERE id=2;
UPDATE student SET gender='' WHERE id=6;
SELECT * FROM student;
-- 查询指定字段
SELECT NAME,gender FROM student;
-- 查询是指定别名
SELECT NAME '姓名',gender '性别' FROM student;
-- 查询没有真实性别数据的学生
SELECT * FROM student WHERE gender IS NOT NULL OR gende='';
-- 分页查询
-- 查询第1,2条数据
SELECT * FROM student LIMIT 0,2;
-- 查询第5,6,7条数据
SELECT * FROM student LIMIT 4,3;
-- 目前共8条数据,每页显示3条数据,共3页
-- 第一页:
SELECT * FROM student LIMIT 0,3;
-- 第二页:
SELECT * FROM student LIMIT 3,3;
-- 第三页:
SELECT * FROM student LIMIT 6,3;
-- 查询每页数据的sql
SELECT * FROM student LIMIT (当前页-1)*每页行数,每页行数;
-- 查询后排序(order by)
-- 一个排序,按id排序
SELECT * FROM student ORDER BY id DESC;
-- 多个排序:按chinese降序,再按照math降序
SELECT * FROM student ORDER BY chinese DESC,math DESC;
-- 聚合(统计)查询
-- 查询学生chinese的最高分
SELECT MAX(chinese) FROM student;
-- 查询学生english的最低分
SELECT MIN(english) FROM student;
-- 查询所有学生的math总分
SELECT SUM(math) FROM student;
-- 查找chinese的平均分
SELECT AVG(chinese) FROM student;
-- 查询现在有多少名
SELECT COUNT(*) FROM student;
-- count(字段)如果存在null,则不统计该数量
SELECT COUNT(gender) FROM student;
-- 分组查询(groud by)
-- 查询男女各有几人
SELECT gender, COUNT(math) FROM student WHERE gender IS NOT NULL AND gender<>'' GROUP BY gender;
-- 分组后筛选(条件)
-- 查询人数大于2人的性别
-- 1,先把性别进行分组;2、再对每组人数进行统计;3、统计人数大于2
SELECT gender,COUNT(gender) FROM student WHERE gender IS NOT NULL AND gender<>'' GROUP BY gender HAVING COUNT(gender)>2;
-- 子查询:把一个sql查询的结果作为另一个查询的条件
-- 查询chinese最高分的学生
SELECT * FROM student WHERE chinese=(SELECT MAX(chinese) FROM student);
-- 约束分类
-- 默认值
CREATE TABLE staff(
id INT,
NAME VARCHAR(20),
gender CHAR(1) DEFAULT'男'
);
INSERT INTO staff(id,NAME) VALUES(1,'左莫');
INSERT INTO staff(id,NAME) VALUES(2,'韦剑胜');
INSERT INTO staff(id,NAME) VALUES(3,'我离');
-- 删除表
DROP TABLE staff;
-- 非空
-- name不能出现null;
CREATE TABLE staff(
id INT,
NAME VARCHAR(20) NOT NULL,
gender CHAR(1)
);
INSERT INTO staff(id,NAME,gender) VALUES(1,'左莫','男');
INSERT INTO staff(id,NAME,gender) VALUES(2,'韦剑胜','男');
INSERT INTO staff(id,gender) VALUES(3,'男'); -- 将会自动赋值空字符串
-- 唯一
-- id值唯一
CREATE TABLE staff(
id INT UNIQUE,
NAME VARCHAR(20),
gender CHAR(1)
);
-- 插入数据
INSERT INTO staff(id,NAME,gender) VALUES(1,'左莫','男');
INSERT INTO staff(id,NAME,gender) VALUES(1,'韦剑胜','男') -- 错误;Duplicate entry '1' for key 'id'
INSERT INTO staff(id,gender) VALUES(3,'男'); -- 将会自动赋值空字符串
SELECT * FROM staff;
-- 主键
CREATE TABLE staff(
id INT PRIMARY KEY,
NAME VARCHAR(20),
gender CHAR(1)
);
INSERT INTO staff(id,NAME,gender) VALUES(1,'左莫','男');
INSERT INTO staff(id,NAME,gender) VALUES(1,'韦剑胜','男') -- 错误;Duplicate entry '1' for key 'PRIMARY'
INSERT INTO staff(id,gender) VALUES(3,'男'); -- 将会自动赋值空字符串
DROP TABLE staff;
-- 自增长
CREATE TABLE staff(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
gender CHAR(1) DEFAULT '男'
);
INSERT INTO staff(NAME) VALUES('左莫');
INSERT INTO staff(NAME) VALUES('韦剑胜');
INSERT INTO staff(NAME) VALUES('我离');
SELECT * FROM staff;
-- delete from: 这种删除不会影响自增长约束
-- truncate table:这种删除会影响自增长约束(必须是全表删除)(用的少)
TRUNCATE TABLE staff;
-- 外键
-- 先建立主表:部门表
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
departName VARCHAR(20)
);
-- 再建立副表或从表:员工表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
deptId INT,
CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
-- 外键名称 外键字段 参考表(主键)
);
-- 级联操作
-- 即对主表进行操作的结果同时副表也会有相同的效果
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
deptId INT,
CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE
-- 给外键天机级联修改和级联删除
);
-- 数据库设计
-- 第一范式
-- 每个表的每个字段都必须是(从业务角度)不可分割的独立单元!
student : id NAME -- 违反第一范式
1 张三|小三
2 李四|铁四
student id NAME oldname -- 符合第一范式
1 张三 小三
2 李四 铁四
-- 第二范式
student: id NAME id NAME(老师的名字)-- 违反第二范式
1 张三
2 李四
1 老乐
2 老王
student: id NAME -- 符合第二范式
1 张三
2 李四
teacher: id NAME
1 老乐
2 老王
-- 第三范式
-- 在第二范式的基础上,一张表的主键除外的去爱她字段都应该跟主键字段是直接决定关系
employee: id NAME gender deptName(出现冗余) -- 违反第三范式
admin: id NAME
employee: id NAME deptId(fk) -- 符合第三范式
dept: id deptName
admin: id NAME
-- 数据库范式跟数据库查询效率成反比!
-- 数据库范式越高,查询效果越低!