MySQL

目录

1.DDL语言

1.1 关于数据库操作的指令

1.2 关于表的操作

1.3 数据类型

(1) 数值类型

(2)日期和时间类型

(3)字符串类型

1.4 修改表的结构

总结:

2. DML语言

2.1 添加 insert

2.2 删除 delete

2.3 修改语句

2.4 范围语句(and、or)

总结:

3. 导出和导入sql语句

3.1 导出sql语句

3.2 导入sql

4. 查询

4.1准备条件

 4.2 基础查询

4.3 去除重复的值

4.4 条件查询

4.5 排序查询

4.6 查询列上进行运算

5. 聚合函数

6. 分组查询(group by)

7. 分页查询(limit)

8. SQL优先级

9. 字符串函数

9.1常用函数

 9.2 数字函数

 9.3 时间函数

9.4 控制流程函数

10.约束

 10.1 外键约束

10.2 删除、更新行为

11. 连表查询

11.1 表与表之间存在的关系

11.2 连表查询

11.3 内连接

11.4 外连接

11.5 自联查询

12.子查询(嵌套查询)

13.组合插叙


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。下面的表显示了需要的每个整数类型的存储和范围。

类型大小范围(有符号)范围(无符号)用途
TINYINT1 byte(-128,127)(0,255)小整数值
SMALLINT2 bytes(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 bytes(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT或INTEGER4 bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
FLOAT4 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)单精度 浮点数值
DOUBLE8 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)范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳

date类型 和 DateTime

(3)字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型大小用途
CHAR0-255 bytes定长字符串
VARCHAR0-65535 bytes变长字符串
TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串
TINYTEXT0-255 bytes短文本字符串
BLOB0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据
LONGTEXT0-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.约束

分类:

约束描述关键字
非空约束限制该字段的数据不能为nullNOT 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 表与表之间存在的关系

  1. 一对多: 在多得一方添加外键列

  2. 多对多: 需要在创建一个中间表,该表中至少有两个外键列。

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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值