java_day15

我是研究僧i 提交于 2019-12-04 01:20:21

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中

DQL查询语句—聚合函数

聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值NULL。

-- 五个聚合函数
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;

DQL查询语句—分组

分组查询是指使用GROP BY语句对查询信息进行分组

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的区别

  • having是在分组后对数据进行过滤

  • where是在分组前对数据进行过滤

  • having后面可以使用聚合函数

  • where后面不可以使用聚合函数

DQL查询语句-limit语句

LIMIT限制的意思,所以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;

DCL创建用户

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

外键是主键:主表的主键和从表的主键,形成主外键关系

 

一对多

建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键

 

多对多

建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键

多表的查询

 

 

笛卡尔积现象

左表的每条数据会和右表的每条数据组合, 这种现象就是笛卡尔积现象

要去掉笛卡尔积:从表的外键=主表的主键 也称为表连接

表连接查询

内连接

内连接:多表查询时获取符合条件的数据

隐式内连接

隐式内连接:看不到JOIN关键字,条件使用WHERE指定

SEKECT * FROM 表1,表2, WHERE 条件;
显示内连接

显式内连接:使用INNER JOIN ... ON语句, 可以省略INNER

SELECT * FROM 左表 INNER JOIN 右表 ON 表连接条件 WHERE 查询条件;

 

 

外连接
左外连接

左外连接可以理解为:将满足要求的数据显示,左表不满足要求的数据也显示(在内连接的基础上,保证左表的数据全部显示)

左外连接:使用LEFT OUTER JOIN ... ONOUTER可以省略

SELECT * FROM 左表 LEFT OUTER JOIN 右表 ON 表连接条件 WHERE 查询条件;
右外连接

右外连接可以理解为:满足要求的数据显示,并且右表不满足要求的数据也显示(在内连接的基础上保证右边的数据全部显示)

右外连接:使用RIGHT OUTER JOIN ... ONOUTER可以省略

SELECT * FROM 左表 RIGHT OUTER JOIN 右表 ON 表连接条件 WHERE 查询条件;

 

 

子查询

一个查询语句的结果作为另一个查询语句的一部分

SELECT 查询字段 FROM 表 WHERE 条件;

SELECT * FROM empoyee WHERE salary=(SELECT MAX(salary) FROM)
-- 子查询需要放在()中
-- 先执行子查询,将子查询的结果作为父查询的一部分
子查询的结果是单行单列

子查询结果是单列,在WHERE后面作为条件

SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
子查询的结果是多行单列

子查询结果是多行单列,结果集类似于一个数组,在WHERE后面作为条件,父查询使用IN运算符

SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询)
子查询的结果是多行多列

子查询结果是多列,在FROM后面作为

SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!