目录
1.DDL语言
其语句包括动词CREATE,ALTER和DROP。在数据库中创建新表或修改、删除表(CREATE TABLE 或 DROP TABLE);为表加入索引等。
mysql是一个关系型数据库,库里面包含若干个表,而每一张表都是由行和列组成。
1.1 关于数据库操作的指令
-- 创建数据库 create database 数据库名称
create database mydb;
-- 看到当前具有的数据
show databases;
-- 切换到指定的数据库 use 数据库名
use mydb;
-- 删除数据库 drop database 数据库名称
drop database mydb;
注意: 删除的数据库必须是你自己创建 不要删除系统自带的数据库 而且数据库中不区分大小写。
1.2 关于表的操作
1. 创建表结构的语法:
create table 表名(
列名 数据类型,
列名 数据类型,
列名 数据类型
.....
);
注意: 最后一列不在使用逗号(,) 逗号必须是英文状态下。
-- 创建表
create table student(
id int primary key auto_increment,
name varchar(20),
age int,
address varchar(30)
);
int 数据类型整形
varchar(长度) 字符串类型(字符串的长度)
primary key: 表示该列为主键列。 特点该列的值不能为null 也不能重复。一张表中只能有一个primary key;
auto_increment: 表示该列的值可以递增。该列的类型必须为int类型。
-- 显示当前数据库中具有的表
show tables;
-- 显示表结构:
desc student;-- 删除表
drop table student;
1.3 数据类型
(1) 数值类型
MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 byte | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
如果我们要在数据库中存储 ==钱== 等数据 此时不能使用 float double 因为这些类型会丢失精度 要使用DECIMAL
使用数字类型最多为: int tinyint double decimal(钱)
(2)日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
date类型 和 DateTime
(3)字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
varchar(20) 长度可变----如果你存入的字符个数小于n 则mysql底层安装你存储字符个数分配空间。
char(20) 长度不可变----如果你存入的字符个数小于n mysql底层按照20的空间来分配。他一般用于长度固定的字符串。比如: 手机号,身份证号
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
问题: MySQL能不能存储音频 视频图片文件 ?
可以的 将音视频图片 转换成流 存储到数据库 blob 但是我们数据库 不存文件
文件一般存到磁盘 然后数据库中存储文件路径
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
1.4 修改表的结构
-- (1) 增加一列
alter table student add column sex varchar(2)
-- (2) 修改列的名称
alter table student change column sex aaa varchar(2);
-- (3) 修改列的数据类型。
alter table student modify column aaa int;
-- (4) 删除某一列
alter table student drop column aaa;
总结:
DDL:
creata database 数据库名;--- 创建数据库的命令
use 数据库名;---- 切换数据库
drop database 数据库名;---- 删除数据库.
show databases; ----显示所有的数据库名称
create table 表名(
列名 数据类型,
列名 数据类型.....
);
数据类型: 数字类型(int double tintyint decimal)
字符串类型(varchar char)
时间类型(date, datetime)
修改表结构:
-- 增加一列
alter table 表名 add column 列名 数据类型;
-- 删除一列
alter table 表名 drop column 列名;
-- 修改列的数据类型
alter table 表名 modify column 列名 数据类型
2. DML语言
数据操作语言(DML:Data Manipulation Language):其语句包括动词INSERT、UPDATE和DELETE。它们分别用于添加、修改和删除。
上面已经把表结构创建好;
但是我们应该表中添加数据。
2.1 添加 insert
-- 添加数据 注意: 字符串必须用 '' 不能使用双引号 ""
-- (1) 添加所有字段的数据.
insert into student(id,name,age,address) values(1,'派大星',18,'比奇堡');
-- (2) 如果你添加所有列的值 那么可以省略列的名称
insert into student values(2,'海绵宝宝',19,'比奇堡');
-- (3) 因为主键为递增模式 所以我们在添加数据时可以不为主键指定值
insert into student values(null,'蜡笔小新',5,'春日部');
-- (4) 添加部分列.
insert into student(name,age) values('小蜗',19);
-- (5) 添加多条记录
insert into student values
(null,'海绵宝宝',22,'菠萝屋'),
(null,'派大星',13,'石头'),
(null,'痞老板',26,'油漆桶');
2.2 删除 delete
-- 删除记录
-- (1) 根据条件删除 delete from 表名 where 条件;
--关于条件的介绍我们会在后面详细讲解。
delete from student where id=2;
2.3 修改语句
-- 修改记录 update 表名 set 列名='值',列名=值 where 条件
update student set name='蜡笔小新',age=5 where id=3;
2.4 范围语句(and、or)
-- 条件
-- 范围删除。
delete from student where age>15;
-- 逻辑符连接多个条件 and or
delete from student where age<15 or name='海绵宝宝';
总结:
DML:
-- 增加 insert --- 保证你的列名和值匹配 (个数 类型)。
insert into 表名(列名,列名....) values(值,值....)
-- 删除
delete from 表名 where 条件
-- 修改
update 表名 set 列名=值,列名=值,.... where 条件
3. 导出和导入sql语句
3.1 导出sql语句
导出sql语句相当于有了备份,防止sql丢失。
3.2 导入sql
需要重建相应的数据库并切换到该库中
create database work;
use work;
把我们的sql文件拖入到相应的数据库表名处。
4. 查询
4.1准备条件
导入sql :
use mydb;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生表的主键列',
`name` varchar(255) ,
`age` int(11) ,
`address` varchar(255),
PRIMARY KEY (`id`) USING BTREE
) ;-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '张三', 18, '北京');
INSERT INTO `student` VALUES (2, '李四', 19, '北京');
INSERT INTO `student` VALUES (3, '王五', 19, '北京');
INSERT INTO `student` VALUES (4, '钱七', 19, '北京');
INSERT INTO `student` VALUES (5, '关羽', 25, '南京');
INSERT INTO `student` VALUES (6, '张飞', 25, '南京');
INSERT INTO `student` VALUES (7, '赵云', 28, '南京');
INSERT INTO `student` VALUES (8, '项羽', 19, '南京');
INSERT INTO `student` VALUES (9, '刘备', 30, '上海');
INSERT INTO `student` VALUES (10, '曹操', 40, '许昌');
INSERT INTO `student` VALUES (11, '夏侯', 36, '许昌');
INSERT INTO `student` VALUES (12, '诸葛亮', 38, '上海');
INSERT INTO `student` VALUES (13, '周瑜', 78, '江东');
INSERT INTO `student` VALUES (14, '小乔', 56, '江东');
INSERT INTO `student` VALUES (15, '孙尚香', 59, '江东');
4.2 基础查询
-- 查询表中所有的记录 select * from 表名;
-- 不建议使用*号查询,会导致索引失败
select * from student;
-- 把表名一一列出
select id,name,age,address from student;
-- 查询部分列
select name,age from student;
-- 可以把查询的列名起别名
select name as 姓名,age as 年龄 from student;
-- as可以省略 但是必须使用空格隔开
select name 姓名,age 年龄 from student;
4.3 去除重复的值
-- 使用distinct 去除重复字段值 要求查询的所有列值 都必须相同时。
select distinct address from student;
4.4 条件查询
上面讲解的查询都是查询所有记录。而在实际开发中我们会根据条件查询符合的记录
-- 1.条件查询
-- 判断
select * from student where age<20;
select * from student where age!=19;
select * from student where age>20;
--2.多条件查询(and(与)、or(或))
select * from student where address='上海' and age>20;
select * from student where address='江东' or age<30;
-- 3.范围语句(between ...and之间)
select * from student where age between 19 and 30;
--4.使用in(查询年龄为20,19,30,50的学生)
select * from student where age in(20,19,30,50);
--5.模糊查询(like)
-- 通配符:_ :统配一个字符 %:统配n个字符
-- 查询名字中第二位为‘三’的学生
select * from student where name like '_三';
-- 查询名字中包含‘三’字的学生
select * from student where name like '%三%';
-- 查询名字中间为‘三’的学生
select * from student where name like '_三_';
-- 查询姓张的学生
select * from student where name like '张%';
-- 查询名字末尾为七字的学生
select * from student where name like '%七';
4.5 排序查询
-- 排序查询 order by 列名 desc(降序) 升序不加 desc
-- 年龄升序
select * from student order by age;
-- 年龄降序
select * from student order by age desc;
-- 年龄降序 id升序
select * from student order by age desc,id;
!!注意 既有where又有order by where应在前order by在后
-- 查询年龄大于19的学生,并且年龄降序排列
select * from student where age>19 order by age desc;
4.6 查询列上进行运算
-- 创建表结构
create table fruit(
id int primary key auto_increment,
name varchar(10),
price decimal(2,2),
num int
);
-- 添加数据
insert into fruit values
(null,'草莓',7.6,10),
(null,'香蕉',8.2,5),
(null,'西瓜',12.9,6);
-- 查询表记录
select*from fruit;
-- 查询列上进行运算
-- 查询计算总价
select id,name,price,num,price*num total from fruit;
5. 聚合函数
聚合函数(max:最大 min:最小 sum:和 avg:平均值 count:个数 )
-- 聚合函数(max:最大 min:最小 sum:和 avg:平均值 count:个数 )
-- 求表格中最小年龄 min(列名)
select min(age) from student;
-- 求表格中最大年龄 max(列名)
select max(age) from student;
-- 求表格中年龄总和 sum(列名)
select sum(age) from student;
-- 求表格中年龄平均值 avg(列名)
select avg(age) from student;
-- 求表格中学生的个数 count(列名)
select count(id) from student;
6. 分组查询(group by)
在sql中有个 group by 语句 将某一列相同数据 视为一组 然后进行查询 与聚合函数连用。
-- 分组查询(group by)
-- 求各个地区的人数
select count(*),address from student group by address;
-- 查询 各个地区的平均年龄
select address,avg(age) from student group by address;
-- 使用 having 对分组进行条件检索
-- 查询 平均年龄大于30的地区人数
select address,count(*) from student group by address having avg(age)>30;
-- 查询 最大值小于30 的地区 人数 和 平均年龄
select address,count(*),avg(age) from student group by address having avg(age)<30;
-- 查询 人数大于3的地区 最大年龄
select address,count(*),max(age) from student group by address having count(*)>3;
-- 查询每个地区 25岁以上人数的数量
select address,count(*) from student where age>25 group by address;
!!! 注意: 如果使用了group by 那么select后只能根分组的条件列和聚合函数。
7. 分页查询(limit)
当数据库表数据量比较大 例如: 1000w行数据 如果我们执行 select * from student 此时有可能数据库卡死 -- 拿出1000w数据到内存里,你的内存可能会不够。导致电脑卡死。
如果在java中 有可能内存直接溢出 所以实际开发中 都是分页查询 (部门查询)
计算公式: select * from 表名 limit (n-1)*m,m; (n:表示页码 m:表示每页的数据条数)
-- 分页查询
-- 计算公式: select * from 表名 limit (n-1)*m,m; (n:表示页码 m:表示每页的数据条数)
-- 查询第1页显示5条记录
select * from student limit 0,5;
-- 查询第2页显示5条记录
select * from student limit 5,5;
-- 查询第3页显示5条记录
select * from student limit 10,5;
8. SQL优先级
sql语法:
select distinct * from 表名
where 条件
group by 分组
having 分组条件
order by 排序
limit 分页。
上面为他的语法结构。顺序不能乱。mysql执行引擎:执行的顺序。
sql执行得优先级:
from > where > group by > 聚合函数 > select > distinct > order by > limit
9. 字符串函数
9.1常用函数
常用函数:
函数 | 功能 |
---|---|
CONCAT(s1, s2, ..., sn) | 字符串拼接,将s1, s2, ..., sn拼接成一个字符串 |
LOWER(str) | 将字符串全部转为小写 |
UPPER(str) | 将字符串全部转为大写 |
LPAD(str, n, pad) | 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度 |
RPAD(str, n, pad) | 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度 |
TRIM(str) | 去掉字符串头部和尾部的空格 |
SUBSTRING(str, start, len) | 返回从字符串str从start位置起的len个长度的字符串 |
-- 字符串函数
use day4_26;
-- 字符拼接函数(concat)
select concat('姓名:',name,'性别:',sex) from student;
-- 字符串转换大小写
-- 转换为大写upper(列名),小写lower(列名)
select name,upper(name),lower(name) from tb_emp;
-- 去除前后空格 trim(列名)
select name,trim(name) from tb_emp where name like '%夏美%';
-- 找到姓张的学生 字符串截取substr(列名,起始位置,结束位置)
select*from tb_emp where substring(name,1,1)='张';
9.2 数字函数
函数 | 功能 |
---|---|
CEIL(x) | 向上取整 |
FLOOR(x) | 向下取整 |
MOD(x, y) | 返回x/y的模 |
abs(x) | 求某个数得绝对值 |
-- 数字函数
-- 向上取整ceil(列名或数值)
select ceil(1.2) from num;
-- 向下取值floor(列名或数值)
select floor(3.2) from num;
-- 返回x/y的余数mod(x,y)
select mod(3,2) from num;
-- 求x(任意数值)的绝对值 abs(x)
select abs(-1) from num;
-- 把表num 的0变为1,1变为0
select * from num;
update num set num1=abs(num1-1);
9.3 时间函数
常用函数:
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前日期和时间 |
YEAR(date) | 获取指定date的年份 |
MONTH(date) | 获取指定date的月份 |
DAY(date) | 获取指定date的日期 |
DATE_ADD(date, INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 |
DATEDIFF(date1, date2) | 返回起始时间date1和结束时间date2之间的天数 |
-- 时间函数
-- curdate()返回当前日期年-月-日 (后面可以不用跟表名)
select curdate();
-- 可以用在where
select * from tb_emp where entrydate=curdate();
-- now()返回当前日期和时间
select now();
-- year(date)获取指定的date日期的年份
select year('2011-08-30');
-- 使用where检索指定年份
select * from tb_emp where year(entrydate)='2000';
-- date_add(date,interval 天/年/月)
-- 返回一个指定日期/时间值加上一个时间间隔后的时间值
select date_add('2020-09-16',interval 3 day);
-- datediff(date1,date2)
-- 返回起始时间date1和结束时间date2之间相隔的天数
select datediff('2021-08-08','2020-08-08');
-- 查找入职30天的员工
select * from tb_emp where datediff(now(),entrydate)=31;
9.4 控制流程函数
常用函数:
函数 | 功能 |
---|---|
IF(value, t, f) | 如果value为true,则返回t,否则返回f |
IFNULL(value1, value2) | 如果value1不为空,返回value1,否则返回value2 |
CASE WHEN [ val1 ] THEN [ res1 ] ... ELSE [ default ] END | 如果val1为true,返回res1,... 否则返回default默认值 |
CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] ... ELSE [ default ] END | 如果expr的值等于val1,返回res1,... 否则返回default默认值 |
-- 流程控制函数
-- if(value,true,false)
select name,age,if(age>30,'大仙女','小仙女')from tb_emp;
-- ifnull(value1,value2) 如果为null,则....
select name,job,ifnull(job,'待定') from tb_emp;
10.约束
分类:
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 限制该字段的数据不能为null | NOT NULL |
唯一约束 | 保证该字段的所有数据都是唯一、不重复的 | UNIQUE |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
检查约束(8.0.14版本后) | 保证字段值满足某一个条件 | CHECK |
外键约束 | 用来让两张图的数据之间建立连接,保证数据的一致性和完整性 | FOREIGN KEY |
约束是作用于表中字段上的,可以在创建表或者修改表的时候添加约束。
-- 约束
-- primary key 要求该列的值不能为空并且唯一
-- unique 唯一约束 表示该列得值必须唯一。但是可以运行多个null
-- not null 非空约束 表示改列值不能为null
-- defalut 默认约束(如果该列没有值,则默认为男)
-- 创建学生表
create table student(
id int primary key auto_increment,
name varchar(20) unique,
age int not null,
sex varchar(2) default '男'
);
-- 添加数据
select*from student;
insert into student values(null,'小新',5,'男');
-- 报错:Duplicate entry '小新' for key 'student.name'
-- name具有唯一约束,不能重复添加
insert into student values(null,'小新',5,'男');
-- 报错: Column 'age' cannot be null
-- 因为age设置了非空约束,所以age必须有值
insert into student values(null,'小新',null,'男');
-- sex有默认约束,所以添加数据不设置值时采用默认值
insert into student(id,name,age) values(null,'风间',5);
select * from student;
10.1 外键约束
外键约束用来让两张图的数据之间建立连接,保证数据的一致性和完整性。
-- 外键约束
-- 创建班级表
create table t_class(
tid int primary key auto_increment,
tname varchar(20)
);
-- 创建学生表
create table t_stu(
id int primary key auto_increment,
name varchar(20),
-- 表示外键列(外键列的数据类型必须与主表键列一致)
classid int
);
-- 添加外键约束
-- alter table 从表名 add constraint 约束名(随意起)
-- foreign key 外键列名 referenes 主表(主键)
alter table t_stu add constraint fx_stuclass
foreign key (classid) references t_class(tid);
-- 添加班级数据
insert into t_class values(null,'QY151'),(null,'QY150');
-- 添加学生数据
insert into t_stu values(null,'小明',1),(null,'大名',2);
注意: 外键列得数据类型 必须和主表中主键得数据类型一致。
10.2 删除、更新行为
11. 连表查询
11.1 表与表之间存在的关系
-
一对多: 在多得一方添加外键列
-
多对多: 需要在创建一个中间表,该表中至少有两个外键列。
11.2 连表查询
11.3 内连接
内连接演示---结果都是一样,只是语法不同。看个人习惯用哪个?
1.查询每一个员工的姓名,及关联的部门的名称〔隐式内连接实现)2.查询每一个员工的姓名,及关联的部门的名称〔显式内连接实现)
-- 连表查询
-- 内连接
-- 内连接演示---结果都是一样,只是语法不同。看个人习惯用哪个?
-- 1.查询每一个员工的姓名,及关联的部门的名称〔隐式内连接实现)
-- 隐式查询 select 列名.... from 表1,表2 where 连表得条件。
select * from tb_emp ,tb_dept where tb_emp.dept_id=tb_dept.id order by tb_emp.id;
-- 若名字长使用不方便可以起别名
select * from tb_emp a, tb_dept b where a.dept_id=b.id;
-- 2.查询每一个员工的姓名,及关联的部门的名称〔显式内连接实现)
-- 显示连接: A表 inner join B表 on 连表条件(inner可省略)
select * from tb_emp a join tb_dept b on a.dept_id=b.id order by a.id;
11.4 外连接
外连接演示
--1.查询emp表的所有数据, 和对应的部门信息(左外连接)
--2.查询dept表的所有数据,和对应的员工信息(右外连接)
-- 外连接演示
-- 语法: select 查询列集 from A表 left outer join B表 on 连表条件(outer可以省略)
-- 1.查询emp表的所有数据, 和对应的部门信息(左外连接)
select * from tb_emp c left join tb_dept d on c.dept_id=d.id;
-- 2.查询dept表的所有数据,和对应的员工信息(右外连接)
select*from tb_emp e right join tb_dept f on e.dept_id=f.id;
11.5 自联查询
自己和自己相连接查询。
select * from A表 join A表 on 连表条件。
-- 自连接
-- 1.查询员工及其所属领导的名字。
select a.name,b.name from tb_emp a join tb_emp b on a.managerid=b.id;
-- 2.查询所有员工 emp及其领导的名字emp ,如果员工没有领导,也需要查询出来
select a.name,b.name from tb_emp a left join tb_emp b on a.managerid=b.id;
12.子查询(嵌套查询)
-- 子查询
-- 一个查询的结果 作为另一个查询的条件 或者 临时表。
-- 查询市场部的员工信息-----
-- 子查询返回的结果一列一条记录。 这个时候可以用=
select*from tb_emp where dept_id=(select id from tb_dept where name in('市场部'));
-- 查询市场部和研发部员工的信息。in
-- 查询市场部和研发部员工的信息。
-- a) 查询市场部和研发部的编号
select id from tb_dept where name in ('市场部','研发部');
-- b) 再员工表中根据部门编号查询员工信息
select * from tb_emp where dept_id in(select id from tb_dept where name in ('市场部','研发部'));
-- 查询在“方东白”之后入职的员工信息
select * from tb_emp where entrydate>(select entrydate from tb_emp where name='方东白');
-- -- 查询比财务部所有人工资都高的员工信息。
-- a)求出财务部中最高的工资。
select max(salary)
from tb_emp a
join tb_dept b
on a.dept_id=b.id
where b.name='财务部';
-- b) 根据财务部最高工资查询其他员工信息
select * from tb_emp
where salary>(select max(salary)
from tb_emp a
join tb_dept b
on a.dept_id=b.id
where b.name='财务部');
13.组合插叙
多个查询的结果 组合到一起。
sql union sql --->把这两条sql查询的结果组合到一起。如果有重复记录则合并成一条。
sql union all sql--->把这两条sql查询的结果组合到一起。如果有重复记录,不合并。注意: 这两条sql返回的字段必须一样。
select name from tb_emp where salary>8000
UNION
select * from tb_emp where age>40;