【数据库】对数据表中有关数据的基本操作(增、删、查【重点】、改)

对数据表中有关数据的基本操作

  • 一、 执行SQL脚本
  • 二、 数据查询【重点】
    • 2.1 数据表的基本结构
    • 2.2 基本查询
      • 2.2.1 查询所有列
      • 2.2.2 查询部分列
      • 2.2.3 对列中的数据进行运算
      • 2.2.4 列的别名
      • 2.2.5 查询结果去重
    • 2.3 排序查询
      • 2.3.1 依据单列进行排序
      • 2.3.2 依据多列进行排序
    • 2.4 条件查询
      • 2.4.1 等值判断(=)
      • 2.4.2 不等值判断(>、<、>=、<=、!=、<>)
      • 2.4.3 逻辑判断(and、or、not)
      • 2.4.4 区间判断(between and)
      • 2.4.5 NULL值判断(IS NULL、IS NOT NULL)
      • 2.4.6 枚举查询(IN (值1,值2,值n....))
      • 2.4.7 模糊查询(_、%)
      • 2.4.8 分支结构查询
    • 2.5 时间查询
      • 2.5.1 获取时间
    • 2.6 字符串查询
      • 2.6.1 字符串函数应用
    • 2.7 聚合函数
      • 2.7.1 求总行数
      • 2.7.2 单列总和
      • 2.7.3 单列平均值
      • 2.7.4 单列最大值
      • 2.7.5 单列最小值
    • 2.8 分组查询
      • 2.8.1 查询各部门的总人数
      • 2.8.2 查询各部门的平均工资
      • 2.8.3 查询各个部门、各个岗位的人数
      • 2.8.4 常见问题
    • 2.9 分组过滤查询
      • 2.9.1 统计部门中的最高工资
    • 2.10 限定查询
      • 2.10.1 查询前5行记录
      • 2.10.2 查询范围记录
    • 2.11 查询总结
      • 2.11.1 SQL语句编写顺序
      • 2.11.2 SQL语句执行顺序
    • 2.12 子查询
      • 2.12.1 子查询(作为条件判断)
      • 2.12.2 子查询(作为枚举查询的条件)
      • 2.12.3 子查询(作为一张表)
    • 2.13 合并查询(了解)
      • 2.13.1 合并两张表的结果(去除重复记录)
      • 2.13.2 合并两张表的结果(保留重复记录)
    • 2.14 表连接查询
      • 2.14.1 内连接查询(INNER JOIN ON)
      • 2.14.2 内连接查询
      • 2.14.3 三表连接查询
      • 2.14.4 多表连接查询
      • 2.14.5 左外连接查询(LEFT JOIN ON)
      • 2.14.6 右外连接查询(RIGHT JOIN ON)
  • 三、 DML操作(增、删、改)
    • 3.1 新增(INSERT)
      • 3.1.1 添加一条信息
    • 3.2 修改(UPDATE)
      • 3.2.1 修改一条信息
    • 3.3 删除(DELETE)
      • 3.3.1 删除一条信息
    • 3.4 清空(TRUNCATE)
      • 3.4.1 清空整张表

一、 执行SQL脚本


创建一个数据库,然后在对象浏览器区,右键->执行SQL脚本->找到文件,打开->点击执行

二、 数据查询【重点】


2.1 数据表的基本结构

关系结构数据库是以表格(Table)进行数据存储,表格由行和列组成

  • 经验:执行查询语句返回的结果集是一张虚拟表

2.2 基本查询

语法:SELECT 列名 FROM 表名

关键字 描述
SELECT 指定要查询的列
FROM 指定要查询的表

2.2.1 查询所有列

语法:SELECT * FROM 表名;
或 SELECT 所有列名称 FROM 表名;

#查询t_employees表中所有员工的所有信息
SELECT * FROM t_employees;
SELECT 所有的列名 FROM t_employees;
  • 经验:生产环境下,优先使用列名查询。*的方式虽然看起来便捷,但实际上需要转换成全列名,效率低,可读性差

2.2.2 查询部分列

语法:SELECT 部分列名称 FROM 表名;

#查询表中的所有员工的编号、姓氏、邮箱
SELECT EMPLOYEE_ID,FIRST_NAME,Email FROM t_employees;

#查询表中所有员工的编号、部门编号
SELECT EMPLOYEE_ID,DEPARTMENT_ID FROM t_employees;

2.2.3 对列中的数据进行运算

语法:SELECT 要计算列名 FROM 表名;

#查询员工表中所有员工的编号、姓名、年薪
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY * 13 FROM t_employees;
算术运算符 描述
+ 列与列之间做加法运算
- 列与列之间做减法运算
* 列与列之间做乘法运算
/ 列与列之间做除法运算
  • 注意: % 在数据库中,代表的是占位符,而并非取余运算符

2.2.4 列的别名

语法:SELECT 列名称 AS ‘列的别名’;

#查询员工表中所有员工的编号、姓名、日薪(列的运算 / 22),列名均为中文
SELECT EMPLOYEE_ID AS '编号',FIRST_NAME AS '姓',LAST_NAME AS '名',SALARY / 22 AS'日薪' FROM t_employees;
#起别名,没有对原表的列名发生影响

2.2.5 查询结果去重

语法:SELECT DISTINCT 列名 FROM表名;

#查询员工表中,所有经理的ID编号
SELECT DISTINCT MANAGER_ID AS '经理编号' FROM t_employees;

#查询员工表中,所有的工资 (去掉重复的)
SELECT DISTINCT SALARY FROM t_employees;

2.3 排序查询

语法: SELECT 列名 FROM 表名 ORDER BY 排序列名 [排序规则]

排序规则 描述
ASC 做升序排序
DESC 做降序排序

2.3.1 依据单列进行排序

语法:
SELECT 列名1, 列名2, 列名3 FROM 表名 ORDER BY 列名1 ASC;//升序
SELECT 列名1, 列名2, 列名3 FROM 表名 ORDER BY 列名2 DESC;//降序

#查询员工的编号,名字,薪资,按照工资进行升序排序
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees ORDER BY salary ASC;

#查询员工的编号,名字,薪资,按照姓名进行升序排序
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees ORDER BY FIRST_NAME ASC;

#查询员工的编号,名字,薪资,按照工资进行降序排序
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees ORDER BY salary DESC;
  • 经验:当进行升序排序时,排序规则可以不显示声明。默认为升序排序规则

2.3.2 依据多列进行排序

语法:
#若列名1相等,按照列名2降序排序
SELECT 列名1, 列名2, 列名3 FROM 表名 ORDER BY 列名1 ASC,列名2 DESC;

#查询员工编号,名字,薪资,按照工资进行升序排序,如果工资相等,按照编号降序排序
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees
ORDER BY SALARY ASC,EMPLOYEE_ID DESC

#查询员工编号,名字,薪资,按照工资进行升序排序,如果工资相等,按照姓名降序排序
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees
ORDER BY SALARY ASC,FIRST_NAME DESC

2.4 条件查询

语法: SELECT 列名 FROM 表名 WHERE 条件

关键字 描述
WHERE 在查询结果中,筛选符合条件的查询结果。条件为布尔表达式

2.4.1 等值判断(=)

语法:SELECT 列名 FROM 表名 WHERE 列名=条件;

#查询工资为2500的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees WHERE salary = 2500;

#查询姓为Steven的
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees WHERE FIRST_NAME='Steven';
  • 注意:与Java不同(==),MySQL中等值判断用 =

2.4.2 不等值判断(>、<、>=、<=、!=、<>)

语法:SELECT 列名 FROM 表名 WHERE 列名!=条件(<>同理);

#查询员工工资大于6000的员工的信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees WHERE salary>=6000;
  
#查询员工工资不等于2500的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees WHERE salary<>2500;(!=同理) 

2.4.3 逻辑判断(and、or、not)

语法:
#满足条件1和满足条件2,条件1和条件2互换后结果不变。
SELECT 列名 FROM 表名 WHERE 列名=条件1 AND 列名=条件2;

#先满足条件1再满足条件2,条件1和条件2互换后结果会变化。
SELECT 列名 FROM 表名 WHERE 列名=条件1 OR 列名=条件2;

SELECT 列名 FROM 表名 WHERE NOT 列名=条件;

#查询员工工资在6000~10000的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE salary>=6000 AND salary<=10000;

#查询工资是10000的或者是9000的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE salary =10000 OR salary = 9000;

#查询除了工资是10000的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE NOT salary =10000;

2.4.4 区间判断(between and)

语法:
#区间判断 包含区间边界的两个值
SELECT 列名 FROM 表名 WHERE 列名 BETWEEN 条件1 AND 条件2;

SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE salary BETWEEN 6000 AND 10000;
  • 注意:between and要遵循 between 小值 and 大值;

2.4.5 NULL值判断(IS NULL、IS NOT NULL)

语法:
SELECT 列名 FROM 表名 WHERE 列名 IS NULL;
SELECT 列名 FROM 表名 WHERE 列名 IS NOT NULL;

- IS NULL
  - 列名 IS NULL
- IS NOT NULL
  - 列名 IS NOT NULL

#查询出 没有经理编号的员工 IS NULL
SELECT EMPLOYEE_ID,FIRST_NAME,MANAGER_ID FROM t_employees WHERE MANAGER_ID IS NULL;

#查询出 没有经理编号以外的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,MANAGER_ID FROM t_employees WHERE MANAGER_ID IS NOT NULL;

#查询出 没有经理编号以外的员工信息(此处NOT为取反。两个结果)
SELECT EMPLOYEE_ID,FIRST_NAME,MANAGER_ID FROM t_employees WHERE NOT MANAGER_ID IS NULL;

2.4.6 枚举查询(IN (值1,值2,值n…))

语法:SELECT 列名 FROM 表名 WHERE 列名 枚举查询 IN (值1,值2,值n…)

#查询部门编号为70,80,90的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,DEPARTMENT_ID FROM t_employees
WHERE DEPARTMENT_ID IN(70,80,90);

#枚举查询  查询经理编号为 124 和100的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,MANAGER_ID FROM t_employees
WHERE MANAGER_ID IN(124,100);

2.4.7 模糊查询(_、%)

语法:SELECT 列名 FROM 表名 WHERE 列名 LIKE ’ S_% ’

- LIKE
	- LIKE _(单个任意字符)
	- 列名 LIKE 'S_'
- LIKE %(任意长度的任意字符   0~n个)
	- 列名 LIKE 'S%'

#模糊查询,查询姓氏以S开头且长度为6的员工信息 
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME FROM t_employees   WHERE FIRST_NAME LIKE 'S_____';

#模糊查询,查询姓氏以S开头任意长度的所有员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME FROM t_employees  WHERE FIRST_NAME LIKE 'S%';

2.4.8 分支结构查询

语法:
SELECT 列名
CASE WHEN 条件 THEN 结果
ELSE 结果
END
FROM 表名

CASE
	WHEN 条件1 THEN 结果1
	WHEN 条件2 THEN 结果2
	WHEN 条件3 THEN 结果3
	WHEN 条件4 THEN 结果4
	ELSE 结果
END 

#查询员工信息(编号、名字、薪资、薪资级别<条件表达式>)
SELECT EMPLOYEE_ID,FIRST_NAME,salary,
	 CASE 
	    WHEN salary >=10000 THEN 'A'
	    WHEN salary >=8000 AND salary<10000 THEN 'B'
	    WHEN salary >=6000 AND salary<8000 THEN 'C'
	    WHEN salary >=4000 AND salary <6000 THEN 'D'
	    ELSE 'E'
	 END AS '薪资级别'
FROM t_employees;
  • 注意:通过使用CASE END进行条件判断,每条数据对应生成一个值,case分支结构产生一个新的列

  • 经验:类似Java中的分支结构

2.5 时间查询

语法: SELECT 时间函数([参数列表]);

时间函数 描述
SYSDATE() 当前系统时间(年、月、日、时、分、秒)
CURDATE() 获得当前日期
CURTIME() 获得当前时间
WEEK(DATE) 获得指定日期是一年中第几周
YEAR(DATE) 获得指定日期的年份
MONTH(DATE) 获得指定日期的月份
DAY(DATE) 获得指定日期的天
HOUR(DATE) 获得指定时间的小时值
MINUTE(DATE) 获得指定时间的分钟值
SECOND(DATE) 获得指定日期的秒值
DATEDIFF(DATE1,DATE2) 获得DATE1和DATE2之间相隔的天数
ADDDATE(DATE,N) 在指定日期加上N天后的日期
  • 经验:执行时间函数查询,会生成一张虚拟表(一行一列)

2.5.1 获取时间

#1.当前系统时间
SELECT SYSDATE();

#2.获得当前日期
SELECT CURDATE();

#3.获得当前时间
SELECT CURTIME();

#4.获得指定日期在一年中为第几周
SELECT WEEK(CURDATE());

#5.获取指定日期中的年份
SELECT YEAR(CURDATE());

#6.获取指定日期中的月份
SELECT MONTH(CURDATE());

#7.获取指定日期中的日
SELECT DAY(CURDATE());

#8.获取指定日期中的时
SELECT HOUR(SYSDATE());

#9.获取指定日期中的分
SELECT MINUTE(SYSDATE());

#10.获取指定日期中的秒
SELECT SECOND(SYSDATE());

#11.获取Date1和Date2之间相隔的天数
SELECT DATEDIFF(SYSDATE(),'2019-3-26');

#12.在指定日期之上加N天后的日期
SELECT ADDDATE(SYSDATE(),6);

2.6 字符串查询

语法:SELECT 字符串函数([参数列表]);

字符串函数 说明
CONCAT(str1,str2,str3…) 将多个字符串进行拼接
INSERT(str,pos,len,newStr) 将str中指定pos位置开始len长度的内容替换为newStr
LOWER(str) 将指定字符串转换为小写
UPPER(str) 将指定字符串转换为大写
SUBSTRING(str,pos,len) 将str字符串指定pos位置开始截取len个内容
  • 经验:执行字符串函数,产生一张虚拟表,(一行一列)

2.6.1 字符串函数应用

#1.连接将多个字符串连接在一起
SELECT CONCAT('My','S','QL');

#2.插入替换(下标从1开始)
SELECT INSERT('这是MySQL数据库',3,5,'Oracle');

#3.转小写
SELECT LOWER('MYSQL');

#4.转大写
SELECT UPPER('mysql');

#5.截取
SELECT SUBSTRING('张阔真的太帅了!我的天呀',3,4);

2.7 聚合函数

语法:SELECT 聚合函数(列名) FROM 表名;

聚合函数 说明
COUNT() 求总行数
SUM() 求单列中所有行的总和
AVG() 求单列中所有行的平均值
MAX() 求单列中所有行的最大值
MIN() 求单列中所有行的最小值
  • 经验:聚合函数式对多条数据的单列进行统计,返回统计后的一行结果

2.7.1 求总行数

#1.查询员工一共多少人
SELECT COUNT(EMPLOYEE_ID) AS '员工总数' FROM t_employees;
SELECT COUNT(MANAGER_ID) AS '经理总数' FROM t_employees;
SELECT COUNT(*) FROM t_employees;
  • 注意:聚合函数中,自动忽略null值,不进行统计。

2.7.2 单列总和

#2.查询员工每个月工资的总和
SELECT SUM(salary) FROM t_employees;

2.7.3 单列平均值

#3.查询员工每个月工资的平均工资
SELECT AVG(salary) FROM t_employees;

2.7.4 单列最大值

#4.查询月薪最高的
SELECT MAX(salary) FROM t_employees;

2.7.5 单列最小值

#5.查询月薪最低的
SELECT MIN(salary) FROM t_employees;

2.8 分组查询

语法: SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据(列名)

关键字 说明
GROUP BY 分组依据,如果有WHERE,在WHERE之后生效

2.8.1 查询各部门的总人数

#思路:
#1.先按照部门编号分组(分组依据是:department_id)
#2.再针对各部门的人数进行统计(count)
SELECT DEPARTMENT_ID,COUNT(EMPLOYEE_ID)
FROM t_employees
GROUP BY DEPARTMENT_ID;

2.8.2 查询各部门的平均工资

#思路:
#1.先按照部门编号分组(分组依据是:department_id)
#2.再针对各部门的工资进行平均计算(AVG())
SELECT DEPARTMENT_ID,AVG(salary) AS '平均工资',COUNT(EMPLOYEE_ID) AS'人数'
FROM t_employees
GROUP BY DEPARTMENT_ID;

2.8.3 查询各个部门、各个岗位的人数

#思路
#1.按照部门编号进行分组(department_id)
#2.按照岗位名称进行分组(job_id)
#3.针对每个部门中各个岗位的人数进行统计
SELECT DEPARTMENT_ID AS'部门',JOB_ID AS'岗位',COUNT(EMPLOYEE_ID) AS'人数'
FROM t_employees
GROUP BY DEPARTMENT_ID,JOB_ID;

2.8.4 常见问题

#查询各个部门的id、总人数、first_name
SELECT DEPARTMENT_ID,COUNT(EMPLOYEE_ID),FIRST_NAME
FROM t_employees
GROUP BY DEPARTMENT_ID;
  • 注意:分组查询中,select显示的列只能是分组依据的列或者是聚合函数列,不能出现其他列。

2.9 分组过滤查询

语法: SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据(列名) HAVING 过滤规则

关键字 说明
HAVING 过滤规则是对分组后的数据进行过滤

2.9.1 统计部门中的最高工资

#统计部门编号为60、70、80的部门最高工资
#思路:
#1.确定分组依据  department_id
#2.对分组后的数据进行过滤  过滤规则为 60 70 80部门编号
#3.分组过滤后的数据,做max()函数处理
SELECT DEPARTMENT_ID,MAX(salary)
FROM t_employees
GROUP BY DEPARTMENT_ID
HAVING DEPARTMENT_ID IN (60,70,80);
#HAVING是在分组之后的数据进行过滤

2.10 限定查询

语法:SELECT 列名 FROM 表名 LIMIT 起始行,查询行

关键字 描述
LIMIT offset_start,row_count 限定查询结果的起始行和总行数

2.10.1 查询前5行记录

#查询表中前五名员工的信息
SELECT * FROM t_employees LIMIT 0,5;
  • 注意:起始行是从0开始,代表了第一行。第二个参数代表的是从指定行开始查询几行

2.10.2 查询范围记录

#查询表中的第二页数据和第三页数据
SELECT * FROM t_employees LIMIT 5,5;

SELECT * FROM t_employees LIMIT 10,5;
  • 经验:在分页的应用场景中,起始行是跟随页数变化的,但是一页显示的条数是不变得

2.11 查询总结


2.11.1 SQL语句编写顺序

语法:SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组 HAVING 过滤条件 ORDER BY 排序列 LIMIT 起始行,总条数

2.11.2 SQL语句执行顺序

#1.执行 FROM : 指定数据来源表
#2.执行WHERE : 对查询的数据做第一次过滤
#3.执行GROUP BY :分组
#4.执行HAVING : 对分组后的数据做第二次过滤
#5.执行SELECT : 查询各个字段的值
#6.执行ORDER BY : 排序
#7.执行LIMIT : 限定查询结果

2.12 子查询

2.12.1 子查询(作为条件判断)

语法:SELECT 列名 FROM 表名 WHERE 条件(子查询结果)

查询工资大于Bruce的员工信息

#思路
#1.先查询到Bruce的工资(一行一列)
SELECT SALARY FROM t_employees WHERE first_name = 'Bruce';#6000

#2.查询大于Bruce工资的员工信息
SELECT * FROM t_employees WHERE SALARY > 6000;

#3.将1 、2 整合为一条语句
SELECT * FROM t_employees WHERE salary >(SELECT SALARY FROM t_employees WHERE first_name = 'Bruce')
  • 注意:将子查询"一行一列"的结果作为外部查询的条件。做第二次查询
  • 子查询得到的是一行一列的结果才能作为外部条件的等值或不等值判断条件

2.12.2 子查询(作为枚举查询的条件)

语法:SELECT 列名 FROM 表名 WHERE 列名 IN(子查询结果)

查询与King同一部门员工信息

#思路
#1.查询King所在的部门编号(多行单列)
SELECT DEPARTMENT_ID FROM t_employees WHERE last_name='King';

#2.将 80、90作为枚举查询的条件
SELECT EMPLOYEE_ID,FIRST_NAME,salary 
FROM t_employees
WHERE DEPARTMENT_ID IN (80,90)

#3.整合
SELECT EMPLOYEE_ID,FIRST_NAME,salary 
FROM t_employees
WHERE DEPARTMENT_ID
IN 
(SELECT DEPARTMENT_ID FROM t_employees WHERE last_name='King')
  • 经验:将子查询得到的"多行一列"的结果作为外部查询的枚举查询条件,做第二次查询

查询工资高于60部门的所有人的信息

#1.查询部门编号为60的工资
SELECT salary FROM t_employees WHERE DEPARTMENT_ID = 60;

#2.查询高于60部门所有人的工资的员工信息(高于所有人!)
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees 
WHERE salary > ALL
(SELECT salary FROM t_employees WHERE DEPARTMENT_ID = 60);

#3.查询高于60部门所有人的工资的员工信息(高于部分人!)
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees 
WHERE salary > ANY
(SELECT salary FROM t_employees WHERE DEPARTMENT_ID = 60);
  • 注意:当子查询结果集为多行单列时,也可以使用ALL匹配所有或者ANY匹配部分

2.12.3 子查询(作为一张表)

语法:SELECT 列名 FROM (子查询结果集) WHERE 条件;

查询表中部分列的信息,获得工资大于15000的

#思路
#1.先查询部分列的信息作为一张临时表
 SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees;
 
#2.将子查询得到的临时表作为外部查询的表
SELECT EMPLOYEE_ID ,FIRST_NAME ,salary
FROM 
(SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees)AS temp
WHERE salary > 15000;
  • 经验:将子查询得到的"多行多列"的结果作为外部查询的一张临时表,做第二次查询

2.13 合并查询(了解)

语法:

  • SELECT 列名 FROM 表名 1 UNION SELECT 列名 FROM 表名2
  • SELECT 列名 FROM 表名 1 UNION ALL SELECT 列名 FROM 表名2

2.13.1 合并两张表的结果(去除重复记录)

#合并 t1 和t2两张表的结果。纵向合并,去除重复的记录
SELECT * FROM t1
UNION
SELECT * FROM t2

2.13.2 合并两张表的结果(保留重复记录)

#合并结果集,不去除重复记录
SELECT * FROM t1
UNION ALL
SELECT * FROM t2
  • 注意:合并的两个结果集,列数必须相同,列类型、列名可以不同

2.14 表连接查询

语法:SELECT 列名 FROM 表1 连接方式 表2 ON 连接条件;

2.14.1 内连接查询(INNER JOIN ON)

#查询所有有部门的员工信息,显示部门名称(不包括没有部门的员工)   SQL标准
SELECT * FROM t_employees
INNER JOIN t_departments
ON t_employees.`DEPARTMENT_ID` = t_departments.`DEPARTMENT_ID`;

#MYSQL标准
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME FROM 
t_employees,t_departments
 WHERE t_employees.`DEPARTMENT_ID` = t_departments.`DEPARTMENT_ID`;
 
#1.两张表连接查询,要有关联条件。但是关联条件的列重复了。需要明确查询的是哪个表的列
#2.表名比较长,表名多次重复出现。容易混淆.可以给别名
SELECT EMPLOYEE_ID,FIRST_NAME,d.DEPARTMENT_ID,DEPARTMENT_NAME FROM t_employees AS e
INNER JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`;
  • 经验:在MySQL中,可以使用第二种方式,不符合SQL标准
  • 第一种,属于SQL标准,与其他关系型数据库通用

2.14.2 内连接查询

#查询所有岗位的员工信息,显示岗位名称
SELECT EMPLOYEE_ID,FIRST_NAME,JOB_TITLE
FROM t_employees AS e
INNER JOIN t_jobs AS j
ON e.`JOB_ID` = j.`JOB_ID`;

2.14.3 三表连接查询

#查询所有员工工号、名字、部门名称、部门所在城市的名称
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME,CITY
FROM t_employees AS e
INNER JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`
INNER JOIN t_locations AS l
ON d.`LOCATION_ID` = l.`LOCATION_ID`;

2.14.4 多表连接查询

#查询所有员工工号、名字、部门名称、部门城市名称、所在城市的国家
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME,CITY,COUNTRY_NAME
FROM t_employees AS e
INNER JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`
INNER JOIN t_locations AS l
ON d.`LOCATION_ID` = l.`LOCATION_ID`
INNER JOIN t_countries AS c
ON l.`COUNTRY_ID` = c.`COUNTRY_ID`;
  • 经验:多表查询时,要明确哪一张表和连接的表有关系。

2.14.5 左外连接查询(LEFT JOIN ON)

#查询所有员工信息,以及对应的部门名称(没有部门的员工,也在查询结果中,但是部门名称以NULL填充)
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME 
FROM t_employees AS e
LEFT JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`;
  • 注意:左外连接,是以左表为主表,依次向右表匹配,匹配到,则返回正确结果
  • 匹配不到,则返回NULL值,填充显示

2.14.6 右外连接查询(RIGHT JOIN ON)

#查询所有部门信息,以及部门中的员工信息
#(没有员工的部门,也在查询结果中,员工信息以NULL填充)
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME 
FROM t_employees AS e
RIGHT JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`;
  • 注意:右外连接,是以右表为主表,依次向左匹配,匹配到,返回正确结果
  • 匹配不到,则返回NULL填充

三、 DML操作(增、删、改)


3.1 新增(INSERT)

INSERT INTO 表名 (列1,列2,列3…) VALUES(值1,值2,值3…)

3.1.1 添加一条信息

#添加一条员工信息
INSERT INTO t_employees
(EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID)
VALUES('209','Ya','Suo','[email protected]','515.123.6666','2010-03-18','Center',900,NULL,'123','50')

#多行添加,在值列表外边追加,再写一个值列表
,('208','Ya','Suo','[email protected]','515.123.6666','2010-03-18','Center',900,NULL,'123','50');

#添加一条城市信息
INSERT INTO t_countries(COUNTRY_ID,COUNTRY_NAME)VALUES('AL','阿尔巴尼亚');
SELECT * FROM t_departments;

#添加一条部门信息
INSERT INTO t_departments(DEPARTMENT_ID,DEPARTMENT_NAME,MANAGER_ID,LOCATION_ID)
VALUES('280','Teach','111','1500')
  • 注意:表名后的列名列表以及VALUES里的值列表要一一对应(个数、顺序、类型)

3.2 修改(UPDATE)

UPDATE 表名 SET 列名1=新值1,列名2 = 新值2… WHERE 条件

3.2.1 修改一条信息

#修改员工编号为208的员工名字为TOM Jackson
UPDATE t_employees
SET FIRST_NAME='TOM', LAST_NAME = 'Jackson'
WHERE EMPLOYEE_ID = '208';
  • 注意:SET后跟着多个列 = 值,绝大多数情况下,都要加WHERE条件,指定修改的目标,否则为整表更新

3.3 删除(DELETE)

DELETE FROM 表名 WHERE 条件

3.3.1 删除一条信息

#删除一条员工,编号为207的
DELETE FROM t_employees
WHERE EMPLOYEE_ID = '207'
  • 注意:删除时,如若不加WHERE条件,删除的是整张表的数据。结构不变

3.4 清空(TRUNCATE)

TRUNCATE TABLE 表名;

3.4.1 清空整张表

#清空t2整张表
TRUNCATE TABLE t2;
  • 注意:TRUNCATE与DELETE不加WHERE删除整张表数据不同:
  • DELETE仅仅删除数据,结构不变。
  • TRUNCATE是把整张表销毁,再按照原表的格式、结构创建一张新表

你可能感兴趣的:(【数据库】对数据表中有关数据的基本操作(增、删、查【重点】、改))