MySQL数据库
级联更新:ON UPDATE CASADE -- 主表主键修改,从表外键的值也跟着修改 级联删除:ON DELETE CASCADE -- 主表的主键删除,从表外键值相同的也删除 -- 例子 CREATE TABLE department ( -- 创建部门表 id INT PRIMARY KEY AUTO_INCREMENT, -- 部门ID 设置id自动增长 dep_name VARCHAR(20), -- 部门名字 dep_location VARCHAR(20) -- 部门地址 ); -- 添加2个部门 INSERT INTO department (dep_name, dep_location) VALUES ('研发部', '广州'), ('销售部', '深圳'); -- 创建员工表 CREATE TABLE employee ( id INT PRIMARY KEY AUTO_INCREMENT, -- 员工id NAME VARCHAR(30), -- 员工名字 age INT, -- 员工年龄 dep_id INT -- 部门id ); -- 在已有表增加外键约束 ALTER TABLE employee ADD CONSTRAINT employee_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE -- 级联更新 ON DELETE CASCADE; -- 级联删除 -- 添加数据到员工表和部门表 INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1); INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1); INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1); INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2); INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2); INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2); UPDATE department SET id=10 WHERE id=1; -- 把部门表中id等于1的部门改成id等于10 DELETE FROM department WHERE id=2; -- 删除部门号是2的部门
INSERT INTO 表名 SELECT * FROM 表名2; -- 将表2的数据插到表1 -- 创建student2表,student结构和student表结构一样 CREATE TABLE student2 LIKE student; -- 将student表中的数据添加到student2表中 INSERT INTO student2 SELECT * FROM student;-- 将student的数据复制到student2中
-- 五个聚合函数 count(列名):统计指定列记录数,记录为NULL的不统计 sum(列名):计算指定列的数值和,如果不是数值类型,那么计算结果为0 max(列名):计算指定列的最大值 min(列名):计算指定列的最小值 avg(列名):计算指定列的平均值
-- 使用:写在 SQL语句`SELECT`后 `字段名`的地方 SELECT 字段名, 字段名 FROM 表名; SELECT 聚合函数, 字段名 FROM 表名; -- 1.查询学生总数 SELECT COUNT(egnlish) FROM student; -- 对于NULL的记录不会统计 SELECT COUNT(*) FROM student3; -- 统计数量常用 -- 2.查询年龄大于40的总数 SELECT COUNT(*) FROM student WHERE age<40; -- 3.查询数学成绩总分 SELECT SUM(math) FROM student; -- 4.查询数学成绩最高分 SELECT MAX(math) FROM student; -- 5.查询数学成绩最低分 SELECT MIN(math) FROM student; -- 6.查询数学成绩平均分 SELECT AVG(math) FROM student;
SELECT * FROM 表名 WHERE 条件 GROUP BY 字段 -- 1.将分组字段结果中相同的内容作为一组 SELECT sex FROM 表名 GROUP BY sex; -- 这句话会将sex相同的数据作为一组 -- 2.查询男女各多少人 -- (1).查询所有数据,按性别分组 -- (2).统计每组人数 SELECT sex, COUNT(*) FROM student3 GROUP BY sex; -- 3.查询年龄大于25岁的人,按性别分组,统计每组的人数 -- (1).先过滤掉年龄小于25岁的人 -- (2).再分组 -- (3).最后统计每组的人数 SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex; -- 4.查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据 有很多同学可能会将SQL语句写出这样: SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex WHERE COUNT(*) >2; -- 注意: 并只显示性别人数>2的数据属于分组后的条件,对于分组后的条件需要使用`having`子句 SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex HAVING COUNT(*) >2; 只有分组后人数大于2的`男`这组数据显示出来
having与where的区别
-
-
where是在分组前对数据进行过滤
-
having后面可以使用聚合函数
-
where后面不可以使用聚合函数
DQL查询语句-limit语句
-- 准备数据 INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES (9,'唐僧',25,'男','长安',87,78), (10,'孙悟空',18,'男','花果山',100,66), (11,'猪八戒',22,'男','高老庄',58,78), (12,'沙僧',50,'男','流沙河',77,88), (13,'白骨精',22,'女','白虎岭',66,66), (14,'蜘蛛精',23,'女','盘丝洞',88,88); iSELECT * FROM 表名 WHERE 条件 LIMIT offset, length; -- offset`是指偏移量,可以认为是跳过的记录数量,不写则默认为0。 -- `length`是指需要显示的总记录数 -- 1.查询学生表中数据,跳过前面2条,显示6条 SELECT * FROM student3 LIMIT 2,6; -- 2.假设我们一每页显示5条记录的方式来分页,SQL语句如下: -- 每页显示5条 -- 第一页: LIMIT 0,5; 跳过0条,显示5条 -- 第二页: LIMIT 5,5; 跳过5条,显示5条 -- 第三页: LIMIT 10,5; 跳过10条,显示5条 SELECT * FROM student3 LIMIT 0,5; SELECT * FROM student3 LIMIT 5,5; SELECT * FROM student3 LIMIT 10,5;
SHOW DATABASES day15 -- 创建用户 CREATE USER 'userl'@'localhost' IDENTIFIED BY '123' CREATE USER'user2'@'%' IDENTIFIED BY '123' -- 添加权限 GRANT 权限1,权限2...ON 数据名,表名, TO '用户名'@’主机名‘ -- 删除权限 REVOKE 权限,...ON 数据库名 表名 FROM '用户名'@’主机名‘ -- 删除用户 DROP USER '用户名'@'主机名'; -- 修改管理员密码 mysqladmin - uroot -p password 新密码 -- 修改用户密码 set password for '用户名'@’主机名‘ = password('新密码')
-- DOS命令行的方式备份和还原表中的数据 -- 格式:mysqldump -u用户名 -p密码 数据名> 文件的路径 -- 还原 :SOURCE 文件路径
三大范式
第一范式:表中的字段不能再拆分,直接可以使用
第二范式:1.一张表值描述一件事情(一个实体)2.给表添加主键
第三范式:表中的字段引用其他表的主键
一对一
两种建表原则:
外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一UNIQUE
外键是主键:主表的主键和从表的主键,形成主外键关系
一对多
建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键
多对多
建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键
笛卡尔积现象
左表的每条数据会和右表的每条数据组合, 这种现象就是笛卡尔积现象
要去掉笛卡尔积:从表的外键=主表的主键 也称为表连接
SEKECT * FROM 表1,表2, WHERE 条件;
显示内连接
SELECT * FROM 左表 INNER JOIN 右表 ON 表连接条件 WHERE 查询条件;
SELECT * FROM 左表 LEFT OUTER JOIN 右表 ON 表连接条件 WHERE 查询条件;
SELECT * FROM 左表 RIGHT OUTER JOIN 右表 ON 表连接条件 WHERE 查询条件;
SELECT * FROM empoyee WHERE salary=(SELECT MAX(salary) FROM) -- 子查询需要放在()中 -- 先执行子查询,将子查询的结果作为父查询的一部分
SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询)
SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;