范式:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求
有两个集合A,B,取这两个集合的所有组成情况。
要完成多表查询,需要消除无用的数据
使用where条件消除无用数据
SELECT
t1.name, -- 员工表的姓名
t1.gender,-- 员工表的性别
t2.name -- 部门表的名称
FROM
emp t1,
dept t2
WHERE
t1.dept_id = t2.id;
-- 语法
select 字段列表 from 表名1 [inner] join 表名2 on 条件;
-- 例如
SELECT * FROM emp INNER JOIN dept ON emp.dept_id = dept.id;
SELECT * FROM emp JOIN dept ON emp.dept_id = dept.id;
从哪些表中查询数据?
条件是什么?
查询哪些字段?
select 字段列表 from 表1 left [outer] join 表2 on 条件;
查询的是左表所有数据以及其交集部分
select 字段列表 from 表1 right [outer] join 表2 on 条件;
查询的是右表所有数据以及其交集部分
根据结果分类
子查询可以作为条件,使用运算符判断
select * from stu where age < (select avg(age) from stu);
子查询可以作为条件,使用in
来判断
select * from stu where id in (select id from class where name = '一班' or name = '二班');
not in
select *
from dept t1,(select *
from emp
where emp.date > '2021-11-11') t2
where
t1.id = t2.dept_id;
select *
from emp t1,dept t2
where t1.dept_id = t2.id and t1.date > '2021-11-11'
SELECT
t1.ename,
t2.ename
FROM emp t1
LEFT JOIN emp t2
on t1.mgr = t2.id;
如果一个包含多个步骤的业务操作,被事务管理,要么同时成功,要么同时失败
开始事务:start transaction;
回滚:rollback;
提交:commit;
Oracle默认手动提交
一条DML(增删改)语句会自动提交一次事务
修改事务的默认提交方式:
-- 查询
select @@autocommit; -- 自动:1;手动:0
-- 修改
select @@autocommit = 0;
多个事务之间相互独立,但是多个事务操作同一批数据,会引发问题,设置不同的隔离级别可以解决这些问题
read uncommitted
:读未提交 -->脏读、虚读、幻读read committed
:读已提交(Oracle默认)–> 虚读、幻读repeatable read
:可重复读(MySQL默认)–> 幻读serializable
:串行化 --> 没问题隔离级别从小到大安全性越来越高,但是效率越来越低
-- 隔离级别的查询和设置
-- 查询
select @@tx_isolation;
-- 设置
set global transaction isolation level 级别字符串;
DBA:数据库管理员
use mysql;
create user '用户名'@'主机名' identified by '密码';
use mysql;
drop user '用户名'@'主机名';
update user set password = password('新密码') where user = '用户名';
set password for '用户名'@'主机名' = password('新密码');
cmd -> net stop mysql
(需要管理员运行)
使用无验证方式启动mysqlmysqld --skip-grant-tables
修改密码
关闭mysqld服务
-- 1.切换到mysql数据库
use mysql;
-- 2.查询user表
select * from user;
通配符%
:可以在任意主机上登陆
show grants for '用户名'@'主机名';
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
grant all on *.* to 'wmh'@'%'; -- 授予root权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';