MySQL数据库的常用操作

时间:2022-09-16 14:43:33
-- 数据库的常用操作
-- 管理数据:查看、添加、修改、删除数据
-- 查询数据:查询所有字段、查询指定字段、查询时指定别名、查询时合并列、查询时添加常量列、查询时取出重复数据
-- 条件查询、分页查询、查询后排序、聚合(统计)查询、分组查询、分组后筛选(条件)、子查询
-- 数据约束
-- 约束分类:默认值、非空、唯一、主键、自增长约束、外键、级联操作
-- 数据库设计:第一范式、第二范式、第三范式


student表数据: MySQL数据库的常用操作
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

-- 数据库范式跟数据库查询效率成反比!
-- 数据库范式越高,查询效果越低!