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 列表示 表中对应能否存储NULL值
Default 列表示 对应列默认值
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 表示有符号,取值范围:-2147483648 ~ 2147483647
int unsigned 表示无符号,取值范围:0 ~ 4294967295
int(5)zerofill 仅用于显示,当不满足5位时,按照左边补0,例如:00002;满足时,正常显示。
注意:
① 可以保存带符号数据
② UNSIGNED 表示不能存储符号,但是可以增加一倍存储长度
③ int(m) ZEROFILL 表示在当前值之前填充0 总长度为m
TINYINT类型:
应用场景:在存储维度表时,有一些比较短的标记数,可以使用TINYINT类型
有符号,取值范围:-128 ~ 127.
无符号,取值范围:0 ~ 255
bigint类型:
有符号,取值范围:-9223372036854775808 ~ 9223372036854775807
无符号,取值范围:0 ~ 18446744073709551615
存储较大数值时可用,一般用于存储时间戳
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为非严格模式下,那么插入数据超过其范围,会进行截取插入
datetime与timestamp类型
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(条件判断(返回的为TRUE或FALSE),如果为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-2000 和 2000到 3000 ... 统计其人数
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();
2、insert into 表名(列名) values(值...);
3、insert 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
MySQL语法
于 2022-08-07 21:34:14 首次发布