MySQL语法

MySQL基本指令:
	
	1.查看MySQL中的所有数据库
		show databases;
	2.创建数据库
		create database bigdata;
		创建指定字符集数据库
		create database bigdata19 DEFAULT CHARSET utf8 ;

	3.进入数据库
		use 数据库名称;
	4.查看数据库状态
		status
	5.删除数据库
		drop database testdb;
	6.查看库中存在表
		show tables;
	7.退出当前连接
		exit;
	8.创建表结构
create table userinfo (
id varchar(20) COMMENT "用户ID",
name varchar(100) COMMENT "用户名",
email varchar(100) COMMENT "邮箱",
age int(10) COMMENT "年龄"
);

create table userinfo2 (
id varchar(20) NOT NULL COMMENT "用户ID",
name varchar(100) COMMENT "用户名",
email varchar(100) COMMENT "邮箱",
age int(10) COMMENT "年龄"
);

create table userinfo3 (
id varchar(20) COMMENT "用户ID",
name varchar(100) COMMENT "用户名",
email varchar(100) COMMENT "邮箱",
age int(10) default 18 COMMENT "年龄"
);

create table userinfo4 (
id int auto_increment primary key COMMENT "用户ID", -- auto_increment表示列自动增长  primary key表示是一个主键 主键不能重复
name varchar(100) COMMENT "用户名",
email varchar(100) COMMENT "邮箱",
age int(10) default 18 COMMENT "年龄"
);


create table userinfo5 (
id int primary key COMMENT "用户ID", -- primary key表示是一个主键 主键不能重复 NULL值不能插入
name varchar(100) COMMENT "用户名",
email varchar(100) COMMENT "邮箱",
age int(10) default 18 COMMENT "年龄"
);


	9.查看表结构
		desc userinfo
		NULL 列表示 表中对应能否存储NULLDefault 列表示 对应列默认值

	10.插入数据
		INSERT INTO userinfo2  values ('1000',"张三","zhangsan@163.com",19);
		-- 如果ID列不能为空,那么插入数据会报错
		INSERT INTO userinfo2 (name,email,age) values ("张三","zhangsan@163.com",19); 
		INSERT INTO userinfo2 (id,email,age) values ("1002","zhangsan@163.com",19);

		-- 如果创建表时给定列的默认值 那么插入数据时不给定 会用默认值填充
		INSERT INTO userinfo3 (id,name,email) values ("1002","张三","zhangsan@163.com");


		INSERT INTO userinfo4 (name,email,age) values ("张三","zhangsan@163.com",19),("李四","lisi@163.com",20),("王五","wangwu@163.com",21); 

		INSERT INTO userinfo5 (id,name,email,age) values (NULL,"赵六","zhaoliu@163.com",19);


	11. 查询数据
		SELECT * FROM userinfo3;


	12. 删除表
		drop table userinfo5;

	13. 清空表
		方式一:
			truncate table userinfo4;
		方式二:
			delete from userinfo3;
	14. 修改表
		
		添加列:
			alter table userinfo2 add gender varchar(100) COMMENT "性别" default "男";

		修改列:
			alter table userinfo2 change gender gender varchar(10);
			alter table userinfo2 change gender gender varchar(10) COMMENT "性别" default "男"  ;
				-- change 后类型关键字 可以和建表时使用范围一致
			alter table userinfo2 modify column email varchar(50);
		删除列:
			alter table userinfo2 drop column email;

		修改列默认值:
			alter table userinfo2 alter gender set default "女";

			alter table userinfo2 alter name set default "default_name";
			INSERT INTO userinfo2 (id,age) values ("1003",20);
		删除列默认值
			alter table userinfo2 alter name drop default ;
		删除主键
			alter table userinfo4 drop primary key;
			-- 由于原表中有auto_increment 修饰直接用 drop primary key删除存在问题,所以通过 MODIFY COLUMN 修改列信息
			ALTER TABLE `bigdata19`.`userinfo4` MODIFY COLUMN `id` int(11) NOT NULL COMMENT '用户ID' ;
		添加主键
			alter table userinfo4 add primary key (id);
			
	15.大小写
			SELECT * FROM userinfo2; --对应关键字不区分大小写
			SELECT * FROM USERINFO2; --对应库及表名是区分大小写
			SELECT ID,NAME FROM userinfo2;  --对应表中的列不区分大小写
			
表列字段类型

int类型:
	int				表示有符号,取值范围:-21474836482147483647
	int unsigned	表示无符号,取值范围:04294967295
	int(5)zerofill	仅用于显示,当不满足5位时,按照左边补0,例如:00002;满足时,正常显示。
	注意:
	① 可以保存带符号数据
	② UNSIGNED 表示不能存储符号,但是可以增加一倍存储长度
	③ int(m) ZEROFILL 表示在当前值之前填充0 总长度为m

TINYINT类型:
	应用场景:在存储维度表时,有一些比较短的标记数,可以使用TINYINT类型
	有符号,取值范围:-128127.
	无符号,取值范围:0255

bigint类型:
	有符号,取值范围:-92233720368547758089223372036854775807
	无符号,取值范围:018446744073709551615
	存储较大数值时可用,一般用于存储时间戳


DECIMAL 类型:
	DECIMAL(m,d)
CREATE TABLE userinfo8 (
money DECIMAL(9,4) 
)
INSERT INTO userinfo8 VALUES (123456.789);
	注意: 
		① m表示当前存储的总长度,d表示小数点位数
		② 当整数存储位数(m-d)超过范围时,会报错 Out of range value for column 'money' at row 1
		③ 当小数位数超过存储范围时,会对数值进行截断

	作用:遇到金额类的数据一定要用DECIMAL类型保存,金额计算时,要求误差非常低

FLOAT 类型:
CREATE TABLE userinfo9 (
money FLOAT(9,4) 
)
INSERT INTO userinfo9 VALUES (12345.789);
	作用:如果数值不是金额类的数据一般来说都保存为FLOAT类型
		① FLOAT在CPU计算时相对其他类型,速度更快
		② FLOAT相比较而言其占用磁盘资源较少

DOUBLE类型:
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。

char(m)

CREATE TABLE userinfo10 (
name1 char(10),
name2 varchar(10)
)
INSERT INTO userinfo10 VALUES ('zhangsan','lisi');
-- 如果char字符超过范围会报错
INSERT INTO userinfo10 VALUES ('zhangsan1234','lisi');
INSERT INTO userinfo10 VALUES ('lisi','zhangsan1234');

-- 修改MySQL中的严格模式
	一、查询MySQL mode设置
		SELECT @@sql_mode;
		对应结果中有 STRICT_TRANS_TABLES 参数为严格模式参数
	二、设置MySQL非严格模式
		vim /etc/my.cnf 
		添加如下内容:
			sql-mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
		重启Mysql服务
			systemctl restart mysqld
如果当前MySQL为非严格模式下,那么插入数据超过其范围,会进行截取插入


datetimetimestamp类型
CREATE TABLE userinfo11 (
CREATE_time datetime ,
INSERT_time timestamp
);

INSERT INTO userinfo11 VALUES ('2022-08-06 11:00:00','2022-08-06 11:00:00');
INSERT INTO userinfo11 VALUES (NULL,NULL);

CREATE TABLE userinfo12 (
name varchar(10) ,
INSERT_time timestamp
);

INSERT INTO userinfo11(name) VALUES ("张三"),("老六");

注意:
	①两者都可以存储时间格式数据并且数据类型一致
	②当timestamp类型在存储NULL数据时,会用当前系统时间来替换 
		timestamp作用:通常用来存储数据插入时间,不需要手动指定	

CREATE TABLE userinfo13 (
name varchar(10) ,
dt date
);
INSERT INTO userinfo13(name,dt) VALUES ("张三","2022-08-06")
-- 不能转换NULL值
INSERT INTO userinfo13(name,dt) VALUES ("张三",NULL)



DQL语言

-- 查询时 表名前可以添加库名来实现夸库之间的查询
-- * 表示所有列
SELECT * FROM bigdata19.dept

-- 查询单列
SELECT ENAME FROM bigdata19.emp;

-- 查询指定多列
SELECT ENAME,EMPNO FROM bigdata19.emp;

-- 查询列后重命名
-- 工作中千万不要用中文来标记列名 
SELECT ENAME AS "员工姓名",EMPNO AS "部门编号" FROM bigdata19.emp;

SELECT ENAME EMP_NAME,EMPNO  EMP_DEPTNO FROM bigdata19.emp;

-- 给定某列以固定的数据内容
SELECT ENAME , "员工姓名" , EMPNO , "部门编号" FROM bigdata19.emp;

-- 需求:求出全年薪资
-- 列的数学运算:

SELECT SAL * 12 FROM bigdata19.emp;
-- 需求:求出员工一年所有的收入
-- 注意: 如果列中有数值为NULL 在做数据的数学运算时,最终结果为NULL
SELECT SAL * 12 + COMM ,SAL * 12, COMM FROM bigdata19.emp;


WHERE 条件
-- WHERE + 判断条件
-- 需求: 获取EMP表中部门编号为20的所有员工姓名及部门编号
SELECT ENAME, DEPTNO FROM bigdata19.emp WHERE DEPTNO = '20'

-- WHERE 判断条件最终返回的结果为 TRUE 或者 FALSE
SELECT ENAME, DEPTNO FROM bigdata19.emp WHERE TRUE

SELECT ENAME, DEPTNO FROM bigdata19.emp WHERE DEPTNO = '20' 


FORD	20

-- 多条件关联 AND 和 OR
-- 需求: 取出EMP表中部门编号为20 薪资水平在2000以上的员工姓名及部门编号

SELECT
ENAME AS SAL_g_2000_ENAME
,SAL
,DEPTNO
FROM bigdata19.emp
WHERE DEPTNO='20' AND SAL > 2000


-- 需求: 取出EMP表中部门编号为20和30 薪资水平在2000以上的员工姓名及部门编号

-- 条件1 OR 条件2 : 当条件1结果为TRUE时,条件2并不需要执行,OR的规则是 如果两个条件其中一个为TRUE 那么最终结果返回为TRUE 
	-- 并且在 OR右边的所有条件都不会执行
	-- 当OR和AND一起使用时,可以将OR条件用()括起来

SELECT
*
FROM bigdata19.emp
WHERE SAL > 2000 AND (DEPTNO='20' OR DEPTNO='30')


SELECT
*
FROM bigdata19.emp
WHERE DEPTNO ='30' OR DEPTNO='20'  AND SAL > 2000



-- IN 根据给定值取其结果
-- 用法 列名 IN ("值1","值2") 
SELECT
*
FROM bigdata19.emp
WHERE SAL > 2000 AND DEPTNO IN ('20','30')

-- NOT IN
-- 需求: 取出所有部门编号不为20和30的所有员工并且薪资小于等于 1500 

SELECT
*
FROM bigdata19.emp
WHERE SAL <= 1500  AND DEPTNO NOT IN ('20',"30")

-- WHERE 中的比较运算符
> >= <= < = !=

-- 需求: 取出所有部门编号不为20的所有员工并且薪资小于等于 1500 
SELECT
*
FROM bigdata19.emp
WHERE SAL <= 1500  AND DEPTNO != '20'


-- 需求:取出所有姓名中包含 M单词的员工
-- LIKE 
--   作用: 主要用于模糊匹配
SELECT
*
FROM bigdata19.emp
WHERE ENAME LIKE "M"

SELECT
*
FROM bigdata19.emp
WHERE ENAME LIKE "SMITH"

-- % 代表的是任意多个字符
SELECT
*
FROM bigdata19.emp
WHERE ENAME LIKE "%M%"


--  需求:取出所有姓名中开头M单词的员工

SELECT
*
FROM bigdata19.emp
WHERE ENAME LIKE "M%"

--  需求:取出所有姓名中倒数第二个单词为E的员工
-- _ 表示一个占位符 
SELECT
*
FROM bigdata19.emp
WHERE ENAME LIKE "%E_"


--  需求:取出所有姓名中倒数第二个单词为不为E的员工
-- NOT LIKE 用法 对模糊匹配到的结果取反
SELECT
*
FROM bigdata19.emp
WHERE ENAME NOT LIKE "%E_"

-- 需求:获取当前数据库中所有包含user的表名
show tables like '%user%';


-- 需求:求出员工表中没有年终奖的所有员工
-- IS NULL
SELECT
*
FROM bigdata19.emp
WHERE COMM IS NULL OR COMM = 0

-- 比较判断数值类型数据时 既可以用 数值也可以用 字符串形式比较
-- 需求:求出员工表中有年终奖的所有员工
SELECT
*
FROM bigdata19.emp
WHERE COMM IS NOT NULL AND COMM != 0


-- 需求: 求出员工表中所有薪资范围为1000到2000的员工
SELECT
*
FROM bigdata19.emp
WHERE SAL >= 1000 AND SAL <= 2000

-- BETWEEN  A AND B : 取出A到B中的所有数据,并且包含A和B的值

SELECT
*
FROM bigdata19.emp
WHERE SAL BETWEEN 1100 AND 1600

7369	SMITH	CLERK	7902	1980-12-17		800		800  => 800 BETWEEN 1100 AND 1600  => FALSE  => 跳过该行数据


-- RLIKE 
-- 需求: 取出所有员工入职时间是在1981年的人员
SELECT
*
FROM bigdata19.emp
WHERE HIREDATE RLIKE "^1981"


排序:

-- ORDER BY 作用:用于对指定列进行排序,并且默认为升序排序 
--               如果需要降序排序:ORDER BY 列名 DESC

-- 需求: 取出所有部门编号为30的员工 对薪资进行升序排序
SELECT
*
FROM bigdata19.emp
WHERE DEPTNO = 30 
ORDER BY SAL 

-- 需求: 取出所有部门编号为30和20的员工并且薪资水平大于1500 将取到结果进行倒序排序
-- 分析:
--      1. 部门编号为30和20的员工取出
--		2. 取出薪资水平大于1500
--   	3. 倒序排序
SELECT
*
FROM bigdata19.emp
WHERE DEPTNO IN ('30','20') AND SAL > 1500
ORDER BY SAL DESC


-- 需求: 取出所有部门编号为30和20的员工并且薪资水平大于1500 对取到的结果按 部门升序 薪资升序排序

SELECT
*
FROM bigdata19.emp
WHERE DEPTNO IN ('30','20') AND SAL > 1500
ORDER BY DEPTNO, SAL

-- 需求: 取出所有部门编号为30和20的员工并且薪资水平大于1500 对取到的结果按 部门降序 薪资升序排序

SELECT
*
FROM bigdata19.emp
WHERE DEPTNO IN ('30','20') AND SAL > 1500
ORDER BY DEPTNO DESC, SAL



分页

-- 需求: 求出所有部门中员工薪资最高的前三名员工
-- 分析:
--		1. 对所有员工薪资进行排序,以降序排序
--		2. 对排序结果取前三名

-- LIMIT n 取前N行数据
-- 注意:取排名的第一种方式


SELECT
*
FROM bigdata19.emp
ORDER BY SAL DESC
LIMIT 3

-- OFFSET index 表示偏移量 其中index表示行的下标并且下标是从0开始

-- 需求: 求出公司所有员工薪资最高的第三名

SELECT
*
FROM bigdata19.emp
ORDER BY SAL DESC
LIMIT 1
OFFSET 2



-- UNION ALL 拼接两个表的查询结果
-- 注意: UNION ALL 中不能跟LIMIT 和 ORDER BY 搭配使用,如果必须要使用,那么可以通过子查询方式将 LIMIT 和 ORDER BY 包装起来
-- 需求: 取出部门编号为20和编号为30的所有员工
SELECT
*
FROM bigdata19.emp
WHERE DEPTNO='20'
UNION ALL 
SELECT
*
FROM bigdata19.emp
WHERE DEPTNO='30'


-- 子查询
--   作用:将一个SELECT查询结果看做成一个表,然后再对该表进行查询
--   应用场景: 可以将整表的数据先做粗过滤,减少后续处理的数据量,提升整体查询速度
SELECT
*
FROM (
SELECT
*
FROM bigdata19.emp
WHERE DEPTNO='10'
ORDER BY SAL DESC
) table1 LIMIT 1


-- 需求: 取出各部门中所有薪资最高的员工

SELECT
*
FROM (
SELECT
*
FROM bigdata19.emp
WHERE DEPTNO='10'
ORDER BY SAL DESC
LIMIT 1
) table1 

UNION ALL
SELECT
*
FROM (
SELECT
*
FROM bigdata19.emp
WHERE DEPTNO='20'
ORDER BY SAL DESC
LIMIT 1
) table2 

UNION ALL
SELECT
*
FROM (
SELECT
*
FROM bigdata19.emp
WHERE DEPTNO='30'
ORDER BY SAL DESC
LIMIT 1
) table3 



-- 需求: 假设部门表中存在有1万个员工,某个部门中的员工只有100个
		  -- 求出部门中所有入职时间为1981年的员工

SELECT
*
FROM bigdata19.emp 
WHERE HIREDATE like "^1981" AND DEPTNO = '40'

SELECT
*
FROM (
SELECT
*
FROM bigdata19.emp
WHERE DEPTNO = '40') TABLE1 
WHERE TABLE1.HIREDATE like "^1981"



-- 每创建一个连接就是一个会话 session 



-- 单行注释
/*
多行注释
多行注释
多行注释
*/

-- SQL规范
/*
	①:脚本需要以.sql为文件结尾
	②:sql脚本中需要在开头注释区域表明当前脚本所执行的任务(需求内容)以及 执行逻辑 以及SQL脚本中的一些标记信息
	③:开发者/开发时间/版本
	④:对应执行的测试结果
	⑤:SQL风格
*/
去重操作:

方式一: GROUP BY
需求: 求出emp表中有多少不同的部门编号


SELECT 
DEPTNO
FROM emp
GROUP BY DEPTNO


需求: 求出emp表中不同的部门编号的个数

SELECT
count(*)
FROM(
SELECT 
DEPTNO
FROM emp
GROUP BY DEPTNO
) t

[Err] 1248 - Every derived table must have its own alias  -- 加上别名



方式二: DISTINCT

SELECT
DISTINCT DEPTNO  AS deotno_
FROM emp


GROUP BY 会比 DISTINCT效率更高,推荐使用 GROUP BY 



流程控制:

IF语句:
	格式:IF(条件判断(返回的为TRUEFALSE),如果为TRUE那么返回该参数内容,如果为FALSE那么会返回该参数内容)

SELECT
IF(COMM IS NULL,0,COMM)
FROM emp


需求:
   从EMP表中统计薪资小于2000的人数以及大于2000的人数


方式一:
SELECT
"SAL < 2000" as flag
,count(*)
FROM emp
WHERE SAL < 2000 
UNION ALL
SELECT
"SAL >= 2000 " as flag
,count(*)
FROM emp
WHERE SAL >= 2000 


方式二:

SELECT
T1.flag
,count(*)
FROM(
SELECT
IF(SAL < 2000,"SAL < 2000","SAL >= 2000") as flag
FROM emp
)T1
GROUP BY T1.flag

SELECT
IF(SAL < 2000,"SAL < 2000","SAL >= 2000") as flag
,count(*) as num
FROM emp 
GROUP BY IF(SAL < 2000,TRUE,FALSE) -- GROUP BY 中的列信息需要和 SELECT中的列信息保持一致




CASE 判断语句

	格式:  CASE WHEN 判断条件1 THEN 如果判断结果为TRUE 那么返回值
				 WHEN 判断条件2 THEN 如果判断结果为TRUE 那么返回值2
		     ELSE 以上都不满足 则返回 END


SELECT
CASE 
WHEN SAL > 2000 THEN "SAL >= 2000"
ELSE  "SAL < 2000" END as flag
,COUNT(*) as num
FROM emp 
GROUP BY  CASE 
WHEN SAL > 2000 THEN "SAL >= 2000"
ELSE  "SAL < 2000" END 


需求: 查询各部门中 薪资水平在 1000 以内  1000-200020003000 ...  统计其人数

SELECT
CASE WHEN SAL < 1000 THEN "<1000"
WHEN SAL >= 1000 AND SAL < 2000 THEN "1000<=SAL<2000"
WHEN SAL >= 2000 AND SAL < 3000 THEN "2000<=SAL<3000"
WHEN SAL >= 3000 AND SAL < 4000 THEN "3000<=SAL<4000"
ELSE "SAL>=4000" END as flag
,count(*)
FROM emp
GROUP BY CASE WHEN SAL < 1000 THEN "<1000"
WHEN SAL >= 1000 AND SAL < 2000 THEN "1000<=SAL<2000"
WHEN SAL >= 2000 AND SAL < 3000 THEN "2000<=SAL<3000"
WHEN SAL >= 3000 AND SAL < 4000 THEN "3000<=SAL<4000"
ELSE "SAL>=4000" END 



表与表的外连接


SELECT
T1.*
,T2.*
FROM emp T1  JION dept T2 ON T1.DEPTNO=T2.DEPTNO


LEFT JOIN
	格式: A LEFT JOIN B ON A.column=B.column
	作用: 拿A与B中的关联字段进行关联,关联到则保存,关联不到则保存A表中的数据,并且用NULL值填充B表内容

SELECT
T1.*
,T2.*
FROM emp T1  LEFT JOIN dept T2 ON T1.DEPTNO=T2.DEPTNO


RIGHT JOIN
	格式: A RIGHT JOIN B ON A.column=B.column
	作用:与LEFT JION 相反



需求:
	获取EMP表中员工没有部门表对应的部门编号的员工

SELECT
T1.*
,T2.*
FROM emp T1  LEFT JOIN dept T2 ON T1.DEPTNO=T2.DEPTNO
WHERE T2.DEPTNO IS NULL

需求:
	获取部门表中没有员工的部门
SELECT
T1.*
FROM  dept T1  LEFT JOIN  emp T2 
ON T1.DEPTNO=T2.DEPTNO
WHERE T2.DEPTNO IS NULL


需求:获取部门表和员工表中的所有数据


SELECT
T1.*
,T2.*
FROM emp T1  LEFT JOIN dept T2 ON T1.DEPTNO=T2.DEPTNO
UNION ALL
SELECT
T2.*
,T1.*
FROM  dept T1  LEFT JOIN  emp T2 
ON T1.DEPTNO=T2.DEPTNO
WHERE T2.DEPTNO IS NULL




SELECT
T1.*
,T2.*
FROM emp T1  LEFT JOIN dept T2 ON T1.DEPTNO=T2.DEPTNO
WHERE T2.DEPTNO IS NULL
UNION ALL
SELECT
T2.*
,T1.*
FROM  dept T1  LEFT JOIN  emp T2 
ON T1.DEPTNO=T2.DEPTNO
WHERE T2.DEPTNO IS NULL



表的自连接

需求: 获取员工姓名及其上级领导的姓名及其员工编号

SELECT
T1.EMPNO
,T1.ENAME
,T1.MGR
,T2.ENAME AS MGR_NAME
FROM emp T1 LEFT JOIN emp T2 ON T1.MGR = T2.EMPNO

需求: 求出部门中人数超过4人的员工姓名、编号、部门编号
分析:
	1.获取各部门中的人数
	2.对人数进行比较超过4人保留
	3.求出对应部门中的姓名、编号、部门编号


方式一:
SELECT
EMP_T.ENAME
,EMP_T.EMPNO
,EMP_T.DEPTNO
FROM  emp  EMP_T JOIN 
(
SELECT
DEPTNO
,count(*)
FROM emp 
GROUP BY  DEPTNO 
HAVING COUNT(*) > 4
) DEPTNO_COUNT ON EMP_T.DEPTNO=DEPTNO_COUNT.DEPTNO 

************ 	注意:ON 后的关联条件也可以用来做过滤操作  ************
SELECT
EMP_T.ENAME
,EMP_T.EMPNO
,EMP_T.DEPTNO
FROM emp EMP_T
WHERE EMP_T.DEPTNO IN (
SELECT
DEPTNO
FROM emp 
GROUP BY  DEPTNO 
HAVING COUNT(*) > 4
)


需求:谁的薪资高于20部门员工的薪资
	1.高于20部门中所有人的薪资

SELECT
EMP_T.ENAME
,EMP_T.EMPNO
,EMP_T.DEPTNO
,EMP_T.SAL
FROM emp EMP_T
WHERE EMP_T.SAL > (
SELECT
MAX(SAL)
FROM emp
WHERE DEPTNO = '20'
)



SELECT
EMP_T.ENAME
,EMP_T.EMPNO
,EMP_T.DEPTNO
,EMP_T.SAL
FROM emp EMP_T
WHERE EMP_T.SAL > ALL(
SELECT
SAL 
FROM emp
WHERE DEPTNO = '20'
)

	1.高于30部门中部分人的薪资

SELECT
EMP_T.ENAME
,EMP_T.EMPNO
,EMP_T.DEPTNO
,EMP_T.SAL
FROM emp EMP_T
WHERE EMP_T.SAL > (
SELECT
MIN(SAL)
FROM emp
WHERE DEPTNO = '30'
)


SELECT
EMP_T.ENAME
,EMP_T.EMPNO
,EMP_T.DEPTNO
,EMP_T.SAL
FROM emp EMP_T
WHERE EMP_T.SAL > SOME(
SELECT
SAL
FROM emp
WHERE DEPTNO = '30'
)



表拼接
	方式一: UNION ALL :拼接两张表的所有数据 不做任何处理
	
	方式二: UNION :拼接两张表的数据 会对表中的数据进行去重操作

SELECT
*
FROM emp
WHERE DEPTNO IN ("10","20")
UNION
SELECT
*
FROM emp
WHERE DEPTNO IN ("20","30")


SELECT
*
FROM emp
WHERE DEPTNO IN ("10","20")
UNION  ALL 
SELECT
*
FROM emp
WHERE DEPTNO IN ("20","30")


DML语言
	1.insert into 表名 values();
	2insert into 表名(列名) values(...);
	3insert into 表名(列名) select ....

需求:获取EMP表中员工的部门编号存在于部门表中的数据,并插入至EMP_COPY

TRUNCATE TABLE emp_copy;
insert into emp_copy 
SELECT
T1.*
FROM emp T1 JOIN dept T2 ON T1.DEPTNO = T2.DEPTNO 



-- CREATE TABLE 表名 as 
CREATE TABLE emp_dept AS 
SELECT
T1.ENAME
,T1.EMPNO
,T1.DEPTNO
,T1.SAL
FROM emp T1 JOIN dept T2 ON T1.DEPTNO = T2.DEPTNO 



删除数据
	delete from 表名
	truncate table emp;

delete from 表名 where 条件


需求: 删除emp表中部门编号不在部门表中数据

delete from emp WHERE DEPTNO NOT IN (SELECT DEPTNO FROM dept)


修改操作:
	update 表名 set 列名=value ,列名=value



update score set score = 100

	update 表名 set 列名=value ,列名=value where 条件

GROUP BY CASE WHEN SAL < 1000 THEN "<1000"
WHEN SAL >= 1000 AND SAL < 2000 THEN "1000<=SAL<2000"
WHEN SAL >= 2000 AND SAL < 3000 THEN "2000<=SAL<3000"
WHEN SAL >= 3000 AND SAL < 4000 THEN "3000<=SAL<4000"
ELSE "SAL>=4000" END 


update emp_dept set ENAME = CASE WHEN SAL < 1000 THEN "<1000"
WHEN SAL >= 1000 AND SAL < 2000 THEN "1000<=SAL<2000"
WHEN SAL >= 2000 AND SAL < 3000 THEN "2000<=SAL<3000"
WHEN SAL >= 3000 AND SAL < 4000 THEN "3000<=SAL<4000"
ELSE "SAL>=4000" END 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张天靖09

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值