MySQL-2【DCL、约束、多表查询】

DCL语句

创建用户

create user '用户名'@'主机名'identified by 'mima';

主机名:如果是本地用户可以用localhost
	   如果想任意远程登陆主机,可用通配符 %

授权用户

格式:grant 权限1,权限2... on 数据库名.表名 to '用户名'@'主机名'
*.*  表示是任意数据库和表的相关操作权限

撤销权限、查看权限、删除权限、修改密码

撤销权限:
REVOKE 权限1, 权限2... ON 数据库.表名 FROM '用户名'@'主机名';
查看权限:
SHOW GRANTS FOR '用户名'@'主机名';
删除权限:
DROP USER '用户名'@'主机名';
修改密码:
管理员:
mysqladmin -uroot -p password 新密码 -- 新密码不需要加上引号
普通用户:
set password for '用户名'@'主机名' = password('新密码');
数据库备份还原

备份应用场景



source命令备份还原

备份格式: mysqldump -u用户名 -p密码 数据库 > 文件的路径
还原格式: SOURCE 导入文件的路径;
数据库约束

约束:

是一种限制,用于修饰表中的列,可以保证数据的正确性,有效性,完整性

主键约束
-- 1、主键的特点:唯一不重复;不能包含null;一个列表只有一个主键,但可以有多个字段【联合主键】
创建方式1create table 表名(
	字段名1 类型 primary key,
    字段名2 类型 primary key
);
创建方式2create table 表名(
	字段名1 类型,
    字段名2 类型,
    primary key (字段名1)
);

方式3:给已有表中添加主键
alter table 表明 primary key(字段名)

删除主键: alter table 表名 drop primary key;

主键自增: ... primary key auto_increment
DELETE删除表中的数据,不重置AUTO_INCREMENT的值
TRUNCATE摧毁表,重建表,AUTO_INCREMENT重置为1
如果想自定义id的值,可以使用下面的sql进行设置,一般不需要
ALTER TABLE 表名 AUTO_INCREMENT=起始值;
外键约束
外键:一张表中的字段引用另一张表的主键
创建外键:
创建表时添加外键: constraint foreign key (外键字段) references 主表名(主键字段名)
有表时添加外键:alter table 从表 add constraint foreign key (外键名) references 主表名(主表字段)
删除外键:alter table drop foreign key 外键名;

/*
注意事项:
	添加数据时,外键的值要参考主键
	删除数据时,要先删除从表中的数据,再删除主表数据
*/
唯一约束
关键字: unique
-- 创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生
CREATE TABLE st7 (
id INT,
name VARCHAR(20) UNIQUE
);
非空约束
关键字:not null
-- 创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL
CREATE TABLE st8 (
id INT,
NAME VARCHAR(20) NOT NULL,
gender CHAR(2)
);
默认值
关键字:default
-- 创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州
CREATE TABLE st9 (
id INT,
NAME VARCHAR(20),
address VARCHAR(50) DEFAULT '广州'
);
多表关系
一对多
用户与订单就是一个典型的一对多    一的一方是用户   多的一方是订单    一个用户可以有多个订单
多对多
-- 可以使用一对多与多对一来描述多对多
举例  学生与老师是多对多   一般使用中间表来描述关系,中间表一般使用联合主键

一对一
可以使用一对多来描述一对一,只要限制多为unique
可以有两种描述方式:
		1.使用任意一方的主键来约束
		2.把 一对一当成一对多,对外键进行unique
数据库范式
范式概念及分类
第一范式  -- 每一列不能在拆分

第二范式  -- 在第一范式基础上 一个表只做一件事	

第三范式  -- 在第二范式基础上  从表的外键必须使用主表的主键

反三范式相对于三范式的,没有冗余的数据库未必是最好的数据库,有时为了提高数据库的运行效率,

就必须降低范式标准,适当保留冗余数据

多表查询
笛卡儿积
在多表连接查询时,会产生迪卡尔积,其中有很多数据时我们用不到的无意义的数据,在实际开发中,我们必须消除迪卡尔积,得到真正有用的数据。
内连接
-- 显示内连接    inner join on    格式    select  *  from 表1 inner join 表2  on  条件 
-- 隐式内连接    格式  select * from 表1 ,  表2   where 条件 
显示内连接是使用on来过滤,消除迪卡尔积     隐式内连接是使用where条件来过滤

外连接
应用场景:当关联表中某一个表的字段没有对应数据时,要想显示这个信息,必须使用外连接。

-- 外连接分类
  - 左外连接    left join on
  - 右外连接   right join on
- 格式
  - select * from 表1 leftrightjoin2  on 条件

子查询
子查询分类
- 单行单列子查询  就是一个值  就可以使用比较运算符操作  >  < =...
- 多行单列子查询  就是多个值   我们可以使用  in  all  any
- 多行多列子查询   可以把查询的结果当成一张表

单行单列

如:select * from 表名 where 字段 > (select 查询字段 from 表名 where 查询条件);

多行单列

select * from 表名 where 字段 > any (select 查询字段 from 表名 where 查询条件);

多行多列

-- 查询出2011年以后入职的员工信息,包括部门名称
select * from dept d right join (select * from emp where join_date > '2011-1-1')
e on d.id = e.dept_id;

-- 嵌套表查询
练习:
-- 部门表
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.00',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-19','30000.00',NULL,20),
(1009,'罗贯中',1,NULL,'2001-11-17','50000.00',NULL,10),
(1010,'吴用',3,1006,'2001-09-08','15000.00','0.00',30),
(1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20),
(1012,'李逵',4,1006,'2001-12-03','9500.00',NULL,30),
(1013,'小白龙',4,1004,'2001-12-03','30000.00',NULL,20),
(1014,'关羽',4,1007,'2002-01-23','13000.00',NULL,10);
-- 工资等级表
CREATE TABLE salarygrade (
grade INT PRIMARY KEY,
losalary INT,
hisalary INT
);
-- 添加5个工资等级
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);
-- 查询所有员工信息。显示员工编号,员工姓名,工资,职务名称,职务描述
select 
	emp.id,emp.idename,emp.salary,job.jname,job.description
from
	emp , job
where
	emp.job_id = job.id;
-- 查询所有员工信息。显示员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
select 
	emp.idename, emp.salary,job.jname, job.description, dept.dname,dept.loc,emp.id
from
	emp  , job , dept 
where
	emp.job_id=job.id	and	emp.dept_id = dept.id;
-- 查询所有员工信息。显示员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
select 
	emp.idename,emp.salary,job.jname,job.description,dept.dname,dept.loc,salarygrade.grade
from
	emp,job,dept,salarygrade
where
	emp.job_id=job.id and emp.dept_id = dept.id and emp.salary between salarygrade.losalary and hisalary;
-- 查询经理的信息。显示员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
select 
	emp.idename,
	emp.salary,
	job.jname,
	job.description,
	dept.dname,
	dept.loc,
	salarygrade.grade
from
	emp,job,dept,salarygrade
where
			emp.job_id=job.id 
	and emp.dept_id = dept.id 
	and emp.salary 
	between 
		salarygrade.losalary 
		and hisalary
	and job.jname='经理';
-- 查询出部门编号、部门名称、部门位置、部门人数
-- 方式1
select
	d.id,d.dname,d.loc,a.deptnum
from
	dept d,(select count(*) deptnum,e.dept_id from emp e group by dept_id) a
where
	d.id=a.dept_id;
-- 方式2
select
	emp.dept_id,dept.dname,dept.loc,count(emp.dept_id)
from
	emp,dept
where
	emp.dept_id=dept.id
group by 
	emp.dept_id;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值