MySQL:(二)
多表查询-笛卡尔积
对于数据库中 针对于两张表的记录数的所有记录进行匹配,获得笛卡尔积!⚠️笛卡尔积结果是无效的,必须从笛卡尔积中选取有效的数据结果 !!!
-- 显示结果就是笛卡尔积,两个表记录乘积
select * from emp,dept;
内链接概念
- 一般有效的数据 通常采用内链接的方式获取有效数据
select * from emp e,dept d where e.deptno = d.deptno;
- 针对于内链接的语法,一般可以使用表别名进行查询 也可以通过 join on 关键字进行链接
-- join 用来链接两张表,on 后添加两张表需要链接的条件
select * from emp join dept on emp.deptno = dept.deptno;
子查询
- 子查询是嵌套在一个select语句中的另一个select语句。当需要从一个表中检索信息,检索条件值又是来自该表本身的内部数据时,子查询非常有用;
- 子查询可以嵌入以下SQL子句中:where子句、having子句和from子句;
单行子查询
内部select语句只返回一行结果的查询(单列)。
- 主查询的where子句使用单行子查询返回结果要采用单行比较运算符(=、>、>=、<、<=、<>)
-- 查询工资比编号为7566雇员工资高的雇员姓名。
select ename
from emp
where sal>
(select sal
from emp
where empno=7566)
order by ename; -- 显示和雇员scott同部门的雇员姓名、工资和部门编号。
select ename,sal,deptno
from emp
where deptno=
(select deptno
from emp
where ename='SCOTT'); -- 显示和雇员SCOTT从事相同工作,并且工资大于JAMES的雇员姓名、工作和工资
select ename,job,sal
from emp
where job=
(select job from emp where ename='SCOTT')
and sal>
(select sal from emp where ename='JAMES');- 子查询要用括号括起来;
- 将子查询放在比较运算符的右边;
- 不要在子查询中使用order by子句,select语句中只能有一个order by子句,并且它只能是主select语句的最后一个子句。
单行子查询中使用组函数
-- 显示工资最低的雇员姓名、工作和工资。
select ename,job,sal
from emp
where sal=(select min(sal) from emp);
having子句中使用单行子查询
-- 显示部门内最低工资比20部门最低工资要高的部门的编号及部门内最低工资。
-- 1、按部门显示部门编号、部门最低工资
select deptno as 部门编号,
min(sal) as 最低工资
from emp
group by deptno; -- 2、查询20部门最低工资
select min(sal) from emp where deptno=20; -- 3、使用having子句把2作为1的子查询
select deptno as 部门编号,
min(sal) as 最低工资
from emp
group by deptno
having min(sal)>(select min(sal)
from emp
where deptno=20);
问题思考:
- 当单行子查询返回的结果为null时,主查询是否正确?
-- 查询和SMITH从事相同工作的雇员姓名和工作,如果SMITH误拼写成SMITHS则返回结果为null
select ename,job
from emp
where job=(select job
from emp
where ename='SMITHS'); - 子查询中使用group by子句,主查询中是否可以使用单行比较符?
-- 下面的SQL语句能正确执行吗?
select ename,job
from emp
where sal=(select min(sal)
from emp
group by deptno);ORA-01427: 单行子查询返回多个行
from子句中使用子查询
在from子句中使用子查询时,必须给子查询指定别名。
-- 显示工资高于部门平均工资的雇员姓名、工作、工资和部门号select ename,job,sal,emp.deptno
from emp, (select deptno,avg(sal) avgsal
from emp
group by deptno)s
where emp.deptno=s.deptno and sal>s.avgsal;
多表设计
E-R 图的设计说明:
结论: 必须创建第三张关系表,在关系表中引用两个实体主键作为外键。
建表原则:创建的第三方关系表,将每张表的主键作为第三章表的联合主键。
多对多关系
案例演示说明: 老师和学员
图解:
表设计:
-- 多对多 老师 和学员
create table if not exists student(
id int primary key auto_increment,
name varchar(20)
);
create table if not exists teacher(
id int primary key auto_increment,
name varchar(20)
); -- 第三张 表
create table if not exists student_teacher(
sid int,
tid int,
constraint student_teacher_student_fk foreign key (sid) references student(id),
constraint student_teacher_teacher_fk foreign key (tid) references teacher(id),
primary key(sid,tid)
); -- 苍老师 李四 张三 题目 苍老师有几个学员 显示学员信息
insert into student values(null,'李四');
insert into student values(null,'张三');
insert into student values(null,'王五');
insert into student values(null,'赵六');
insert into teacher values(null,'苍老师');
insert into teacher values(null,'文老师');
insert into teacher values(null,'陈老师'); select * from student;
select * from teacher; -- 维护关系 苍老师有两个学员
insert into student_teacher values(1,1);
insert into student_teacher values(2,1);
insert into student_teacher values(3,1); -- 题目 显示苍老师的所有学员信息
select s.*
from student s,teacher t,student_teacher st
where st.sid=s.id and st.tid=t.id and t.name='苍老师';
一对多关系
案例说明:员工和部门
-- emp 设计
drop table if exists emp;
create table if not exists emp(
empno int primary key auto_increment,
ename varchar(10) not null,
job varchar(20),
salary double(8,2),
mgr int(10),
bonus double(6,2),
hiredate date,
deptno int,
-- 添加外键约束 constraint 约束 pk primary key fk foreigin key references 参照
constraint emp_dept_fk foreign key(deptno) references dept(deptno)
);
-- 新建dept表
drop table if exists dept;
create table if not exists dept(
deptno int primary key,
dname varchar(30),
dlocation varchar(255)
); select * from emp;
select * from dept;
desc emp;
show tables;
-- 外键约束 两张表产生关联 2种方式 1: 建表语句条件外键约束(常用) -- 2: 表已经建好 添加外键约束 删除外键约束
alter table emp drop foreign key emp_dept_fk;
alter table emp add constraint emp_dept_fk foreign key (deptno) references dept(deptno);
--
delete from emp;
delete from dept where deptno=10; -- 一对多的删除 问题
-- 1: 部门删除 员工全部干掉 cascade 级联 删除 部门删除 该部门所有的员工全部自动删除
alter table emp drop foreign key emp_dept_fk;
alter table emp add constraint emp_dept_fk foreign key (deptno) references dept(deptno) on delete cascade; -- 2: 部门删除 员工留 更换部门号 部门删除 员工保留 但是员工deptno --->null
alter table emp drop foreign key emp_dept_fk;
alter table emp add constraint emp_dept_fk foreign key (deptno) references dept(deptno) on delete set null;
delete from dept where deptno=20;
建表原则:不需要创建第三方关系表,只需要在多方添加 一方主键作为 外键;
一对一关系
这种关系很少见到 负责人和工作室 夫妻关系
一个负责人 管理一个工作室
一个工作室 只有一个负责人
建表规则:在任一方添加对方主键 作为外键
-- 1:1 夫妻 一夫一妻
create table husband(
id int primary key auto_increment,
name varchar(20)
);
create table wife(
id int primary key auto_increment,
name varchar(20),
h_id int,
constraint husband_wife_fk foreign key(h_id) references husband(id)
); insert into husband values(null,'a');
insert into husband values(null,'b');
insert into wife values(null,'A',1); -- 查找出A的老公是谁?
select h.*
from husband h , wife w
where h.id=w.h_id and w.name='A';
用户管理
创建用户
-- 语法:CREATE USER 用户名[@地址] IDENTIFIED BY '密码'; -- 示例:创建一个名叫user1,密码是123的用户
-- 创建本地用户:
CREATE USER user1@localhost IDENTIFIED BY ''; -- 创建本地和远程用户
CREATE USER user1@'%' IDENTIFIED BY '';
删除用户
-- 语法:drop USER 用户名; -- 示例:删除用户user1
drop USER user1;
修改用户密码
-- 语法:UPDATE USER SET PASSWORD=PASSWORD('密码') WHERE USER='用户名';
-- FLUSH PRIVILEGES; -- 示例:
UPDATE USER SET PASSWORD=PASSWORD('') WHERE USER='user1';
FLUSH PRIVILEGES;
用户授权
- 授权
-- 语法:Grant 权限1,权限2…… on 数据库名.表名 to 用户名@IP; -- 示例:
GRANT SELECT,INSERT,UPDATE ON mydb1.* TO 'user1'@'localhost';
GRANT ALL ON mydb1.* TO 'user1'@'localhost'; - 取消授权
-- 语法:REVOKE 权限1,权限2…… on 数据库名.表名 from 用户名@IP; -- 示例:
REVOKE SELECT,INSERT,UPDATE ON mydb1.* FROM 'user1'@'localhost';
案例练习
链接: https://pan.baidu.com/s/1miaJuQ0 密码: xeb4
MySQL:(二)的更多相关文章
- 转载:Centos7 从零编译Nginx+PHP+MySql 二
序言 这次玩次狠得.除了编译器使用yum安装,其他全部手动编译.哼~ 看似就Nginx.PHP.MySql三个东东,但是它们太尼玛依赖别人了. 没办法,想用它们就得老老实实给它们提供想要的东西. 首先 ...
- python Mysql (二)
Mysql (二) 一. 事务 a.数据库开启事务命令 1 2 3 4 #start transaction 开启事务 #Rollback 回滚事务,即撤销指定的sql语句(只能回退insert de ...
- MySQL二进预编译制安装
+++++++++++++++++++++++++++++++++++++++++++标题:MySQL二进预编译制安装时间:2019年2月25日内容:MySQL二进制预编译安装重点:MySQL二进制预 ...
- MYSQL(二)
上一篇文章讲的是mysql的基本操作,这一篇会有一点难以理解,本节主要内容mysql视图,存储过程,函数,事务,触发器,以及动态执行sql 视图view 视图是一个虚拟表,其内容由查询定义.同真实的表 ...
- MySQL(二) 数据库数据类型详解
序言 今天去健身了,感觉把身体练好还是不错的,闲话不多说,把这个数据库所遇到的数据类型今天统统在这里讲清楚了,以后在看到什么数据类型,咱度应该认识,对我来说,最不熟悉的应该就是时间类型这块了.但是通过 ...
- Linux Ubuntu从零开始部署web环境及项目 -----tomcat+jdk+mysql (二)
上一篇介绍如何在linux系统下搭建ssh环境 这篇开始将如何搭建web服务器 1,下载文件 在官网下载好 tomcat.jdk.mysql的linux压缩包 后缀名为.tar.gz 并通过xftp上 ...
- Mysql(二):库操作
一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...
- Mysql(二)函数与连接
一.函数 1.if函数 if(exp1, exp2, exp3) 判断exp1是否为true(不为0,并且不为nlll),如果为true,返回 exp2的值,否则返回exp3的值. selec ...
- mysql二:库操作
一.系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等 performance_schema: My ...
- 【千纸诗书】—— PHP/MySQL二手书网站后台开发之知识点记录
前言:使用PHP和MySQL开发后台管理系统的过程中,发现有一些通用的[套路小Tip],这里集中记录一下.结合工作中ing的后台业务,我逐渐体会到:除了技术知识外.能使用户体验好的“使用流程设计”积累 ...
随机推荐
- C#基础加强(7)之ref与out
介绍 给方法传递普通参数时,值类型传递的是拷贝的对象,而引用类型传递的是对象的引用.它们都不能在函数内部直接修改外部变量的引用(不是修改引用类型的属性),而使用 ref 或 out 关键字就可以实现. ...
- XMPP技术之Smack库的自定义消息扩展
写此文是为了纪念我耗时两天的Smack库应用开发. 太苦恼了,网上找了一堆材料,关于XMPP的消息扩展方面的资料感觉都是出于同一个源头,基本问题还是基于的库版本都是低于4.1版本的讲解. 我是在Sma ...
- Python学习笔记(Ⅰ)——Python程序结构与基础语法
作为微软的粉丝,最后终于向Python低头了,拖了两三个月终于下定决心学习Python了.不过由于之前受到C/C#等语言影响的思维定式,前期有些东西理解起来还是很费了些功夫的. 零.先抄书: 1.Py ...
- Mysql千万级大数据量查询优化
来源于:https://blog.csdn.net/A350204530/article/details/79040277 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 ord ...
- redis 通用函数
redis 通用函数 construct 命令/方法/函数 Description Creates a Redis client 创建一个Redis客户端 Example $redis = new R ...
- Appium+Python3+iOS真机环境搭建
Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用. 本次环境配置相关:macOS:10.13.4Appium-desktop:1. ...
- Gem install Mysql2的问题
运行 ‘bundle install’ 或者 ‘gem install mysql2′ 遇到如下错误 > gem install mysql2 ERROR: Error installing m ...
- Hadoop 安全模式safemode
启动Hdfs 系统的时候,其中的一个阶段“”安全模式 发生阶段:NameNode启动中,已经读取了fsimage 并且生成了edits 文件,在等待dataNode 向nameNode 发送block ...
- idea的mybatis的mysql语句的小数转换百分号
其实mysql的小数转换百分数有两种函数ROUND和TRUNCATE 例子: 1.round(x,d) :用于数据的四舍五入,round(x) ,其实就是round(x,0),也就是默认d为0: 这 ...
- 基于Zookeeper实现多进程分布式锁
一.zookeeper简介及基本操作 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化.当对目录节点监控状态打开时,一旦目录节点的状态发生变化,Watc ...