一、数据库的好处
1:可以持久化数据到本地
2:结构化查询
二、数据库常见的概念
1:DB、数据库,存储数据的容器
2:DBMS、数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
3:SQL、结构化查询语言,用于和数据库之间的通信,几乎主流的数据库都通用
三、数据库存储数据的特点
1:数据存放到列表中,然后表在放到库里面
2:一个库可以有很多张表,每张表具有唯一的表名用来标识自己
3:表中有一个或多个列,列又称为“字段”
4:表中的每一行数据
四:常见的数据库
MySQL,oracle,db2,SqlServer
五:MySQL的背景
前生是瑞典的AB公司,08年被sun公司收购,09年sun被oracle收购
六:MySQL优点
1:开源、免费、成本低
2:性能高、可移植性好
3:体积小,便于安装
七:MySQL服务的启动和停止
1:通过cmd
net start 服务名
net stop 服务名
2:计算机–管理–服务
八:MySQL服务的登录和退出
登录:mysql -h 主机名 -P 端口号 -u 用户名 -p密码
退出:exit
1:基础查询
语法:
select 查询列表 form 表名;
DESC employees; 显示
特点:
1:查询列表可以为:表中字段、表中常量值、表达式、函数
2:查询的结果是一个虚拟的表格
1.1:查询表中的单个字段
SELECT last_name FROM employees;
1.2:查询表中的多个字段
SELECT last_name,salary,email FROM employees;
1.3:查询表中所有字段
SELECT * FROM employees;
1.4:查询常量值
SELECT 100;
SELECT 'john';
1.5:查询表达式
SELECT 100*98;
1.6:查询函数
SELECT VERSION();
**1.7:起别名**
特点:
1:便于理解
2:如果要查询的字段有重名的情况,使用别名可以区分开来
**方式一:使用AS**
SELECT 100*98 AS 这是一个别名;
SELECT last_name AS 姓,first_name AS 名 FROM employees;
**方式二:使用空格**
SELECT last_name 姓,first_name 名 FROM employees;
如果有特殊符号要用“”
SELECT salary AS "out put" FROM employees;
**1.8:去重(DISTINCT)**
SELECT DISTINCT department_id FROM employees;
**1.9:“+”号的作用**
特点:只能做运输符。
SELECT 90+10; 两个操作数为数值型,做加法
SELECT '123'+90; 只要其中一方为字符型,试图将字符数值转换成数值
如果转换成功,则继续做加法运算
SELECT 'john'+90; 如果转化失败,则将字符数值装换成0
SELECT null+ 10; 只要其中一方为null,则结果肯定为null
**1.10:拼接(CONCAT())**
SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees;
特点:
1:可以拼接多个
2:只要其中一方为null,则结果肯定为null
**1.11:判断(IFNULL(有可能为null的值,想要输出结果的值))**
SELECT IFNULL(commission_pct,0) AS 奖金率,commission_pct FROM employees;
2:条件查询
语法:
select
查询列表
from
表名
where
筛选条件;
分类:
1:按条件表达式筛选
条件运算符:
> < = != <> >= <=
2:按逻辑表达式筛选
逻辑运算符:
and or not
3:模糊查询
like
between and
in
is null
2.1:按条件表达式筛选
SELECT * FROM employees WHERE salary>12000;(查询工资大于12000)
2.2:按逻辑表达式筛选
作用:用于连接条件表达式
and:两个条件都为true,结果为true,反之为false
or: 只要有一个条件为true,结果为true,反之为false
not:如果连接的条件本身为false,结果为true,反之为false
查询工资在9000到12000的员工
SELECT
last_name,salary
FROM
employees
WHERE
salary>=900 AND salary<=12000;
查询部门编号不在90 到 110之间或者工资高于15000的员工姓名和工资
SELECT
last_name,salary
FROM
employees
WHERE
department_id<90 OR department_id>110 OR salary>=15000;
2.3:模糊查询 like between and in is null|is not null
2.3.1:like
特点:
1:一般与通配符搭配使用
通配符:
%表示任意多个字符,包含0个字符
_表示任意一个字符
eg1:查询员工名中包含字符a的员工信息
SELECT
*
FROM
employees
WHERE
last_name LIKE '%a%';
eg2:查询员工名中第三个字符为n,第五个字符为d的员工信息
SELECT
*
FROM
employees
WHERE
last_name LIKE '__n_l%';
eg3:查询员工名中第二字符为_的员工名
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '_\_%'; (反斜杠转义\)
2.3.2:between and
特点:
1:提高语句简洁度
2:两边结果都包含
3:两个临界值不要调换顺序
eg1:查询员工编号在100到120之间的员工信息
SELECT
*
FROM
employees
WHERE
employee_id BETWEEN 100 AND 120;
2.3.3:in
特点:
1:使用in提高语句简洁度
2:in列表的值类型必须统一或类型兼容
3:不支持通配符
eg1:查询员工的工种编号是 AD_VP AD_PRES IT_PROG中的一个员工名和工种编号
SELECT
last_name,job_id
FROM
employees
WHERE
job_id IN ('AD_VP','AD_PRES','IT_PROG');
2.3.4: is not| is not null
特点:
1:=或<>不能判断null
2:is null或is not null 可以判断null值
eg1:查询没有奖金的员工名和奖金率
SELECT
last_name,commission_pct
FROM
employees
WHERE
commission_pct IS NULL;
eg2:查询有奖金的员工名和奖金率
SELECT
last_name,commission_pct
FROM
employees
WHERE
commission_pct IS NOT NULL;
3:排序查询
语法:
select
查询列表
from
表
where
筛选条件
order by
排序列表 asc|desc
特点:
1:asc表升序,desc表降序 不写默认升序
2:order by子句中可以支持单个或多个字段、表达式、函数、别名进行排序
3:order by一般放在查询语句的最后面
eg1:查询员工信息,要求工资从高到低排序
SELECT * FROM employees ORDER BY salary DESC;
eg2:查询员工信息,要求工资从低到高排序
SELECT * FROM employees ORDER BY salary ASC;
eg3:查询部门编号>=90的员工信息,按入职时间排序
SELECT * FROM employees
WHERE
department_id>=90
ORDER BY
hiredate ASC;
eg4:按年薪的高低显示员工的信息和年薪 【按表达式排序】
SELECT last_name,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY last_name,salary*12*(1+IFNULL(commission_pct,0)) DESC;
eg5:按年薪的高低显示员工的信息和年薪 【按别名排序】
SELECT last_name,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 DESC;
eg6:按姓名的长度显示员工的姓名和工资【按函数排序】
SELECT LENGTH(last_name) AS 字节长度,last_name,salary
FROM employees
ORDER BY LENGTH(last_name) DESC;
eg7:查询员工姓名,工资,员工编号,要求先按工资排序,后按员工编号排序【按多个字段排序】
SELECT last_name,salary,employee_id
FROM employees
ORDER BY salary ASC,employee_id DESC;
4:常见的函数
调用函数语法:
select 函数名(实参列表) from 表;
特点:
1:叫什么(函数名)
2:干什么(函数功能)
分类:
1:单行函数
eg:concat、length、ifnull等
2:分组函数
功能:做统计使用,又称为统计函数,聚合函数,组函数
4.1:字符函数
4.1.1:LENGTH()获取参数值的字节个数
SELECT LENGTH('john');
4.1.2:CONCAT()拼接字符串
```sql
SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees;
4.1.3:upper(将字符改为大写)、lower(将字符改为小写)
SELECT UPPER(‘john’);
SELECT LOWER(‘JOHN’);
eg1:将姓改为大写,名改为小写
SELECT CONCAT(LOWER(last_name),UPPER(first_name)) AS 姓名
FROM employees;
4.1.4:substr
注意:索引从1开始,截取后面所有的字符
eg1:截取从指定索引处后面所有字符
SELECT SUBSTR('头疼,发热,流鼻涕,快用三九感冒灵颗粒',15) AS 三九药业;
eg2:截取从指定索引处到指定结束的字符
SELECT SUBSTR('头疼,发热,流鼻涕,快用三九感冒灵颗粒',1,9) AS 三九药业;
4.1.5:instr(返回第一次出现的起始索引,如果没有就返回0)
SELECT INSTR('头疼,发热,流鼻涕,快用三九感冒灵颗粒','感冒灵颗粒') AS 三九药业;
4.1.6:trim(去掉前后的9,如果没有from指定就去掉前后的空格)
SELECT TRIM('9' FROM '999感9冒9灵9颗9粒999') AS 三九药业;
4.1.7:lpad(用指定的字符实现左填充指定的长度)
SELECT LPAD('感冒灵颗粒',8,'9') AS 三九药业;
4.1.8:rpad(用指定的字符实现右填充指定的长度)
SELECT RPAD(‘感冒灵颗粒’,8,‘9’) AS 三九药业;
4.1.9:replace (替换,如果有多个都会被替换掉)
SELECT REPLACE('治感冒就用三九感冒灵颗粒','三九感冒灵颗粒','小柴胡颗粒') AS 不知名药业;
4.2:数学函数
4.2.1:round (四舍五入,正负数也是一样的道理,绝对值再加正反号)
SELECT ROUND(1.5);
SELECT ROUND(1.567,2);指定小数位数
4.2.2:ceil (向上取整,返回>=该参数的最小整数)
SELECT ROUND(1.01);
4.2.3:floor (向下取整,返回<=该参数的最小整数)
SELECT FLOOR(-1.06);
4.2.4:truncate(截断)
SELECT TRUNCATE(1.655555,1);小数点后保留一位
4.2.5:mod(取余与%是一样的,如果操作数为负数)
其实取余操作是这样子的:mod(a,b)
a-a/b*b
SELECT MOD(13,3);
SELECT 13%3;
4.3:日期函数
4.3.1:NOW 返回当前系统日期加时间
SELECT NOW();
4.3.2:curdate 返回当前系统日期,不包含时间
SELECT CURDATE();
4.3.3:curtime 返回当前系统时间,不包含日期
SELECT CURTIME();
4.3.4:可以获取指定的部分:年(year),月(month),日(day),时,分,秒
SELECT YEAR(NOW()) AS 年; 只返回年部分
SELECT YEAR('1999-1-1') AS 年;
4.3.5:str_to_date 将字符通过指定的格式转换成日期
SELECT STR_TO_DATE('11-14-1999','%c-%d-%Y');
SELECT STR_TO_DATE('11-14 1999','%c-%d %Y');
4.3.6:date_format 将日期转换成字符
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日');
4.4:其他函数
4.4.1:SELECT VERSION(); 查看数据库版本号
4.4.2:SELECT DATABASE(); 查看数据库
4.4.3:SELECT USER();查看当前用户
4.5:流程控制函数
4.5.1:if函数,有点像java中的 if else 函数
SELECT IF(1>5,'1大于5','1小于5');
4.5.2:case函数
语法一:
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
...
when 常量n then 要显示的值n或语句n;
else 剩余的情况
end
eg1:查询员工的工资,要求
部门号=30,显示工资的1.1倍
部门号=40,显示工资的1.2倍
部门号-50,显示工资的1.3倍
其他部门原工资
SELECT salary AS 原始工资,department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
ELSE salary
END AS 新工资
FROM employees;
语法二:(类似于多重if)
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
...
else 剩余的情况
eg2:查询员工工资
要求工资>20000,显示A级
要求工资>15000,显示B级
要求工资>10000,显示C级
否则显示D级
SELECT salary AS 原始工资,
CASE
WHEN salary>20000 THEN 'A级'
WHEN salary>15000 THEN 'B级'
WHEN salary>10000 THEN 'C级'
ELSE 'D级'
END AS 工资级别
FROM employees;
4.6:分组函数 (集合函数或统计函数)
sum 求和、avg 平均值、max 最大值、min 最小值 count 计算个数
4.6.1:sum 求和
SELECT SUM(salary) FROM employees;
SELECT AVG(salary) FROM employees;
SELECT MAX(salary) FROM employees;
SELECT MIN(salary) FROM employees;
SELECT COUNT(salary) FROM employees;
4.6.2:分组参数支持哪些类型
SUM 和 AVG合适处理 数值型 NULL值不参与运算 数据
MAX 和 MIN支持大部分类型 NULL值不参与运算 数据
COUNT 计数支持大部分类型,只计算不为空的数值 NULL值不参与运算
4.6.3:count函数
SELECT COUNT(*) FROM employees; 统计行数,一般用COUNT(*)
5:分组查询:
语法:
salary 分组函数,列(要求出现在group by的后面)
from 表
【where 筛选条件】
group by 分组的列表
【order by 字句】
注意:
查询列表必须特殊,要求是分组函数和group by后出现的字段
特点:
数据源 位置 关键字
分组 前 筛选 原始表 group by字句的前面 where
分组 后 筛选 分组后的结果集 group by字句的后面 having
eg1:查询每个工种的最高工资
SELECT MAX(salary),job_id
FROM employees
GROUP BY job_id;
eg2:查询每个位置上的部门个数
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;
eg3:查询邮箱中包含a字符的,每个部门的平均工资(分组 前 筛选)
SELECT AVG(salary),department_id
FROM employees
WHERE email LIKE '%a%'
GROUP BY department_id;
**分组函数做条件肯定是放在having字句中**
eg4:查询哪个部门的员工个数>2(分组 后 筛选 HAVING函数 )
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;
eg5:查询每个工种有奖金的员工的最高工资(分组 前后 筛选)
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>10000;
5.1:按表达式或函数分组
eg1:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
SELECT LENGTH(last_name) AS 姓名长度,COUNT(*) AS 员工个数
FROM employees
GROUP BY LENGTH(last_name)
HAVING 员工个数>5;
5.2:按多个字段分组
eg1:查询每个部门每个工种的员工的平均工资
SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY department_id,job_id;
6:连接查询(多表查询,当我们查询的字段涉及到多个表的时候,就用到了多表查询)
按年代分类:
sql92标准:仅仅支持内连接
sql99标准:支持内外连接,左外和右外连接,交叉连接
按功能分类:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接:
6.1:等值连接
eg1:查询员工名对应的部门名
SELECT last_name,department_name
FROM employees,departments
WHERE employees.`department_id` = departments.`department_id`;
6.2:为 表 起别名,再做等值连接
优点:
1:提高语句的简洁度
2:区分多个重名的字段
注意:如果为表起了别名,则不能再用原来的表名去做限定
eg1:查询员工名、工种号、工种名
SELECT e.last_name,e.job_id,j.job_title
FROM employees AS e,jobs AS j
WHERE e.`job_id`=j.`job_id`;
6.3:非等值连接
eg1:查询员工的工资和工资等级
SELECT salary,grade_level
FROM employees AS e,job_grades AS j
WHERE
salary BETWEEN j.`lowest_sal` AND j.`highest_sal`;
6.4:自连接
eg1:查询员工名和上级的名称
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees AS e,employees AS m
WHERE m.manager_id=e.employee_id;
6.5:sql99语法:
语法:
select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】
连接类型:
内连接: inner
外连接:
左外: left
右外: right
全外: full
交叉连接: cross
6.5.1:内连接
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】
分类:
等值连接
非等值连接
自连接
特点:
1:可添加排序、分组、筛选
2:inner可以省略
3:筛选条件放在where后面,连接条件放在on后面,提高可读性
4:查询多表的交集部分
**等值连接:
eg1:查询员工名、部门名
SELECT last_name,department_name
FROM employees AS e INNER
JOIN departments AS d
ON e.`department_id`=d.`department_id`;
eg2:查询名字中包含e的员工名和工种名(添加筛选)
SELECT last_name,job_title
FROM employees AS e
INNER JOIN jobs AS j
ON e.`job_id`=j.`job_id`
WHERE e.`last_name` LIKE '%e%';
eg3:查询部门个数>3的城市名和部门个数(添加分组和筛选)
SELECT city,COUNT(*) AS 部门个数
FROM departments AS d
INNER JOIN locations AS l
ON d.`location_id`=l.`location_id`
GROUP BY city
HAVING COUNT(*)>3;
eg4:查询员工名、部门名、工种名、并按部门名降序(多表查询)
SELECT last_name,department_name,job_title
FROM employees AS e
INNER JOIN departments AS d ON e.`department_id`=d.`department_id`
INNER JOIN jobs AS j ON e.`job_id`=j.`job_id`
ORDER BY department_name DESC;
**非等值连接
eg1:查询员工的工资级别
SELECT salary,grade_level
FROM employees AS e
INNER JOIN job_grades AS g
ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;
**自连接
eg1:查询姓名中包含字符k的员工的名字和上级的名字
SELECT e.last_name AS 员工,m.last_name AS 上级
FROM employees AS e
INNER JOIN employees AS m
ON e.`manager_id`=m.`employee_id`
WHERE e.`last_name` LIKE '%k%';
6.5.2:外连接:
应用场景:用于查询一个表中有,另外一个表中没有的记录
特点:
1:外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的就显示出来,如果没有就用null填充
2:左外连接,left join左边的是主表
右外连接,right join右边的是主表
3:左外和右外连接,交换两个表的顺序,可以实现相同的效果
eg1:查询男朋友不在男生表的女生名(左外连接)
SELECT b.name,bo.*
FROM beauty AS b
LEFT JOIN boys AS bo
ON b.boyfriend_id = bo.id;
eg2:查询哪个部门没有员工(左外连接)
SELECT d.*,e.employee_id
FROM departments AS d
LEFT JOIN employees AS e
ON d.`department_id`=e.`department_id`
WHERE e.`employee_id` IS NULL;
eg3:查询哪个部门没有员工(右外连接)
SELECT d.*,e.employee_id
FROM employees AS e
RIGHT JOIN departments AS d
ON d.`department_id`=e.`department_id`
WHERE e.`employee_id` IS NULL;
6.6:子查询
含义:
出现在其他语句中的select语句,称为子查询或者内查询
外部的查询语句,称为主查询
分类:
按子查询出现的位置
select后
仅仅支持标量子查询
from后
表子查询
where或having后 ***
标量子查询 **
列子查询 **
行子查询
exists后
表子查询
按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集只有一行多列)
表子查询(结果集一般为一行多列)
6.6.1:where或having后
1:标量子查询(结果集只有一行一列)
2:列子查询(结果集只有一列多行)
3:行子查询(结果集只有一行多列)
特点:
1:子查询放在小括号内
2:子查询一般放在条件的右侧
3:标量子查询,一般搭配单行操作符使用例如:> < >= <= =
4:列子查询,一般搭配多行操作符使用,in、any/some、all
5:子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
标量子查询:
eg1:查询谁的工资比Abel高 (where后的查询)
第一步:查询Abel的工资
SELECT salary
FROM employees
WHERE last_name = 'Abel';
第二步:查询员工的信息,满足salary>第一步的结果
SELECT *
FROM employees
WHERE salary>(
SELECT salary
FROM employees
WHERE last_name = 'Abel'
);
eg2:返回job_id与141号员工相同,salary比143号员工多的员工 姓名,job_id和工资 (where后的查询)
第一步:查询job_id等于141的员工
SELECT job_id
FROM employees
WHERE employee_id = 141;
第二步:查询143员工的工资
SELECT salary
FROM employees
WHERE employee_id = 143;
第三步:查询员工的姓名,job_id和工资,要求job_id=第一步,并且salary>第二步
SELECT last_name,job_id,salary
FROM employees
WHERE job_id=(
SELECT job_id
FROM employees
WHERE employee_id = 141
) AND salary>(
SELECT salary
FROM employees
WHERE employee_id = 143
);
eg3:返回公司工资最少的员工的last_name,job_id,salary (where后的查询)
第一步:查询工资最低的
SELECT MIN(salary)
FROM employees
第二步:查询last_name,job_id,salary 要求salary=第一步
SELECT last_name,job_id,salary
FROM employees
WHERE salary=(
SELECT MIN(salary)
FROM employees
);
eg4:查询最低工资大于,50号部门最低工资的部门id和他的最低工资
第一步:查询50部门的最低工资
SELECT MIN(salary)
FROM employees
WHERE department_id = 50;
第二步:查询每一个部门的最低工资
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id;
第三步:做最后的筛选,满足要求MIN(salary)>第一步
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary)>(
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
);
列子查询:
使用多行比较操作符
in/not in 等于列表中的任意一个 ***
any/some 和子查询返回的某个值比较
all 和子查询返回的所有值比较
eg1:返回location_id是1400或1700的部门中所有员工姓名
第一步:查询location_id是1400或1700的部门编号
SELECT department_id
FROM departments
WHERE location_id IN(1400,1700);
第二步:查询员工姓名,要去部门号是第一步列表中的某一个
SELECT last_name
FROM employees
WHERE department_id IN(
SELECT department_id
FROM departments
WHERE location_id IN(1400,1700)
);
6.6.2:select后面
eg1:查询每个部门的员工个数
SELECT d.*,(
SELECT COUNT(*)
FROM employees AS e
WHERE e.department_id = d.`department_id`
) AS 个数
FROM departments AS d;
6.6.3:from后面
eg2:查询每个部门的平均工资的工资等级
第一步:查询每个部门的平均工资的工资等级
SELECT AVG(salary) AS ag,department_id
FROM employees
GROUP BY department_id
第二步:连接第一步的结果集合job_grades表筛选平均工资在一个范围内
SELECT ag_dep.*,g.grade_level
FROM (
SELECT AVG(salary) AS ag,department_id
FROM employees
GROUP BY department_id
) AS ag_dep
INNER JOIN job_grades AS g
ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
注意:将子查询结果充当一张变,要求必须起别名
7.1:分页查询(重要)
应用场景:当要显示的数据,一页显示不全的时候,需要分页
语法:
select 查询列表
from 表名
【
on 连接条件
where 筛选条件
group by 分组子段
having 分组后的筛选
order by 排序列表
】
limit 要显示的条目的起始索引从0开始 要显示的条目个数
特点:limit语句是在语句最后执行的
```sql
eg1:查询前五条的员工信息
SELECT * FROM employees LIMIT 0,5;
eg2:查询第11到第15的员工信息
SELECT * FROM employees LIMIT 10,15;
eg3:有奖金的员工信息,并且工资比较高的显示出来
SELECT * FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC
LIMIT 10;
8.1:联合查询(union)
语法:
查询语句一:
union
查询语句二:
union
查询语句三:
......
应用场景:
当我们查询的结果来自多个表,并且表与表之间没有联系,
简单的说就是和并成一个表给你显示出来
特点:
1:要求多条语句查询列数一样
2:要求多条语句查询的每一列的类型要一致
3:会去重(如果不想去重在union后面加all)
eg1:查询部门编号>90或邮箱包含a的员工信息
以前的方法:
SELECT * FROM employees WHERE email LIKE 'a' OR department_id>90;
联合查询:
SELECT * FROM employees WHERE email LIKE 'a'
UNION
SELECT * FROM employees WHERE department_id>90;
下面是数据库的相关资料
链接:https://pan.baidu.com/s/1h_foMsUv1-v5esD8D29JTQ
提取码:1rdr