文章目录

  • 1 数据库的概述
  • 1.1 什么是数据?
  • 1.2 什么是数据库?
  • 1.3 为什么开发的时候数据要存储到数据库中?
  • 2 常见的数据库
  • 2.1 oracle
  • 2.2 SQL Server
  • 2.3 DB2
  • 2.4 mysql数据库
  • 3 sql的概述
  • 3.1 什么是sql?
  • 3.2 优点
  • 3.3 sql的分类
  • 4 数据库基本命令及常用数据类型
  • 4.1 基本命令
  • 4.2 常用数据类型
  • 5 DDL:数据定义语言
  • 5.1 操作数据库
  • 5.1.1 创建create
  • 5.1.2 删除drop
  • 5.1.3 修改alter
  • 5.1.4 查看show select
  • 5.1.5 切换 use
  • 5.2 操作表和列
  • 5.2.1 创建 create
  • 5.2.2 删除 drop
  • 5.2.3 修改 alter
  • 5.2.4 查看 show
  • 6 DML:数据操作语言
  • 6.1 插入操作 insert
  • 6.2 修改操作 update
  • 6.3 删除操作 delete
  • 7 DQL:数据查询语言(基本的简单查询)SELECT
  • 7.1 基本语法
  • 7.2 基础查询
  • 7.3 条件查询
  • 7.4 模糊查询
  • 7.5 字段控制查询(控制字段的显示结果)
  • 7.6 排序
  • 7.7 常用的聚合函数
  • 7.8 分组查询
  • 7.9 having子句
  • 7.10 limit 方言
  • 7.11 基本查询sql的书写顺序和执行顺序
  • 8 多表查询
  • 8.1 分类
  • 8.2 合并结果集
  • 8.3 连接查询
  • 8.3.1 内连接 [inner] join on
  • 8.3.2 外连接 outer join on
  • 8.3.3 自然链接 natural join
  • 8.4 子查询(嵌套查询)
  • 8.4.1 概述
  • 8.4.2 子查询出现的位置
  • 8.4.3 当子查询出现在where后用作条件时,可以使用一些关键字
  • 8.4.4 子查询的结果集形式:
  • 8.4.5 自链接
  • 9 DCL:数据控制语言
  • 9.1 创建用户
  • 9.2 给用户授权
  • 9.3 撤销权限
  • 9.4 查看用户权限
  • 9.5 删除用户
  • 9.6 修改用户密码


1 数据库的概述

1.1 什么是数据?

数据就是对客观数据的抽象表示
在计算机科学中所有能输入到计算机中并能被计算机处理的符号都是数据

1.2 什么是数据库?

可以理解是存放数据的仓库

  • 数据库(DataBase 简称 DB,文件系统)
    指的是长期保存在计算机的存储设备上,按照一定规律组织起来的可以被各种应用或用户访问的数据的集合。
  • 数据库管理系统(DataBase Management System,简称DBMS,软件部分)
    是一个操作和管理数据库的软件,用来建立,使用和维护数据库。对数据库进行统一的管理和控制,保证数据的安全性和完整性。
  • 简单解释:存储,维护和管理数据的集合。

1.3 为什么开发的时候数据要存储到数据库中?

  • 在软件开发的过程中,必须要保证数据是正确的,准确的;并且方便各种操作(增删改查)。
  • 数据在数据库中是存在数据表中的。表和表之间还可以建立关系。还可以给表添加约束。
  • 数据库中存储数据的时候是用数据表。一个数据库中可以有多个数据表。

2 常见的数据库

2.1 oracle

是oracle公司的产品,关系型数据库。
主要用在大型企业数据库领域

2.2 SQL Server

是由微软开发的数据库管理系统

2.3 DB2

是ibm公司的数据库产品。

2.4 mysql数据库

被广泛用于中小型企业
特点:
	体积小,速度快,功能全,开放源代码
	08年被sun收了,09年sun又被oracle收了。(6.0之前是免费的)

3 sql的概述

3.1 什么是sql?

  • 结构化查询语言(Structured Query Language),简称SQL
  • 用于存取数据以及查询、更新和管理关系数据库系统
    sql早期是被美国国家标准局定义成了关系型数据库语言的美国标准。
    后来又被国际化标准组织定义成了关系型数据库语言的国际标准。
  • 各个数据库厂商都支持这个sql标准—普通话
  • 各个数据库厂商又都在这个标准的基础上做了一些自己的扩展—方言

3.2 优点

  • 不再是某个数据库厂商特有的语言,几乎所有的数据库管理系统都支持sql
  • 简单易学,sql语句都是由一些描述性很强的单词组成的,单词数量还不多。
  • 非过程化,就是我们用sql语言来操作数据库的时候,只需要告诉它要干什么。不需要告诉它应该怎么干。
    存储路径的选择和操作的执行完全由dbms自动完成。

3.3 sql的分类

  1. DDL
    数据定义语言Data Definition Language
    定义数据库对象的 库,表,列
    常用的关键字:create alter drop
  2. DML
    数据操作语言Data Manipulation Language
    用来操作数据库中表中的数据(增删改操作)
    常用关键字:insert update delete
  3. DQL
    数据查询语言Data Query Language
    用来查询数据
    常用关键字:select { where having order by limint…}
  4. DCL
    数据控制语言Data Control Language
    用来定义访问权限和安全级别
    常用关键字: GRANT 和 REVOKE
  • 注意事项:sql语句要以分号结尾;

4 数据库基本命令及常用数据类型

4.1 基本命令

启动服务命令 net start mysql
停止服务命令 net stop mysql
登录mysql命令
  mysql -u root -p 回车之后在输入密码
  mysql -h ip地址 -u root -p 回车之后在输入密码
  
  mysql -h localhost -u root -p回车之后在输入密码
  mysql -h 127.0.0.1 -u root -p回车之后在输入密码
退出命令 quit / exit
  quit只能退出mysql

4.2 常用数据类型

  • int 整型
  • double 浮点型 double(6,2) 表示最多6位数,其中必须有2位小数 最大值 9999.99
  • char 固定长度字符串 char(10) 'abc ’
  • varchar 可变长度字符串 varchar(10) ‘abc’
  • text 字符串
  • blob 字节类型
  • date 日期类型 格式:yyyy-MM-dd 2020-12-12
  • time 时间类型 格式:hh:mm:ss
  • DATETIME 日期时间类型 格式:yyyy-MM-dd hh:mm:ss
  • TIMESTAMP 时间戳 格式:yyyy-MM-dd hh:mm:ss

5 DDL:数据定义语言

5.1 操作数据库

5.1.1 创建create

  • 创建数据库
    create database 数据库名;
CREATE DATABASE mydb;
  • 创建带指定字符集的数据库
    create database 数据库名 character set 对应的字符集;
CREATE DATABASE mydb2 CHARACTER SET GBK;

5.1.2 删除drop

  • 删除数据库
    DROP DATABASE 数据库名;
DROP DATABASE mydb2;

5.1.3 修改alter

  • 修改数据库对应字符集
    AlTER DATABASE 数据库名 character set 对应的字符集;
AlTER DATABASE mydb CHARACTER SET utf8;

5.1.4 查看show select

  • 查看当前数据库服务器中的所有数据库
    SHOW DATABASES;
SHOW DATABASES;
  • 查看数据库定义信息
    SHOW CREATE DATABASE 数据库名;
SHOW CREATE DATABASE mydb;
  • 查看当前使用的数据库
    SELECT DATABASE();
SELECT DATABASE();

5.1.5 切换 use

  • 切换要使用的数据库
    USE 数据库名;
USE mydb;

5.2 操作表和列

5.2.1 创建 create

  • 创建表和列
    create table 表名(
      字段1 数据类型,
      字段2 数据类型,
      字段3 数据类型
    )
CREATE TABLE stu_info(
	num INT,
	NAME VARCHAR(10),
	age INT,
	gender VARCHAR(5)
);

注意:最后一个字段不要逗号

5.2.2 删除 drop

  • 删除表
    DROP TABLE 表名;
DROP TABLE student;
  • 删除列
    ALTER TABLE 表名 DROP 列名;
ALTER TABLE stu_info DROP age;

5.2.3 修改 alter

  • 修改表名
    RENAME TABLE 原表名 TO 新表名;
RENAME TABLE stu2 TO student;
  • 修改表的字符集
    ALTER TABLE 表名 CHARACTER SET 对应的字符集;
ALTER TABLE student CHARACTER SET gbk;
  • 在表中添加列
    alter table 表名 add 列名 数据类型;
ALTER TABLE student ADD bir TIMESTAMP;
  • 修改列名
    ALTER TABLE 表名 CHANGE 原列名 新列名 数据类型;
ALTER TABLE student CHANGE bir birthday DATE;

5.2.4 查看 show

  • 查看表的创建细节
    SHOW CREATE TABLE 表名;
SHOW CREATE TABLE student;
  • 查看当前数据库中的所有表
    show tables;
SHOW TABLES;
  • 查看表的字段信息
    desc 表名;
DESC stu_info;

6 DML:数据操作语言

  • DML是对表中数据进行增删改操作的!!!

6.1 插入操作 insert

  • 语法:insert into 表名(列名1,列名2,…) values (值1,值2,…);

注意:
列名和值的类型,个数,顺序要一致并且要一一对应。
类名就相当于是java中的形参,值相当于是实参。
值不能超出列定义的长度。
如果要插入空值 null
插入日期,字符串的时候都要使用单引号把值引起来

INSERT INTO stu_info(num,NAME,birthday,gender)
VALUES(101,'默默','2020-01-01','帅哥');
	
-- 给指定字段插入值
INSERT INTO stu_info(num,NAME)
VALUES(103,'小宝1');

-- 如果需要给表的所有字段都插入值,字段名可以不写
INSERT INTO stu_info
VALUES(104,'小宝3',NULL,'帅哥');
	
-- 批量插入
INSERT INTO stu_info VALUES
(109,'小宝3',NULL,'帅哥'),
(110,'小宝3',NULL,'帅哥'),
(111,'小宝3',NULL,'帅哥');	
		

CREATE TABLE emp (
	id INT,
	NAME VARCHAR(10),
	gender VARCHAR(10),
	birthday DATE,
	joindate DATE,
	salary DOUBLE(8,2),
	bonus DOUBLE(6,2),
	address VARCHAR(50),
	tele VARCHAR(11)
);

INSERT INTO emp VALUES
(1,'宝强','男','1980-05-05','2000-05-05',10000,5000,'河南','123456'),
(2,'宋吉吉','男','1982-05-05','2000-05-05',5000,NULL,'北京','12654654'),
(3,'马蓉','女','1983-05-05','2000-05-05',8888,0,'渭南','987654'),
(4,'冠希','男','1985-01-05','2000-05-05',10000,5000,'香港','123456'),
(5,'霆锋','男','1980-05-05','2000-05-05',10000,5000,'香港','123456'),
(6,'张柏芝','女','1980-05-05','2000-05-05',10000,5000,'香港','123456');

6.2 修改操作 update

  • 语法:update 表名 set 列名1=值1,列名2=值2,… [where 列名=值];

不加where条件语句也不会报错,但是一般不会这样用。

-- 把emp表中所有人的工资改成20000
UPDATE emp SET salary=20000;

-- 把emp表中姓名叫马蓉的工资改成5000
UPDATE emp SET salary=5000 WHERE NAME='马蓉';

-- 把emp表中名叫宋吉吉的人的工资改成10000,电话改成654987
UPDATE emp SET salary=10000,tele=654987 WHERE NAME='宋吉吉';

-- 给冠希的工资在原来的基础上减少5000
UPDATE emp SET salary=salary-5000 WHERE NAME='冠希';

-- 给马蓉的奖金在原来的基础上加500
UPDATE emp SET bonus=bonus+500 WHERE NAME='马蓉';

-- 给宋吉吉的奖金在原来的基础上加500
UPDATE emp SET bonus=bonus+500 WHERE NAME='宋吉吉';
-- null 和 0 有区别,null和任何数据做运算的时候结果都为null
-- 如果非要给它加就需要使用一个函数:虑空函数 ifnull()
-- 给所有人的奖金都+1000
UPDATE emp SET bonus=IFNULL(bonus,0)+1000;
-- if(bonus==null){bonus=0}

6.3 删除操作 delete

  • 语法:delete from 表名 [where 列名=值];
-- 删除emp表中名字叫宋吉吉的人
DELETE FROM emp WHERE NAME='宋吉吉';

-- 删除表中所有数据
DELETE FROM emp;

-- 还可以使用另外一种做法 使用TRUNCATE 删除
TRUNCATE TABLE emp;

区别:
delete 删除表中所有数据,表结构还在,它只是把数据都删了
truncate 删除表中所有数据时,他是直接把表drop了,然后又创建了一个一摸一样的新表
速度比delete快

7 DQL:数据查询语言(基本的简单查询)SELECT

  • DQL操作不会改变数据库中的数据,只是把满足客户要求的数据展示出来。
  • 返回的是一张虚拟的表。
  • select

7.1 基本语法

select 列名 from 表名;[where,group by,order by,limit…]

7.2 基础查询

  • 查询所有列
    可以把所有列名都写上
    使用通配符 * 表示所有
    SELECT * FROM emp;
  • 查询指定列
    select 列名1,列名2,… from 表名;
    SELECT NAME,salary,bonus FROM emp;

7.3 条件查询

  • 就是在查询的时候给出where条件子句,把满足条件的显示出来,不满足条件的不显示。
  • 在where条件子句中我们可以使用一些运算符或者关键字来过滤数据
    = != <> < <= > >=
    between…and…
    in()
    is null
    is not null
    and
    or
    not
-- 我要查询性别是女的人的所有信息
SELECT * FROM emp WHERE gender='女';
-- 我要查询id=2或者姓名叫霆锋的人的信息
SELECT * FROM emp WHERE id=2 OR NAME='霆锋';
-- 我要查询性别是女并且工资大于8000的人的信息
SELECT * FROM emp WHERE gender='女' AND salary>8000;
-- 查询id是(2,3,5)的人的信息
SELECT * FROM emp WHERE id IN(2,3,5); 
SELECT * FROM emp WHERE id=2 OR id=3 OR id=5;
-- 查询id不是(2,3,5)的人的信息
SELECT * FROM emp WHERE id NOT IN(2,3,5); 
SELECT * FROM emp WHERE id!=2 AND id!=3 AND id<>5;
-- 查询奖金是null的人
SELECT * FROM emp WHERE bonus IS NULL;
-- 查询奖金不是null的人
SELECT * FROM emp WHERE bonus IS NOT NULL;
SELECT * FROM emp WHERE NOT bonus IS NULL;
-- 查询出生日期从85年到90年的人
SELECT * FROM emp WHERE birthday BETWEEN '1985-01-01' AND '1990-12-31';
SELECT * FROM emp WHERE birthday>='1985-01-01' AND birthday<='1990-12-31';
-- 查询工资在10000到20000之间的人
SELECT * FROM emp WHERE salary BETWEEN 10000 AND 20000;
SELECT * FROM emp WHERE salary>=10000 AND salary<=20000;
-- 查询性别不是男的人
SELECT * FROM emp WHERE gender !='男';
SELECT * FROM emp WHERE gender <>'男';
SELECT * FROM emp WHERE gender ='女';

7.4 模糊查询

  • 查询条件不明确。比如我要查询姓张的人。这种情况就需要用到模糊查询。
  • 模糊查询需要使用关键字 like
  • 通配符: %表示0到n个任意字符 _:表示一个任意字符
    ‘张%’ ‘张__’ ‘%小%’ ‘%龙’
-- 查询姓名由3个字组成的人
SELECT * FROM emp WHERE NAME LIKE '___';
-- 查询姓名由3个字组成的人,并且中间的那个字是吉的人
SELECT * FROM emp WHERE NAME LIKE '_吉_';

7.5 字段控制查询(控制字段的显示结果)

  • 去除重复记录 DISTINCT
    有2行或者2行以上的记录中的某列的数据相同,比如emp表的salary字段
    当我们查询这个字段的时候,就会出现很多重复的记录。
    如果需要去除重复记录,一样的只留一个,需要使用一个关键字:DISTINCT
-- 查询工资要求去重
SELECT DISTINCT salary FROM emp;
  • 求和(查看工资和奖金之和)
    工资和奖金列都是数值类性,所以可以做运算。如果做运算的某列不是数值类型,就会结果有问题。
    SELECT *,salary+bonus FROM emp;
    因为bonus有null,任何东西和null运算结果都是null,所以
    我们的结果中也会出现null,所以我门要使用虑空函数把null变成0
SELECT *,salary+IFNULL(bonus,0) FROM emp;
  • 给列起别名
    上面的语句中出现了salary+IFNULL(bonus,0)这样的列名,不好看。所以就给它起个别名,需要使用关键字 AS
SELECT *,salary+IFNULL(bonus,0) AS 工资总和 FROM emp;
-- 查询emp表中id,name,salary,bonus,salary+bonus的结果
SELECT id AS 编号,NAME 姓名,salary 工资,bonus AS 奖金,salary+IFNULL(bonus,0)AS 工资总和 FROM emp;

AS关键可以不写

7.6 排序

  • 要使用关键字: order by
  • 排序规则: 升序 asc 默认 降序 desc
  • 语法: order by 列名 排序规则
-- 查询所有信息,按照工资的升序排序
SELECT * FROM emp ORDER BY salary ASC;
SELECT * FROM emp ORDER BY salary;
-- 查询信息按照出生日期降序排序
SELECT * FROM emp ORDER BY birthday DESC;
-- 查询信息按照工资的降序排序,如果工资一样按照奖金的升序排序
SELECT * FROM emp ORDER BY salary DESC,bonus ASC;

7.7 常用的聚合函数

  • 聚合函数是用来做纵向运算的函数。
  • sum: 求和
    如果不是数值类型,结果为0
  • avg:平均值
    同上
  • max:最大值
    如果指定列是字符串,使用字符串排序运算
    就是对给定的字符串,按照首字母字典值排序,
    如果首字母一样,按照第二个字母,…
  • min:最小值
    同上
  • count:计数
    统计指定列不为null的记录数
-- 查询emp表中一共有多少条记录
SELECT COUNT(*) FROM emp;
-- 查寻有奖金的人数
SELECT COUNT(bonus) FROM emp;
-- 统计工资大于9000的人数
SELECT COUNT(*) FROM emp WHERE salary>9000;
-- 统计工资和奖金之和大于10000的人数
SELECT COUNT(*) FROM emp WHERE salary+IFNULL(bonus,0)>10000;
-- 分别统计有领导的人数,有奖金的人数
SELECT COUNT(leader) 领导数,COUNT(bonus)奖金数 FROM emp;
-- 统计有奖金并且有领导的人数
SELECT COUNT(*) FROM emp WHERE bonus IS NOT NULL AND leader IS NOT NULL;
SELECT COUNT(leader) FROM emp WHERE bonus IS NOT NULL;


-- 查询所有人的工资和
SELECT SUM(salary) FROM emp;
-- 查询所有人的奖金和
SELECT SUM(bonus) FROM emp;
-- 查询所有人的工资加奖金之和
SELECT SUM(salary+IFNULL(bonus,0)) FROM emp;
SELECT SUM(salary)+SUM(bonus) FROM emp;
-- 统计所有人的平均工资
SELECT AVG(salary) FROM emp;
SELECT SUM(salary)/COUNT(salary) FROM emp;

-- 查询最高工资和最低工资
SELECT MAX(salary),MIN(salary) FROM emp;

7.8 分组查询

  • 分组需要使用关键字 group by
-- 查询每个部门的工资总和,说明我要以部门分组
SELECT deptid,SUM(salary) FROM emp GROUP BY deptid;
-- 查询每个部门的人数
SELECT deptid,COUNT(*) FROM emp GROUP BY deptid;
-- 查询每个部门工资大于等于10000的人数
SELECT deptid,COUNT(*) FROM emp WHERE salary>=10000 GROUP BY deptid ;

7.9 having子句

-- 查询工资总和大于20000的部门编号以及这个部门的工资总和
SELECT deptid,SUM(salary) FROM emp GROUP BY deptid HAVING SUM(salary)>20000 ;
- 注意:where和having的区别:
having:是分组后对数据过滤的条件,后面可以使用聚合函数
where:是分组前对数据过滤的条件,后面不可以使用聚合函数
where:如果某个数据不满足where的条件,那么这个数据不会参与分组。

7.10 limit 方言

  • 用来限定查询结果的起始行和总行数的,说白了是用来做分页查询的
-- 查询3条记录
SELECT * FROM emp LIMIT 0,3;
-- 0表示从第一条记录开始 3表示查询3条记录
-- 查询4条记录,从第2条开始
SELECT * FROM emp LIMIT 1,4;
  • 分页查询
-- 如果一页能显示3条数据,我要看第三页
-- SELECT * FROM emp LIMIT 0,3;
-- SELECT * FROM emp LIMIT 3,3;
SELECT * FROM emp LIMIT 6,3;

7.11 基本查询sql的书写顺序和执行顺序

  • 书写顺序:select–from–where–group by–having–order by–limit
  • 执行顺序:from–where–group by–having–select–order by–limit

8 多表查询

8.1 分类

  • 合并结果集
      去重 union
      不去重 union all
  • 链接查询
      内链接 [inner] join on
      外连接 outer join on
        左外链接 left [outer] join
        右外链接 right [outer] join
        全外链接 full join 我的版本不支持
      自然链接 natural join
  • 子查询

8.2 合并结果集

  • 就是把两个select语句的查询结果合并到一起
  • 注意: 被合并的2个结果的列数和列的类型必须相同。
CREATE TABLE aaa(
	id INT,
	NAME VARCHAR(10)
);

CREATE TABLE bbb(
	id INT,
	NAME VARCHAR(10),
	age INT
);

INSERT INTO aaa VALUES(1,'aaa');
INSERT INTO aaa VALUES(2,'bbb');
INSERT INTO aaa VALUES(3,'ccc');


INSERT INTO bbb VALUES(1,'aaa',18);
INSERT INTO bbb VALUES(2,'bbb',17);
INSERT INTO bbb VALUES(4,'ddd',20);


SELECT * FROM aaa;
SELECT * FROM bbb;

SELECT * FROM aaa;
SELECT id,NAME FROM bbb;

-- 1 2 3 4
SELECT * FROM aaa UNION SELECT id,NAME FROM bbb;
-- 1 2 3 1 2 4
SELECT * FROM aaa UNION ALL SELECT id,NAME FROM bbb;

mysql 多表组合结果_数据库


mysql 多表组合结果_sql_02

8.3 连接查询

  • 连接查询就是求多个表的乘积
    比如连接查询a表和b表,查询出来的结果的数量是a*b。
    a有5条数据,b有4条数据,连接查询的结果就是5*4=20条数据。
  • 连接查询会产生笛卡尔积(理解为链接查询后产生的对应关系不正确的数据)
  • 一般我们连接查询的多个表之间必然存在关联关系。所以我们就通过这个关联关系来去除笛卡尔积。
    比如emp和dept,在显示员工信息的同时把这个员工所在的部门信息也显示出来,可以使用连接查询,使用主外键关系等式来去除无用信息。
SELECT * FROM emp,dept WHERE emp.deptid = dept.deptid

-- 我要查询所有员工的编号,姓名,工资,奖金和这个员工所在部门的名字
SELECT emp.id,emp.name,emp.salary,emp.bonus,dept.dname FROM emp,dept WHERE emp.deptid = dept.deptid;
-- 假设我的表名很长  employee_infomation   department_info,比较麻烦。
SELECT employee_infomation.id,employee_infomation.name,employee_infomation.salary,
employee_infomation.bonus,department_info.dname FROM emp,dept WHERE emp.deptid = dept.deptid;
-- 可以给表起个别名,使用别名即可
SELECT e.id,e.name,e.salary,e.bonus,d.dname FROM emp AS e,dept d WHERE e.deptid = d.deptid;

8.3.1 内连接 [inner] join on

  • 上面的语句就是一个内连接语言,但是不是sql标准的写法。相当于是方言。
  • sql标准的内连接:
SELECT * FROM emp INNER JOIN dept ON emp.deptid=dept.deptid;
SELECT * FROM emp JOIN dept ON emp.deptid=dept.deptid;
inner可以不写。。。
  • 注意:on用于主外键关系等式
  • 特点:查询出来的结果必然是满足条件等式的。
    假如部门中有50号部门,而我的emp表中没有50号部门的人
    那么内连接查询的结果就不会有50号部门的信息,因为它不满足
    emp.deptid=dept.deptid;

8.3.2 外连接 outer join on

  • 特点:查询出来的结果存在不满足条件的可能性。
  • 左外链接:查询时先查询左边的表的所有数据(以左表为主),然后查询右表,右表中满足条件的显示,不满足条件的显示为null
SELECT * FROM emp LEFT OUTER JOIN dept ON emp.`deptid`=dept.`deptid`;
SELECT * FROM dept LEFT OUTER JOIN emp ON emp.`deptid`=dept.`deptid`;
SELECT * FROM dept LEFT JOIN emp ON emp.`deptid`=dept.`deptid`;
-- outer 可以省略不写。
  • 右外链接:查询时先查询右边的表的所有数据(以右表为主),然后查询左表,
    左表中满足条件的显示,不满足条件的显示为null
SELECT * FROM emp RIGHT OUTER JOIN dept ON emp.`deptid`=dept.`deptid`;
SELECT * FROM dept RIGHT OUTER JOIN emp ON emp.`deptid`=dept.`deptid`;
  • 记住:用主外键关系等式可以去除无用的笛卡尔积。

8.3.3 自然链接 natural join

  • 通过上面的案例我们知道链接查询会产生笛卡尔积,可以使用主外键等式去除它。而自然链接无需给出关系等式,它会自动找到这个等式。两个表中名称和类型完全一样的列作为条件。比如emp和dept中都有deptid。
SELECT * FROM emp NATURAL JOIN dept;
SELECT * FROM emp NATURAL LEFT JOIN dept;
SELECT * FROM emp NATURAL RIGHT JOIN dept;

8.4 子查询(嵌套查询)

8.4.1 概述

  • 一个select语句中包含另一个完整的select语句
  • 一个语句中包含2个或2个以上的select语句,那么它就是一个子查询语句。

8.4.2 子查询出现的位置

  • where后,作为被查询的条件
  • from后,做表

8.4.3 当子查询出现在where后用作条件时,可以使用一些关键字

  • all 和 any

8.4.4 子查询的结果集形式:

  • 单行单列:条件
  • 单行多列:条件
  • 多行单列:条件
  • 多行多列:表
-- 查询工资大于霆锋的人的信息
-- 分析:查询条件  工资>霆锋的工资 
-- 霆锋的工资需要一个查询语句
-- 第一步:先查询霆锋的工资
SELECT salary FROM emp WHERE NAME='霆锋';
-- 第二步:查询工资大于霆锋的人的信息
SELECT * FROM emp WHERE salary>(SELECT salary FROM emp WHERE NAME='霆锋');

-- 查询工资和宝强一样的人的信息
SELECT * FROM emp WHERE salary=(SELECT salary FROM emp WHERE NAME='宝强');

-- 查询工资大于20号部门所有人的人的信息
-- 第一步:查询20号部门最高工资
SELECT MAX(salary) FROM emp WHERE deptid=20;
-- 第二步:查询大于20号部门最大工资就是大于所有
SELECT * FROM emp WHERE salary >(SELECT MAX(salary) FROM emp WHERE deptid=20);

-- 第一步:查询20部门所有人的工资
SELECT salary FROM emp WHERE deptid=20;
-- 第二步:大于第一步的所有人工资
SELECT * FROM emp WHERE salary > ALL(SELECT salary FROM emp WHERE deptid=20);

-- 查询工资和奖金与宝强一摸一样的人的信息
-- 查询条件:工资和奖金 = 宝强
-- 第一步:查询宝强的工资和奖金
SELECT salary,bonus FROM emp WHERE NAME='宝强';
-- 第二步:查询和第一步结果一样的人
SELECT * FROM emp WHERE (salary,bonus) IN (SELECT salary,bonus FROM emp WHERE NAME='宝强');
SELECT * FROM emp WHERE (salary,bonus) = (SELECT salary,bonus FROM emp WHERE NAME='宝强');
SELECT * FROM emp WHERE salary=(SELECT salary FROM emp WHERE NAME='宝强')
AND bonus=(SELECT bonus FROM emp WHERE NAME='宝强');

-- 查询有2个或2个以上直接下属的人的信息
-- 第一步:查询哪个leader出现了2次或2次以上
SELECT leader FROM emp GROUP BY leader HAVING COUNT(leader)>=2;
-- 第二步:根据这个leader编号,查询对应的人的信息
SELECT * FROM emp WHERE id IN (SELECT leader FROM emp GROUP BY leader HAVING COUNT(leader)>=2);

-- 查询编号是7的人的姓名,工资,部门名称,部门地址
-- 分析:这些数据来自2张表。需要链接查询。外连接可能出现一半有值一半是null的情况
-- 所以我们选择内连接
SELECT e.name,e.salary,d.dname,d.address FROM emp e,dept d WHERE e.deptid=d.deptid AND e.id=7; 
-- 因为emp表中只需要个别字段,我们可以用一个子查询只把我们需要的字段查询出来
SELECT id,NAME,salary,deptid FROM emp;
-- 然后替换emp表
SELECT e.name,e.salary,d.dname,d.address 
FROM (SELECT id,NAME,salary,deptid FROM emp) e,dept d WHERE e.deptid=d.deptid AND e.id=7;

mysql 多表组合结果_数据库_03

8.4.5 自链接

  • 自己链接自己

9 DCL:数据控制语言

9.1 创建用户

  • 语法:create user 用户名@地址 IDENTIFIED BY 密码;
CREATE USER momo@localhost IDENTIFIED BY '1234';
  • 新建的用户默认是没有任何权限的。

9.2 给用户授权

  • 语法:grant 权限1,权限2,… on 数据库名.* to 用户名;
GRANT SELECT,INSERT ON mydb.* TO momo@localhost;
  • 如果要给用户赋予所有权限可以使用 all
GRANT all ON mydb.* TO momo@localhost;
  • 如果要给用户在所有库所有表上赋予权限 使用 *

9.3 撤销权限

  • 语法:revoke 权限1,权限2,… on 数据库名.* from 用户名;
revoke insert on mydb.* from momo@localhost;
  • 如果要给撤销用户所有权限可以使用 all

9.4 查看用户权限

  • 语法:show grants for 用户名;
show grants for momo@localhost;

9.5 删除用户

  • 语法:drop user 用户名;

9.6 修改用户密码

UPDATE USER SET authentication_string='123654' WHERE USER='momo1';
UPDATE USER SET authentication_string='123654' WHERE USER='momo1' and host='ip地址';