通常执行对数据库的"增、删、改 、查",简称C(Create)、R(Read)、U(Update)、D(Delete);
6.1.1 查询数据库
- 查看MySQL中所有数据库:R
SHOW DATABASES; --显示当前MySQL中所有的数据库
6.1.2 创建数据库
- 创建自定义数据库:C
create database 数据库名称;
CREATE DATABASE kaka; --创建了名为kaka的数据库
CREATE DATABASE kaka CHARACTER SET gbk;–创建数据库并设置其默认字符集为GBK
CREATE DATABASE IF NOT EXISTS kaka default character set gbk;–如果kaka不存在,则创建并指定字符集,反之,不创建
6.1.3 删除数据库
- 删除数据库:D
drop databse 数据库名称;
DROP DATABASE kaka;–删除kaka数据库
6.1.4 修改数据库
- 修改数据库:U
alter database 数据名字 default character set 字符集;
ALTER DATABASE kaka CHARACTER SET UTF8;–修改数据库的字符集为UTF-8
6.1.5 数据库的其他操作
- 查看数据库创建信息
show create database 数据库名称
SHOW CREATE DATABASE kaka;–查看创建数据库时的基本信息
- 使用数据库
use 数据库名称
USE kaka;–当前环境下,操作kaka数据库
- 查看当前使用的数据库
select database();
SELECT DATABASE();–查看当前使用的数据库
MySQL大致可以分为三类:数值、日期/时间、字符串(字符)类型。对于我们建表,约束列的类型有很大的帮助;
- 数值类型
INT:4个字节、整数值;
DOUBLE(M,D):8个字节、M表示长度,D表示小数位数,受M和D的约束、双精度浮点值;
DECIMAL(M,D):保存精确值 、依赖M和D、小数值;
- 日期类型
DATE:格式(YYYY-MM-DD)日期值
TIME:格式(HH:MM:SS)时间值
YEAR:格式(YYYY)年分值
TIMESTAMP:时间戳,格式(YYYY-MM–DD HH:MM:SS)混合日期时间值
- 字符串类型
CHAR:指定长字符串 CHAR(10) 10个字符
VARCHAR:可变长字符串 VARCHAR(10) 10个字符
BLOB:二进制形式的长文本数据
TEXT:长文本
6.3.1 使用数据库
创建表之前,先去选择给那个一数据库中创建表
- use 数据库名称;
use kaka; --使用kaka数据库
6.3.2 查询该数据库中的表®
- show tables; 查询当前数据库中有多个张表
show tables;–查询当前数据库中有多个张表
6.3.3 表的创建©
- 创建格式:
create table 表名 (
列名 数据类型 [约束],
列名 数据类型 [约束],
…
列名 数据类型 [约束] //最后一列的创建,末尾不需要加逗号
)[charset=utf8]; //根据需要指定表的字符编码集
create table employ(
id int,
name varchar(20),
gender varchar(2),
birthday date,
email varchar(10),
remark varchar(50)
);
6.3.4 查询表的结构
- desc 表名:查询表结构
desc employ;–查询employ表结构
6.3.5 修改表(U)
6.3.5.1 给表中添加一个列字段
- alter table 表名 add 新的列的名称 类型;
alter table employ add age int; --给employ表添加一个int型的年龄列字段
6.3.5.2 修改表中的字段名称
- alter table 表名 change 旧列名 列名 数据类型;
alter table employ change name username varchar(20)NOT NULL; --将employ表中的name改为username
- 改变列名时,在给定新列名的同时,要指定列的数据类型和约束;
6.3.5.3 修改表中的字段类型
- alter table 表名 modify 类名 数据类型;
alter table employ modify email varchar(50) NOT NULL; – 将employ表中的email由varchar(10)改为varchar(50)
- 修改表中的某列时,需要写全列的名字、数据类型、约束;
6.3.5.4 修改表名字
- alter table 原表名 rename to 新表名;
- rename table 原表名 to 新表名;
alter table employ rename to employee; --将employ改为employee
6.3.5.5 删除表中的字段
- alter table 表名 drop 字段名称;
alter table employ drop remark; --删除employ表中的remark字段
6.3.6 删除表(D)
- drop table 表名;
drop table employ --删除employ表
================================================================================
用于对表中的记录进行增、删、改操作;
7.1.1 插入记录
INSERT INTO 表名 (列1,列2,列3…) VALUES(值1,值2,值3…)
- INSERT INTO 表名:表示往哪张表中添加数据
- 列1,列2,列3…:要给哪些字段设置值
- VALUES (值 1, 值 2, …):设置具体的值
–新增一条数据
INSERT INTO employ (id,username,gender,birthday,email,age)
VALUES(1001,‘kaka’,‘m’,‘1999-03-03’,‘213456@qq.com’,23);
–增加两条数据
–多行添加,在值列表外边追加,再写一个值列表
INSERT INTO t_departments(DEPARTMENT_ID,DEPARTMENT_NAME,MANAGER_ID,LOCATION_ID)
VALUES (‘2500’,‘Teach’,‘111’,‘6000’),(‘25000’,‘Teach’,‘111’,‘6000’);
注:
-
表名后的列名列表以及VALUES里的值列表要一一对应(个数、顺序、类型);
-
没有添加数据的字段会使用 NULL;
-
在DOS命令窗口中操作不能写中文,会报错或者是出现乱码;
-
数据的大小应在列的规定范围内;
-
字符和日期型数据应包含在单引号中;
7.1.2 蠕虫赋值
将一张已经存在的表中的数据复制到另一张表中
- INSERT INTO 表 名 1 SELECT * FROM 表 名 2;:将表名 2 中的所有的列复制到表名 1 中
- INSERT INTO 表 名 1( 列 1, 列 2) SELECT 列 1, 列 2 FROM student;:只复制部分列
UPDATE 表名 SET 列名1=新值1,列名2 = 新值2… WHERE 条件
- UPDATE: 需要更新的表名
- SET: 修改的列值
- WHERE: 符合条件的记录才更新
–不加条件,默认修改整张表
UPDATE t1 SET a = 3,b = ‘kk’;
SELECT * FROM t1;
–加条件
UPDATE t1 SET a = 34,b = ‘kk’ WHERE id = 3;
SELECT * FROM t1;
–修改员工表
SELECT * FROM t_employees;
UPDATE t_employees
SET FIRST_NAME = ‘Lex’ ,LAST_NAME = ‘De Haan’
WHERE EMPLOYEE_ID = 103;
- SET后跟着多个列 = 值;大多数情况下,要加WHERE条件,指定修改的目标,否则为整表更新
DELETE FROM 表名 WHERE 条件
- 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除;
- 以在 WHERE 子句中指定任何条件
–不加条件全部删除
SELECT * FROM t1;
DELETE FROM t1;
–加条件,删除员工号位103的员工
SELECT * FROM t_employees;
DELETE FROM t_employees
WHERE EMPLOYEE_ID = ‘103’ ;
–删除多个
DELETE FROM t_employees
WHERE EMPLOYEE_ID = ‘103’ OR EMPLOYEE_ID = ‘104’;
- 删除时,如若不加WHERE条件,删除的是整张表的数据;结构不变;
- TRUNCATE TABLE 表名;
–清空t1整张表
TRUNCATE TABLE t1;
-
TRUNCATE与DELETE不加WHERE删除整张表数据不同:
-
DELETE仅仅删除数据,结构不变;
-
TRUNCATE是把整张表销毁,再按照原表的格式和结构创建一张新表;
================================================================================
MySQL数据库是以表格(Table)进行数据存储,表格由行和列组成所有执行的查询语句返回的结果是一张虚拟表;查询不会对数据库中的数据进行修改,只是一种显示数据的方式;
语法:SELECT 列名 FROM 表名
- SELECT:要查询的列
- FROM :要查询的表
8.1.1 查询所有列
–查询t_employees表中所有员工的所有信息
SELECT * FROM t_employees;
- 优先使用
8.1.2 查询部分列
–查询表中的所有员工的编号、姓氏、邮箱
SELECT EMPLOYEE_ID,FIRST_NAME,Email FROM t_employees;
8.1.3 对列中的数据进行运算
–查询员工表的编号、姓名、日薪
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY / 22 FROM t_employees;
- “%” 在数据库中,代表的是占位符,而并非取余运算符
8.1.4 列的别名
没有对原表的列名发生影响
- 列 AS ‘列名’
–查询员工表的编号、姓名、日薪,列名为中文
SELECT EMPLOYEE_ID AS ‘编号’,FIRST_NAME AS ‘姓’,LAST_NAME AS ‘名’,SALARY / 22 AS ‘日薪’ FROM t_employees;
8.1.5 查询结果去重
- distinct 列名
–去重 查询员工表中所有的工资并去掉重复
SELECT DISTINCT SALARY FROM t_employees;
语法: SELECT 列名 FROM 表名 ORDER BY 排序列名
- ASC : 升序排序(默认为升序排序)
- DESC : 降序排序
8.2.1 依据单列进行排序
–查询员工编号、名字、薪资、按照工资升序排序
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 DESC;
8.2.2 依据多列进行排序
–查询员工编号,名字,薪资;按照工资进行升序排序,如果工资相等,按照编号降序
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees
ORDER BY SALARY ASC , EMPLOYEE_ID DESC;
语法: SELECT 列名 FROM 表名 WHERE 条件
- WHERE : 在查询结果中,筛选符合条件的查询结果,条件为布尔表达式;
8.3.1 等值判断(=)
–查询姓为James的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees WHERE FIRST_NAME = ‘James’;
- MySQL中等值判断用 =
8.3.2 不等值判断(>、<、>=、<=、!=、<>)
–查询员工工资不等于2500的员工的信息
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees
WHERE SALARY <> 2500;
8.3.3 逻辑判断(and、or、not)
–查询员工工资在6000~10000的员工的信息
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees
WHERE SALARY >= 6000 AND SALARY <= 10000;
–查询员工工资是13256或者9000的员工的信息
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees
WHERE SALARY = 13256 OR SALARY = 9000;
–查询员工工资除了5000的员工的信息
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees
WHERE NOT SALARY = 5000;
8.3.4 区间判断(between and)
–区间判断 包含区间边界的两个值
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees
WHERE NOT SALARY BETWEEN 6000 AND 10000;
- between and要遵循 between 小值 and 大值;
8.3.5 NULL值判断(IS NULL,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;
8.3.6 枚举查询(IN(value1,value2,value3…))
–查询部门编号为 70、80、90的员工信息
–方式一:
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,DEPARTMENT_ID FROM t_employees
WHERE DEPARTMENT_ID = 70 OR DEPARTMENT_ID = 80 OR DEPARTMENT_ID = 90;
–方式二:
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,DEPARTMENT_ID FROM t_employees
WHERE DEPARTMENT_ID IN(70,80,90);
8.3.7 模糊查询(_、%)
LIKE
- LIKE (单个任意字符)
* 列名 LIKE ‘S\_’
- LIKE %(任意长度的任意字符 0~n个)
* 列名 LIKE ‘S%’
–模糊查询 查询名以K开头长度为5个字符数的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME FROM t_employees
WHERE LAST_NAME LIKE ‘K____’;
–查询名以K开头所有的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME FROM t_employees
WHERE LAST_NAME LIKE ‘K%’;
–查询名以包含K所有的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME FROM t_employees
WHERE LAST_NAME LIKE ‘%K%’;
–查询名以包含第三个是K所有的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME FROM t_employees
WHERE LAST_NAME LIKE ‘__K%’;
8.3.8 分支结构查询
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;
–管理部门
SELECT MANAGER_ID,
CASE
WHEN MANAGER_ID = 100 THEN ‘第一’
WHEN MANAGER_ID = 102 THEN ‘第2’
WHEN MANAGER_ID = 103 THEN ‘第3’
END AS ‘部门’
FROM t_employees;
-
通过使用CASE END进行条件判断,每条数据对应生成一个值()
-
case分支结构产生一个新的列
语法: SELECT 时间函数(参数列表);
–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(CURDATE());
–9.获取指定日期的分
SELECT MINUTE(CURDATE());
–10.获取指定日期的秒
SELECT SECOND(CURDATE());
–11.获取date1和date2之间相隔的天数
SELECT DATEDIFF(SYSDATE(),2019-3-26);
–12.获取指定日期之上加上N天后的日期
SELECT ADDDATE(SYSDATE(),6);
- 执行时间函数查询,会生成一张虚拟表(一行一列)
语法:SELECT 字符串函数(参数列表);
–1.连接 多个字符串连接在一起
SELECT COUNT(‘My’,‘S’,‘QL’);
–2.插入替换(下标是从1开始)
–将MYSQL数据库中的M开始的五个字符替换为Oracle
SELECT INSERT(‘MySQL数据库’,1,5,‘Oracle’);
–3.转小写
SELECT LOWER(‘MYSQL’);
–4.转大写
SELECT UPPER(‘mysql’);
–5.截取 (从3开始截取4个内容)
SELECT SUBSTRING(‘发生的范围规范化’,3,4);
- 执行字符串函数,产生一张虚拟表,(一行一列)
语法:SELECT 聚合函数(列名) FROM 表名;
–1.查询员工一共多少人 总行
SELECT COUNT(EMPLOYEE_ID) AS ‘员工总数’ FROM t_employees;
SELECT COUNT(MANAGER_ID) AS ‘经理总数’ FROM t_employees;
SELECT COUNT(*) FROM t_employees;
–2.查询工资总和总和
SELECT SUM(SALARY) FROM t_employees;
–3.查询每个员工的每月平均工资
SELECT AVG(salary ) FROM t_employees;
–4.查询月薪最高的
SELECT MAX(SALARY) FROM t_employees;
–5.查询月薪最低的
SELECT MIN(SALARY) FROM t_employees;
-
聚合函数会自动null值,不进行统计
-
聚合函数式对多条数据的单列进行统计,返回统计后的一行结果
语法: SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据(列名)
- GROUP BY : 分组依据;如果有WHERE,在WHERE之后生效
–查询各部门的总人数
SELECT DEPARTMENT_ID,COUNT(EMPLOYEE_ID)
FROM t_employees
GROUP BY DEPARTMENT_ID;#先执行
–查询各部门的平均工资
SELECT DEPARTMENT_ID,AVG(SALARY) AS ‘平均工资’,COUNT(EMPLOYEE_ID) AS ‘人数’
FROM t_employees
GROUP BY DEPARTMENT_ID;
–查询各个部门、岗位的人数
SELECT DEPARTMENT_ID AS ‘部门’,JOB_ID AS ‘岗位’, COUNT(EMPLOYEE_ID) AS ‘人数’
FROM t_employees
GROUP BY DEPARTMENT_ID,JOB_ID;
–查询各个部门的ID,总人数、first_name
SELECT DEPARTMENT_ID, COUNT(EMPLOYEE_ID) ,FIRST_NAME
FROM t_employees
GROUP BY DEPARTMENT_ID,JOB_ID;
- 分组查询中,select显示的列只能是分组依据的列或者是聚合函数列,不能出现其他列;
语法: SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据(列名) HAVING 过滤规则
- HAVING : 过滤规则是对分组后的数据进行过滤
–统计部门中编号为60、70、80的部门最高的工资
SELECT DEPARTMENT_ID, MAX(SALARY)
FROM t_employees
GROUP BY DEPARTMENT_ID
HAVING DEPARTMENT_ID IN (60,70,80);
–统计部门中最低的工资
SELECT DEPARTMENT_ID, MIN(SALARY)
FROM t_employees
GROUP BY DEPARTMENT_ID
HAVING DEPARTMENT_ID IN (60,70,80);
-
where和having的区别:
-
where是在group by之前进行条件判断,满足条件,进行选择
-
having是在group by之后进行条件判断,满足条件,进行筛选
-
where语句后面不能使用聚合函数的,having语句后面可以使用聚合函数
语法:SELECT 列名 FROM 表名 LIMIT 起始行,查询行
- LIMIT offset_start,row_count : 限定查询结果的起始行和总行数
–查询前5条
SELECT * FROM t_employees LIMIT 0,5;
–查询第二页数据
SELECT * FROM t_employees LIMIT 5,5;
–查询第三页数据
SELECT * FROM t_employees LIMIT 10,5;
-
起始行是从0开始,代表了第一行。第二个参数代表的是从指定行开始查询几行
-
在分页的应用场景中,起始行是跟随页数变化的,但是一页显示的条数是不变得
SQL语句编写顺序:
- ELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组 HAVING 过滤条件 ORDER BY 排序列 LIMIT 起始行,总条数
SQL语句执行顺序:
- 执行 FROM : 指定数据来源表
- 执行WHERE : 对查询的数据做第一次过滤
- 执行GROUP BY :分组
- 执行HAVING : 对分组后的数据做第二次过滤
- 执行SELECT : 查询各个字段的值
- 执行ORDER BY : 排序
- 执行LIMIT : 限定查询结果
8.11.1 作为条件判断
语法:SELECT 列名 FROM 表名 WHERE 条件(子查询结果)
–查询工资大于Diana的员工信息(只能一个值比较)
SELECT salary FROM t_employees WHERE FIRST_NAME = ‘Diana’;
SELECT * FROM t_employees WHERE SALARY > 6000;
–整合
SELECT * FROM t_employees WHERE SALARY > SELECT salary FROM t_employees WHERE FIRST_NAME = ‘Diana’;
-
将子查询"一行一列"的结果作为外部查询的条件。做第二次查询
-
子查询得到的是一行一列的结果才能作为外部条件的等值或不等值判断条件
8.11.2 作为枚举查询的条件
语法:SELECT 列名 FROM 表名 WHERE 列名 IN(子查询结果)
–查询与King同一部门员工信息
–1.查询King所在的部门编号(多行单列)
SELECT DEPARTMENT_ID FROM t_employees WHERE LAST_NAME = ‘King’;
–2.将1查询出的作为枚举查询的条件
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匹配部分
8.11.3 作为一张表
语法:SELECT 列名 FROM (子查询结果集) WHERE 条件;
–查询员工表中部分列的信息(工资大于8000)
–1.先查询部分列的信息作为临时表
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees ORDER BY SALARY DESC ;
–2.将子查询得到临时表作为外部查询表
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY
FROM
(SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees ORDER BY SALARY DESC ) AS temp
WHERE SALARY > 8000;
- 将子查询得到的"多行多列"的结果作为外部查询的一张临时表,做第二次查询
语法:
- SELECT 列名 FROM 表名 1 UNION SELECT 列名 FROM 表名2
- SELECT 列名 FROM 表名 1 UNION ALL SELECT 列名 FROM 表名2
–合并两张表的结果
–去重
SELECT *FROM t1
UNION
SELECT *FROM t2;
–不去重
SELECT *FROM t1
UNION ALL
SELECT *FROM t2;
-
合并的两个结果集,列数必须相同,列类型、列名可以不同
-
纵向合并
语法:SELECT 列名 FROM 表1 连接方式 表2 ON 连接条件;
8.13.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
;
–查询所有岗位的员工信息,显示岗位名称
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
;
8.13.2 三表连接查询
–查询所有员工号、名字、部门名称、所在城市的名称
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
;
8.13.3 多表连接查询
–查询所有员工号、名字、部门名称、部门所在城市名称、所在国家的名称
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
;
- 多表查询时,要明确哪一张表和连接的表有关系
8.13.4 左外连接查询(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值,填充显示
8.13.5 右外连接查询(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填充
==============================================================================
约束就是保证当前表中的数据的正确性、有效性和完整性是合法数据;
表中一行数据代表一个实体,实体完整性约束是标识每一行数据不重复使得实体具有唯一性;
9.1.1 主键约束
PRIMARY KEY 唯一、标识表中的一行数据,此列的值不可重复,且不能为NULL;
–创建表中,选择适合做主键的列,添加主键约束
–学生表
CREATE TABLE Student(
stuid INT PRIMARY KEY,–主键约束,每一个编号是唯一的,不能为null
stuName VARCHAR(20),
phone VARCHAR(11)
)CHARSET=utf8;
INSERT INTO Student(stuid,stuName,phone)
VALUE (001,‘kaka’,100015);
9.1.1.1 删除主键约束
– 删除主键约束:alter table 表名 drop primary key ;
ALTER TABLE Student DROP PRIMARY KEY ;
9.1.1.2创建表后加入主键约束
– 创建表后,加入主键约束
ALTER TABLE Student MODIFY id INT PRIMARY KEY ;
9.1.2 唯一约束
UNIQUE 唯一、标识表中的一行数据,不可重复,可以为NULL;
–表中的手机号列,添加唯一约束!不能重复,但是可以为NULL
CREATE TABLE Student(
stuid INT PRIMARY KEY,
stuName VARCHAR(20),
phone VARCHAR(11) UNIQUE–唯一的约束,可以为空;
)CHARSET=utf8;
INSERT INTO Student(stuid,stuName,phone)
VALUE (002,‘kaka’,1000154);
INSERT INTO Student(stuid,stuName,phone)
VALUE (003,‘kaka’,NULL);
SELECT * FROM Student;
9.1.3 自动增长列
AUTO_INCREMENT 自动增长,给主键数值列添加自动增长。从1开始,每次++;不能单独使用,和主键搭配;
#自动增长,避免ID重复
CREATE TABLE Student(
stuid INT PRIMARY KEY AUTO_INCREMENT,#必须搭配主键
stuName VARCHAR(20),
phone VARCHAR(11)
)CHARSET = utf8;
INSERT INTO Student(stuName,phone)
VALUE (001,‘kaka’,100015);
INSERT INTO Student(stuName,phone)
VALUE (002,‘kaka’,1000154);
INSERT INTO Student(stuName,phone)
VALUE (003,‘kaka’,NULL);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。
架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
9.1.1.2创建表后加入主键约束
– 创建表后,加入主键约束
ALTER TABLE Student MODIFY id INT PRIMARY KEY ;
9.1.2 唯一约束
UNIQUE 唯一、标识表中的一行数据,不可重复,可以为NULL;
–表中的手机号列,添加唯一约束!不能重复,但是可以为NULL
CREATE TABLE Student(
stuid INT PRIMARY KEY,
stuName VARCHAR(20),
phone VARCHAR(11) UNIQUE–唯一的约束,可以为空;
)CHARSET=utf8;
INSERT INTO Student(stuid,stuName,phone)
VALUE (002,‘kaka’,1000154);
INSERT INTO Student(stuid,stuName,phone)
VALUE (003,‘kaka’,NULL);
SELECT * FROM Student;
9.1.3 自动增长列
AUTO_INCREMENT 自动增长,给主键数值列添加自动增长。从1开始,每次++;不能单独使用,和主键搭配;
#自动增长,避免ID重复
CREATE TABLE Student(
stuid INT PRIMARY KEY AUTO_INCREMENT,#必须搭配主键
stuName VARCHAR(20),
phone VARCHAR(11)
)CHARSET = utf8;
INSERT INTO Student(stuName,phone)
VALUE (001,‘kaka’,100015);
INSERT INTO Student(stuName,phone)
VALUE (002,‘kaka’,1000154);
INSERT INTO Student(stuName,phone)
VALUE (003,‘kaka’,NULL);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-348QJPXk-1712655346908)]
[外链图片转存中…(img-A8Hv1HyQ-1712655346909)]
[外链图片转存中…(img-fI9OrMy7-1712655346909)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。
架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
[外链图片转存中…(img-sZDMg2NE-1712655346910)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!