数据库的设计

1.多表之间的关系

  1. 一对一

    一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键

  2. 一对多

    在多的一方建立外键指向一的一方建立主键

  3. 多对多

    多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键

2.数据库设计的范式:不知道写什么,先跳过

数据库的备份与还原

命令行备份语法:mysqldump -u用户名 -p密码 >保存的路径

还原:

  1. 登录数据库
  2. 创建数据库
  3. 使用数据库
  4. 执行文件 source 文件路径

多表查询

创建两个表

-- constraint 外键名称 foreign key (外键列名称) references 主表名称(注表列名称)
-- 外键列可以省略,系统会自动生成
-- 外键约束,删除被约束的数据的时候,要先删除外键,才可以删除主键,
-- 外键约束,要添加被约束的数据的时候,要先添加主键数据,才可以添加外键
-- 外键约束,外键关联主键不可以关联不存在的数据
-- 外键约束,主键不可以重复,外键可以重复 SELECT * FROM dept;
SELECT * FROM emp;
DROP TABLE dept;
DROP TABLE emp;
# 创建部门表
# 主键表
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,-- id为int类型,主键约束并且自动增长
NAME VARCHAR(20) -- NAME w为字符串类型
);
INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
#创建员工表
# 外键表
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
gender CHAR(1), -- 性别
salary DOUBLE, -- 工资
join_date DATE, -- 入职日期
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键)
);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);

然后执行下面查询语句

SELECT * FROM emp,dept;

什么?竟然出现了15条数据

这是笛卡尔积:就是有两个集合A,B,取这两个集合的所有组成情况。

多表查询的分类:1.内连接查询2.外连接查询3.子查询

内连接查询分为隐式内连接,显示内连接

用内连接来清楚无用的数据

-- 隐式内连接
-- 去除无用的数据
-- 不加上emp.`dept_id` = dept.`id`;的话会出现15条数据
SELECT * FROM emp,dept WHER不E emp.`dept_id` = dept.`id`;
-- 只显示部分需要的数据
SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id`=dept.`id`; -- 显示内连接
-- 语法 SELECT 字段列表 from 表名1 [inner] join 表名2 on 条件
SELECT * FROM emp JOIN dept ON emp.dept_id = dept.id;

外连接

现在新来了一个员工,小白龙,但是没有给他添加部门

INSERT INTO emp(NAME,gender,salary) VALUES('小白龙','男',3000);

有个需求,要求查询所有员工信息,有部门的,则查询部门名称,没有部门的,不显示部门名称,

可以通过外连接来实现这个需求

-- 左外连接语法:SELECT 字段列表 FROM 表1 left [outer] join 表2 on 条件;
-- 查询的是左表的所有数据以及交集部分
-- 左表就是LEFT左边的那个表就是左表
SELECT emp.*,dept.`NAME` FROM emp LEFT JOIN dept ON emp.`dept_id` = dept.`id`;

-- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [outer] join 表2 on 条件;

子查询

  1. 子查询的结果是单行单列的

    ​ 子查询的结果可以作为条件,使用运算符去判断

  2. 子查询的结果是多行单列的

    ​ 子查询的结果可以作为条件,使用in运算符去判断

  3. 子查询的结果是多行多列的

    ​ 子查询可以作为虚拟表

-- 自查询的结果是单行单列的
-- 查询结果只有单行单列
SELECT MAX(salary) FROM emp;-- 子查询
-- 查询员工信息,并且工资等于9000的
SELECT * FROM emp WHERE emp.salary =9000; -- 一套SQL语句完成操作
SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp); -- 查询员工工资小于平均工资的
SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
-- 自查询的结果是多行单列的
-- 查询财务部所有员工信息
-- 先把财务部的id显示出来
SELECT id FROM dept WHERE NAME ='财务部';-- 子查询
-- 然后通过主键id找到关联的外键
SELECT * FROM emp WHERE dept_id=3; -- 查询财务部和市场部所有员工信息 SELECT id FROM dept WHERE NAME ='财务部' OR NAME='市场部';
SELECT * FROM emp WHERE dept_id=3 OR dept_id=2;
-- 查询结果是多行但列的,子查询的结果可以使用in运算符
SELECT * FROM emp WHERE dept_id IN (3,2);
-- 子查询的结果是多行多列的
-- 子查询可以作为虚拟表
-- 查询员工入职日期是2011-11-11之后的员工信息和部门信息
-- 先获取入职日期的子查询
SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11'; -- 子查询
-- 查询结果是多行多列的, SELECT *FROM dept t1,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2 WHERE t1.id=t2.dept_id;
-- 不加上id相等的限定条件的话,会发生笛卡尔积,会显示6条语句
多表查询练习

献上代码,我自己对着视频手敲的,视频没有给源码,感兴趣的可以拿去练习

CREATE DATABASE db3;
-- 部门表
CREATE TABLE dept(
id INT PRIMARY KEY PRIMARY KEY, -- 部门id
dname VARCHAR(50), -- 部门名称
loc VARCHAR(50) -- 部门所在地
);
-- 添加4个部门
INSERT INTO dept(id,dname,loc) VALUES
(10,'教研部','北京'),
(20,'学工部','上海'),
(30,'销售部','广州'),
(40,'财务部','深圳'); -- 职务表,职务名称,职务描述
CREATE TABLE job(
id INT PRIMARY KEY,
jname VARCHAR(20),
description VARCHAR(50)
); -- 添加4个职务
INSERT INTO job(id,jname,description) VALUES
(1,'董事长','管理整个公司,接单'),
(2,'经理','管理部员工'),
(3,'销售员','向客人推销产品'),
(4,'文员','使用办公软件'); -- 员工表
CREATE TABLE emp(
id INT PRIMARY KEY, -- 员工id
ename VARCHAR(50), -- 员工姓名
job_id INT, -- 职务id
mgr INT, -- 上级领导
joindate DATE, -- 入职日期
salary DECIMAL(7,2), -- 工资
bonus DECIMAL(7,2), -- 奖金
dept_id INT, -- 所在部门编号
CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY(job_id) REFERENCES job (id),
CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept (id)
);
-- 添加员工
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES
-- 这里不知道什么原因报错,我一次性插入多条数据会报错,我是一条一条插入,然后二条,三条,插入,他才没有报错
-- (1001,'孙悟空',4,1004,'2000-12-17','8000.00',NULL,20);
-- (1002,'卢俊义',3,1006,'2001-02-20','16000.00','3000.00',30);
-- (1003,'林冲',3,1006,'2001-02-22','12500.00','5000.00',30);
-- (1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20);
-- (1005,'李逵',4,1006,'2001-09-28','12500.00','14000',30);
-- (1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30);
-- (1007,'刘备',2,1009,'2001-09-01','24500.00',NULL,10);
-- (1008,'猪八戒',4,1004,'2007-04-01','30000.00',NULL,20),
-- (1009,'罗贯中',1,NULL,'2001-11-19','50000.00',NULL,10);
-- (10010,'吴用',3,1006,'2001-09-08','15000.00','0.00',30),
-- (10011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,30);
(10012,'李逵',4,1006,'2001-12-03','9500.00',NULL,20),
(10013,'小白龙',4,1004,'2001-12-03','30000.00',NULL,20),
(10014,'关羽',4,1007,'2002-01-23','13000.00',NULL,10); -- 工资等级表
CREATE TABLE salarygrade(
grade INT PRIMARY KEY, -- 级别
losalary INT, -- 最低工资
hisalary INT -- 最高工资
); -- 添加五个工资等级
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);
第一个练习
SELECT * FROM emp;
SELECT * FROM job;
-- 查询所有员工信息,查询员工编号,姓名工资和职务名称,职务描述
-- 难度在于去除重复数据,若不加这条语句t1.job_id = t2.id;会有56条语句产生
-- 原因在于一个表有14行数据,一个表有4行数据,他们会全部一一匹配
SELECT
t1.id,
t1.ename,
t1.salary,
t2.jname,
t2.description
FROM
emp t1,job t2
WHERE
t1.job_id = t2.id;
第二个练习
-- 查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
-- t1 表跟t2 ,t3表都有主键约束
-- 只是比上一个列子多了一个表,还是一样的办法
SELECT
t1.id,
t1.ename,
t1.salary,
t2.jname,
t2.description,
t3.dname,
t3.loc
FROM
emp t1, job t2 ,dept t3
WHERE
t1.job_id = t2.id AND t1.dept_id = t3.id;
第三个练习
-- 查询员工姓名,工资,工资等级
SELECT
t1.ename,
t1.salary,
t2.*
FROM
emp t1 ,salarygrade t2
WHERE
t1.salary BETWEEN t2.losalary AND t2.hisalary;

第四个练习

-- 查询员工姓名,工资(来自emp表),职务名称,职务描述(来自job表),部门名称,部门位置(来自dept表),工资等级(来自salarygrae表)
SELECT
t1.ename,
t1.salary,
t2.jname,
t2.description,
t3.dname,
t3.loc,
t4.grade
FROM
emp t1,job t2,dept t3,salarygrade t4
WHERE
t1.job_id=t2.id -- 员工与职务
AND t1.dept_id = t3.id -- 员工与部门
AND t1.salary BETWEEN T4.losalary AND t4.hisalary;

第五个练习

-- 查询出部门编号,部门名称,部门位置,部门人数
-- 部门编号,部门名称,部门位置,这三个可以通过dept表查到,部门如数需要把他当成一个整体分组查询,把部门当做字段查询
SELECT
t1.id,t1.dname,t1.loc,t2.total
FROM
dept t1,
(SELECT dept_id,COUNT(id) total FROM
emp
GROUP BY dept_id) t2 -- 获得每一个部门的人数,涉及到了聚合函数和分组查询 WHERE t1.id = t2.dept_id;
第六个练习
-- 查询所有员工的姓名及其直接上级的姓名,没有领导员工也要查询
SELECT
t1.ename,
t1.mgr,
t2.id,
t2.ename
FROM emp t1
LEFT JOIN emp t2
ON t1.mgr=t2.id;
事务
  1. 事务的基本介绍

    操作:

    1. 开启事务: start transaction;
    2. 回滚:rollback;
    3. 提交:commit;

    Mysql数据库中事务的默认自动提交

    事务提交有两种方式:

    ​ 自动提交:MySQL是自动提交的,一条DML(增删改)语句就会自动提交一次事务

    ​ 手动提交:Oracle数据库是默认提交事务的

    需要先开启事务,在提交

  2. 事务的四大特征

    1. 原子性:是不看分割的最小操作单位,要么同事成功,要么同事失败
    2. 持久性:当事务提交或回滚后,数据库会持久化保存数据
    3. 隔离性:多个事务之间,相互独立
    4. 一致性:事务操作前后,数据总量不变
  3. 事务的隔离级别

DCL:管理用户,授权

管理用户:

  1. 添加用语法:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

  2. 删除用户语法:DROP USER '用户名'@'主机名';

  3. 修改用户密码:

    ​ UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';或 SET PASSWORD FOR '用户名'@'主机名' = PASSWORD(新密码);

  4. 查询用户:切换到mysql数据库(use mysql);然后查询数据表(select*from user);

    通配符 : % 表示可以在任意主机使用用户登录数据库

权限管理

  1. 查询权限:SHOW GRANTS FOR '用户名'@'主机名';
  2. 授予权限:GRANT 权限列表 ON 数据库名.表名 to '用户名'@'主机名';
  3. 撤销权限:REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';

笔记-JavaWeb学习之旅3的更多相关文章

  1. 笔记-JavaWeb学习之旅5

    CP30的演示 package cn.itcast.datasourcejdbc; import com.mchange.v2.c3p0.ComboPooledDataSource; import j ...

  2. 笔记-JavaWeb学习之旅7

    JavaScript基础 概念:一门客户端脚本语言,运行在客户端浏览器中,每一个浏览器都有JavaScript的解析引擎,是一个脚本语言,不需要编译,直接就可以被浏览器解析执行. JavaScript ...

  3. 笔记-JavaWeb学习之旅19

    Redis:redis是一款高性能的NOSQL系列的非关系型数据库 NOSQL: Not Only SQL ,意即"不仅仅是SQL",是一项全新的数据库理念,泛指非关系型数据库 r ...

  4. 笔记-JavaWeb学习之旅18

    AJAX:ASynchronous JavaScript And XML 异步的JavaScript 和XML 异步和同步:客户端和服务器端相互通信的基础上 同步:客户端操作后必须等待服务器端的响应, ...

  5. 笔记-JavaWeb学习之旅17

    1.过滤选择器 首元素选择器:first 获得选择的元素中的第一个元素 尾元素选择器:last获得选择元素中的最后一个元素 非元素选择器:not(selector) 不包括指定内容的元素 偶数选择器: ...

  6. 笔记-JavaWeb学习之旅16

    增强对象的功能 动态代理:在内存中形成代理类 实现步骤: 代理对象和真实对象实现相同的接口 代理对象 = Proxy.newProxyInstance(); 使用代理对象调用真实对象的方法 增强方法 ...

  7. 笔记-JavaWeb学习之旅15

    Filter:过滤器 概念:当访问服务器的资源是,过滤器可以将请求拦截下来,完成一些特殊的功能 快速入门: 步骤: 定义一个类,实现接口Filter 复写方法 配置拦截路径 package com.d ...

  8. 笔记-JavaWeb学习之旅14

    JSTL:JavaServer Pages Tag Library JSP标准标签库 if标签 <%@ page import="java.util.ArrayList" % ...

  9. 笔记-JavaWeb学习之旅10

    Servlet server applet运行在服务器端的小程序,servlet就是一个接口,定义了Java类被浏览器访问到的规则(Java类重写这个接口,就可以被浏览器(tomcat)识别) Ser ...

  10. 笔记-JavaWeb学习之旅13

    验证码案列 昨天晚上出现的500错误原因在于验证码没有获取到,获取验证码是应该获取的是共享域中的验证码,而我把获取值得键给写成了jsp中的键,而不是内存生成图片中,然后把图片上传到共享域中的键.这两个 ...

随机推荐

  1. Appium,IOS 模拟器,Java工程搭建

    首先进入sample code Test App 有TestApp.xcodeproj文件的工程目录下 下编译出TestApp.app文件 1.新建 java 工程 2.import需要的包 新建cl ...

  2. Redis+EJB实现缓存(一)

        上篇博客大概的对Redis做了一个主要的了解.由于刚刚接触自己也不太明确.所以上篇博客写的乱七八糟的.这篇由于项目须要,学习了一下Redis和EJB集成. 如今脑子相对照较清晰了一些. 实现思 ...

  3. QT实现FTP服务器(一)

    QListenSocket类的实现: #include "QListenSocket.h" #include <QTcpSocket> #include <QDe ...

  4. Mac OS X 开发环境搭建之利用 Parallel Desktop 安装 CentOS 7 [转载]

    背景 在企业级软件系统中,数据库的地位是比较高的,而且一般都要求支持多种数据库,如 Oracle. DB2.MySQL 等,它们的最新版本大多都不再支持 Mac OS X 系统,所以装一个 Linux ...

  5. 牛客练习赛42 E.热爆了

    这可能是全场最长的一份代码 问的其实是对于关键点的斯坦纳树大小 考虑补集转化,不合法的点就是它的子树中没有关键点的点和斯坦纳树根的祖先 树根不难求,关键点中dfs序最大最小点的LCA就是了 问题在前者 ...

  6. hdu-5718 Oracle(水题)

    题目链接: Oracle Time Limit: 8000/4000 MS (Java/Others)     Memory Limit: 262144/262144 K (Java/Others) ...

  7. java8的常用的新特征

    一.Java 8 对接口做了进一步的增强.(默认方法和静态方法) a. 在接口中可以添加使用 default 关键字修饰的非抽象方法.即:默认方法(或扩展方法不用被实现)如:comparator接口. ...

  8. Laravel 在 Nginx 中的参考配置两份

    此份参考自网络: server { listen 80; server_name laravel.app; root /项目目录/public; index index.php index.html ...

  9. 从MyEclipse到IntelliJ IDEA

    如何做到全键盘操作呢? 1.自定义快捷键实现全屏操作 你可以设置自定义快捷键进入全屏操作,并实现各个窗口之间的切换.这样,你就可以告别小窗口的时代,体验全屏显示的效果了!(相信有过多年开发经验的你一定 ...

  10. iOS多线程 NSThread/GCD/NSOperationQueue

    无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...