中软Day12
数据库的英文单词: DataBase 简称 : DB DBA --> 数据库管理员
什么数据库?
数据库的特点:
常见的数据库 Oracle sqlserver mysql 关系型数据库 redis MongoDB NoSql(not only)
安装
卸载
配置
什么是SQL?
Structured Query Language:结构化查询语言
其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。
SQL通用语法
SQL 语句可以单行或多行书写,以分号结尾。 js 可以写也可以不写分号。
可使用空格和缩进来增强语句的可读性。
MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
3 种注释
单行注释: – 注释内容 或 # 注释内容(mysql 特有)
多行注释: /* 注释 */
SQL分类
操作数据库:CRUD
C(Create):创建
创建数据库
create database 数据库名称
创建数据库,判断不存在,再创建
create database if not exists 数据库名称
创建数据库 并指定数据字符集
create database 数据库名称 character set gbk;
练习: 创建db4数据库,判断是否存在,并制定字符集为gbk
create database if not exists db4 character set gbk;
R(Retrieve):查询
查找所有数据库
show databases
查询字符集 查询某个数据库的创建语句
show create databse 数据库名称
U(Update):修改
修改数据库的字符集
alter database 数据库名称 character set 字符集名称;
D(Delete):删除
删除数据库
drop database 数据库名称;
判断数据库存在,存在再删除
drop database if exists 数据库名称;
使用数据库
查询当前正在使用的数据库名称
select database();
使用数据库
use 数据库名称;
操作表
C(Create):创建
语法
create table 表名(
列名1 数据类型1,
列名2 数据类型2,
....
列名n 数据类型n
);
注意:最后一列,不需要加逗号(,)
数据类型:
1.int 整数类型 age
2.double 小数类型 scroe double(5,2) 333.33 4,1 333.3
3.date 日期 只包含年月日 yyyy-MM-dd
4.datetime 日期 包含年月日时分秒 yyyy-MM-dd HH:mm:ss
5.timestamp 时间戳 包含年月日时分秒 1970.1.1
6.varchar 字符串 name varchar(20) 姓名最大20个字符 张三 2个 zhangsan 8个
R(Retrieve):查询
查询某个数据库中所有的表名称
show tables;
查询表结构
desc 表名;
U(Update):修改
修改表名
alter table 表名 rename to 新的表名;
alter table 表名 character set 字符集名称;
alter table 表名 add 列名 数据类型;
alter table 表名 change 列名 新列别 新数据类型;
alter table 表名 modify 列名 新数据类型;
删除列
alter table 表名 drop 列名;
D(Delete):删除
* drop table 表名;
* drop table if exists 表名;
添加数据
语法
* insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
insert into 表名(id,name,age) values(值1,值2,...值n);
注意
列名和值要一一对应。
如果表名后,不定义列名,则默认给所有列添加值
insert into 表名 values(值1,值2,...值n);
除了数字类型,其他类型需要使用引号(单双都可以)引起来
删除数据
语法
delete from 表名 [where 条件]
注意
如果不加条件,则删除表中所有记录。
如果要删除所有记录
delete from 表名;
不推荐使用 有多少条记录就执行多少次删除操作
TRUNCATE TABLE 表名;
推荐使用 效率高 删除表,再创建一张一样的表
修改数据:
update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件];
select * from 表名;
怎么优化数据库 主从分离 读写分离 主表(读),从表(写)
语法
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
基础查询
多个字段的查询
select 字段名1,字段名2... from 表名;
去除重复:
distinct
计算列
起别名:
条件查询
where子句后跟条件
运算符
* > 、< 、<= 、>= 、= 、<>(不等于 !=)
* BETWEEN...AND
* IN( 集 合)
* LIKE:模糊查询
* 占位符:
* _:单个任意字符 * %:多个任意字符
* IS NULL
* and 或 &&
* or 或 ||
* not 或 !
排序查询
语法:order by 子句
ORDER BY 排序字段1,排序方式1,排序字段2,排序方式2
ORDER BY 列名称 排序规则 -- 基础语法
排序方式:
注意: 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
案例:
SELECT * FROM 学生表 ORDER BY 数学成绩 ASC ; -- 按照数学成绩升序排列
SELECT * FROM 学生表 ORDER BY 数学成绩 ASC , 英语成绩 DESC; -- 先按照数学成绩升序排,数学成绩相同就按英语成绩降序
分组查询
语法:group by 分组字段 —— 子句
注意事项
a.分组之后,查询的结果是 分组的字段 或者是 聚合函数
b.两个区别 WHERE 和 HAVING
WHERE 分组之前的条件筛选,不满足条件,不参与分组. 后面不能跟聚合函数
HAVING 分组之后的条件筛选,不满足条件,不会显示出来. 后面直接跟聚合函数
案例:
-- 根据性别进行分组,查询学生表当中的性别和对应的人数
SELECT 性别,COUNT(主键id) FROM 学生表 GROUP BY 性别;
-- 从学生表当中查询成绩大于80,对性别分组要求人数大于2,显示最后的结果
SELECT COUNT(主键id) FROM 学生表 WHERE 成绩>80 GROUP BY 性别 HAVING COUNT(主键ID)>2;
聚合函数
常用的聚合函数
注意事项
聚合函数排除为NULL值的列.解决方案:
不采用 为NULL的列
函数 IFNULL(列名,0)
案例:统计学生表当中,数学成绩的平均分
SELECT AVG(IFNULL(数学成绩,0)) FROM 学生表;
分页查询(mysql数据库专属的LIMIT)
基础格式
LIMIT 是限制的意思,所以 LIMIT 的作用就是限制查询记录的条数。
SELECT *|字段列表 [as 别名] FROM 表名 [WHERE 子句] [GROUP BY 子句][HAVING 子句][ORDER BY 子句][LIMIT 子句];
LIMIT 起始位置,每页条数
计算公式:起始位置 = (当前页数-1)*每页条数
案例: 每页条数显示4条,在第6页的写法
SELECT * FROM 表名称 LIMIT 20,4; -- (6-1)*4 =20
多表查询
select
列名列表
from
表名列表
where....
查询思路
where 和 having 的区别
where 是分组之前,不满足不参与分组 having 是分组之后,不满足没有结果
having 聚合函数 where 不跟聚合函数
笛卡尔积
语法:
SELECT * FROM 表名称1,表名称2;
多表查询的分类:
内连接查询:
隐式内连接: 使用where条件取消除无用数据
语法:
SELECT * FROM 表1,表2 WHERE 表1.列1 = 表2.列2; -- 标准写法
SELECT * FROM 表1 别名1,表2 别名2 WHERE 别名1.列1 = 别名2.列2; -- 别名的写法
显式内连接:
语法:
SELECT * FROM 表1 INNER JOIN 表2 ON 表1.列1 = 表2.列2; -- 完整格式
SELECT * FROM 表1 JOIN 表2 ON 表1.列1 = 表2.列2; -- 省略INNER的格式
a.特点:
两个表当中交集的部分.取数据多的。
表1,有8条数据,6条数据在交集当中.
表2,有20条数据,10条数据在交集当中.
那么采用内连接查询的结果是 10 条数据。
b.两个表内连接查询的时候,
表1有10条数据,表2有5条数据.请问.最多有多少条数据,最少有多少条数据?
最多10条,最少0条。
外链接查询:
左外连接:
语法
SELECT * FROM 表1 LEFT OUTER JOIN 表2 ON 表1.列1 = 表2.列2; -- 完整格式
SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.列1 = 表2.列2; -- 省略OUTER的格式
作用:查询左表所有数据及其交集部分
右外连接:
语法
SELECT * FROM 表1 RIGHT OUTER JOIN 表2 ON 表1.列1 = 表2.列2; -- 完整格式
SELECT * FROM 表1 RIGHT JOIN 表2 ON 表1.列1 = 表2.列2; -- 省略OUTER的格式
作用:查询右表所有数据及其交集部分
子查询
概念:查询中嵌套查询,称嵌套查询为子查询。
子查询的不同情况
子查询的结果可以是单行单列的
子查询作为条件 使用运算符去判断 > >= < <= <> !=
案例:
-- 查询最高工资的员工信息
原始做法:
SELECT MAX(gongzi) FROM yuangong; -- 查询到最高的员工工资
SELECT * FROM yuangong WHERE gongzi = 查询到的结果; -- 查询到的最高工资作为条件.再查询他信息
子查询的情况:
SELECT * FROM yuangong WHERE gongzi = (SELECT MAX(gongzi) FROM yuangong);
子查询结果是多行单列
子查询作为条件 使用运算符IN( (选项1,选项2,选项3) )进行
案例:
-- 查询财务部和市场部的员工信息
原始做法:
SELECT id FROM yuangong WHERE name IN ('财务部','市场部');
-- 查询到财务部和市场部的ID
SELECT * FROM yuangong WHERE id = 查询到的id结果; -- 通过查询到的结果作为条件,查询满足条件的所有员工信息
子查询的情况:
SELECT * FROM yuangong WHERE id IN (SELECT id FROM yuangong WHERE name IN ('财务部','市场部'));
子查询结果是多行多列的,,作为虚拟表,进行连接查询
案例:
-- 查询入职日期是2011-11-11日之后的员工信息和部门信息
子查询的情况:
SELECT * FROM bumen t1 ,(SELECT * FROM yuangong WHERE yuangong.join_date > '2011-11-11') t2 WHERE t1.id = t2.bumen_id;
采用普通内连接:
SELECT * FROM bumen t1 , yuangong t2 WHERE t1.id = t2.bumen_id AND t2.join_date > '2011-11-11';
非空约束:某一列不能为 null。
1.名称:NOT NULL
2.效果:不能添加为空的数据.(“姓名”,“商品编号”)
3.三种操作的方式
a. 创建表的时候,添加非空约束
CREATE TABLE 表名称 (列名1 数据类型1,列名2 数据类型2 NOT NULL);
b.表创建完毕之后,再添加非空约束
ALTER TABLE 表名称 MODIFY 列名称 数据类型 NOT NULL;
c.删除非空约束
ALTER TABLE 表名称 MODIFY 列名称 数据类型;
主键约束:用来唯一标识数据库中的每一条记录。
名称:
PRIMARY KEY 主键的关键字
AUTO_INCREMENT 自动增长的关键字(根据上一行的数据进行自动增长)
效果
主键效果: 非空并且唯一,而且在一张表当中只能有一个主键
自动增长: 在上一行的基础上,自动加上1
三种操作的方式
a.创建表的时候,添加主键约束
CREATE TABLE 表名称 (列名1 数据类型1 PRIMARY KEY AUTO_INCREMENT,列名2 数据类型2);
b.表创建完毕之后,再添加主键约束【条件:不能有重复的】
ALTER TABLE 表名称 MODIFY 列名称 数据类型 PRIMARY KEY AUTO_INCREMENT;
c.删除主键约束
ALTER TABLE 表名称 DROP PRIMARY KEY; -- 删除主键约束
ALTER TABLE 表名称 MODIFY 自动增长的列名称 自动增长的数据类型; -- 删除自动增长的效果
外键约束:在从表中与主表主键对应的那一列。
CREATE TABLE 表名称(
列名1 数据类型1,
列名2 数据类型2,
CONSTRAINT 外键别名 FOREIGN KEY (外键列名称) REFERENCES 其他表名称(其他表主键)
);
b. 表创建完毕之后,再添加外键约束
ALTER TABLE 表名称 ADD CONSTRAINT 外键别名 FOREIGN KEY (外键列名称) REFERENCES 其他表名称(其他表主键);
c. 删除外键约束
ALTER TABLE 表名称 DROP FOREIGN KEY 外键别名;
外键级联操作
a.级联的含义:
多个表主外键关系删除和修改的时候,彼此之间会受到影响
b.两个级联的关键字
级联更新 ON UPDATE CASCADE
级联删除 ON DELETE CASCADE
c.添加级联操作的语法
ALTER TABLE 表名称 ADD CONSTRAINT 外键别名 FOREIGN KEY (外键列名称) REFERENCES 其他表名称(其他表主键) ON UPDATE CASCADE ON DELETE CASCADE;
唯一约束:表中某一列不能出现重复的值。
1.名称:UNIQUE
2.效果:不能添加重复的数据,NULL只能有一个.(“手机号码”,“身份证”,“邮箱”)
3.三种操作的方式
a. 创建表的时候,添加唯一约束
CREATE TABLE 表名称 (列名1 数据类型1,列名2 数据类型2 UNIQUE);
b. 表创建完毕之后,再添加唯一约束【条件:不能有重复的】
ALTER TABLE 表名称 MODIFY 列名称 数据类型 UNIQUE;
c. 删除唯一约束
ALTER TABLE 表名称 DROP INDEX 列名称;
多表关系
范式
设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
1.第一范式(1NF) 每一项都是不可以分割的原子数据.不能存在合并项
2.第二范式(2NF) 抽取了核心直接依赖关系,其他间接关系放在一边
3.第三范式(3NF) 再次抽取间接表当中的依赖关系.
4.巴斯-科德范式(BCNF)
5.第四范式(4NF)
6.第五范式(5NF) 完美范式
管理用户
创建用户:
语法: CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; -- 主机名 本机 localhost 任意主机 %
删除用户:
语法: DROP USER '用户名'@'主机名';
修改用户密码:
语法1: UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';
语法2: SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
查询用户:
语法: USE mysql; SELECT * FROM user; -- 先要使用mysql自己的数据库,然后查询user表
忘记了超级管理员用户密码之后的解决方案
1. cmd 输入 net stop mysql -- 停止mysql服务 需要管理员运行该cmd
2. 使用无验证方式启动mysql服务: mysqld --skip-grant-tables
3. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
4. use mysql;
5. update user set password = password('你的新密码') where 6ser = 'root';
7. 关闭两个窗口
8. 打开任务管理器,手动结束mysqld.exe 的进程
9. 启动mysql服务
10. 使用新密码登录。
权限管理:
查询权限:
语法: SHOW GRANTS FOR '用户名'@'主机名';
授予权限:
语法: GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名'; -- 标准格式
语法: GRANT ALL ON *.* TO 'zhangsan'@'localhost'; -- 给张三本机用户授予所有的权限
撤销权限:
语法: REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
案例: REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%'; -- 撤销李四在所有机器上面的 UPDATE 权限
事务
事务的基本介绍
概念:
操作:
查看和修改事务的提交方式:
1.查看事务的提交方式
SELECT @@autocommit;
2.修改事务的提交方式
SET @@autocommit = 0; -- 0表示手动提交,1表示自动提交
MySQL数据库中事务默认自动提交
事务的四大特征:
事务的隔离级别(了解)
概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
存在问题:
隔离级别:
设置和查看隔离级别
数据库的备份和还原
命令行:
备份
mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
还原:
登录数据库
创建数据库
使用数据库
执行文件.source 文件路径
source d:/文件.sql;
SQLyog快捷键
Ctrl+M 创建一个新的连接
Ctrl+N 使用当前设置新建连接
Ctrl+F4 断开当前连接
对象浏览器
F5 刷新对象浏览器(默认)
Ctrl+B 设置焦点于对象浏览器
SQL 窗口
Ctrl+T 新建查询编辑器
Ctrl+E 设置焦点于 SQL 窗口
Ctrl+Y 重做
Ctrl+Z 撤销
Ctrl+X 剪切
Ctrl+V 粘贴
Ctrl+H 替换
Ctrl+G 转到
Ctrl+O 在 SQL 窗口打开一个 SQL 文档
Ctrl+Shift+U 使选择内容大写
Ctrl+Shift+L 使选择内容小写
Ctrl+Shift+C 注释 SQL 窗口选择内容
Ctrl+Shift+R 从选择内容删除注释
Ctrl+Shift+T 插入模板
Ctrl+Enter 列出所有的标签
Ctrl+Space 列出匹配的标签
Ctrl+Shift+C 注释
执行查询
F8 执行当前查询并编辑结果集
F9 执行当前查询(默认)
Ctrl+F9 执行选定查询(默认)
Shift+F9 执行全部查询(默认)
粘贴 SQL 语句
Alt+Shift+I 插入语句
Alt+Shift+U 更新语句
Alt+Shift+D 删除语句
Alt+Shift+S 选择语句
结果
F11 插入更新对话框
Ctrl+R 设置焦点于结果面板中的活动标签
Ctrl+L 切换结果窗口/表数据以表格/文本方式显示
Ctrl+Alt+C 以 CSV, SQL, Excel 等导出表数据
Ctrl+Alt+E 以 SQL 转储文件备份数据
Ctrl+Shift+M 从 CSV 导入数据
Ctrl+Shift+E 导出结果集
Alt+1…n 在结果窗口中选择第n个标签
显示/隐藏
Ctrl+1 显示/隐藏 对象浏览器
Ctrl+2 显示/隐藏 结果面板
Ctrl+3 显示/隐藏 查询窗口
数据库/数据表
Ctrl+D 创建数据库
F6 更改 数据库/数据表的结构/索引/视图/存储过程/函数/触发器/事件
F2 重命名 数据表/视图/触发器/事件
Shift+Del 截断 数据库/数据表
F7 管理索引窗口
F10 关联/外键
Ctrl+Alt+R 重新排序字段
Ctrl+Alt+T 数据表诊断
Ctrl+Alt+F 刷新对话框
Ctrl+Shift+Alt+S 以 HTML 格式创建数据库架构
Ctrl+Shift+Q 从 SQL 转储文件恢复数据库
增强工具
Ctrl+W 数据库同步向导
Ctrl+Q 架构同步工具
Ctrl+Alt+O 数据迁移工具包
Ctrl+Alt+N 通知服务向导
Ctrl+Alt+S 计划备份
Ctrl+K 查询创建器
Ctrl+Alt+D 架构设计器
用户管理
Ctrl+U 添加用户
Ctrl+Alt+U 编辑用户
Ctrl+Shift+W 管理用户权限
个人文件夹
Ctrl+Shift+F 添加当前 SQL 语句到个人文件夹
其它
F1 帮助
F12 快捷键窗口
Ctrl+C 复制
Ctrl+A 全选
Ctrl+F/F3 查找 (SQL 窗口/以文本方式显示的结果窗口和表数据)
Ctrl+S 保存
Ctrl+PgUp 切换到上一标签
Ctrl+PgDown 切换到下一标签
DEL 删除选定
Alt+L 关闭标签
Alt+F4 退出程序