MySQL数据库

MySQL数据库(更新中)

(注:仅供参考。学习于 黑马——大数据MySQL从入门到精通实战教程。 感兴趣的小伙伴可以去黑马教育官网进行学习。 传送门:https://yun.itheima.com/course/1019.html?czpc$pythonzly)

MySQL数据库——DDL

  DDL(Data Definition Language)数据定义语言

对数据库的常用操作

功能SQL
查看所有数据库show databases;
创建数据库create database [if not exists] mydb1 [charset=utf8]
切换(选择要操作的)数据库use mydb1;
删除数据库drop database [if exists] mydb1;
修改数据库编码alter database mydb1 character set utf8;

对表结构的常用操作

创建表

create table [if ont exists] 表名(
字段名1 类型[(宽度)] [约束条件] [comment '字段说明'] ,
字段名2 类型[(宽度)] [约束条件] [comment '字段说明'] ,
字段名3 类型[(宽度)] [约束条件] [comment '字段说明'] 
)[表的一些设置];

use mydb1;

CREATE TABLE if not EXISTS student(
sid int,
name VARCHAR(20),
gender varchar(20),
age int,
birth data,
address varchar(20)
);
数据类型

颜色为常用数据类型

数值类型

在这里插入图片描述

字符串类型

在这里插入图片描述

日期类型

在这里插入图片描述

修改表结构

功能SQL
查看当前数据库所有表名称show tables;
查看指定某个表的创建语句show create table 表名;
查看表结构desc 表名;
删除表drop table 表名;
修改表添加列

 语法: alter table 表名 add 列名 类型(长度)[约束];
 
 ALTER TABLE student add dept VARCHAR(20);
修改列名和类型

 语法: alter table 表名 change 旧列名 新列名 类型(长度)[约束];
 
ALTER TABLE student CHANGE dept department VARCHAR(30);
修改表删除列

 语法: alter table 表名 drop 列名;
 
ALTER TABLE student DROP department;
修改表名

 语法: rename table 表名 to 新表名;
 
 RENAME TABLE student to stu;

MySQL数据库——DML

  DML(Data Manipulation Language)数据操作语言

关键字

插入 insert
 语法: insert into 表名 (列名1,列名2,列名3) values(1,2,3);
 INSERT INTO student (sid,name,gender,age,address) VALUES (1001,'小明','男',18,'北京');
删除 delete
-- 数据删除 
-- 语法 DELETE FROM 表名 [WHERE 条件]
--  DELETE FROM 表名 删除表中所有数据
-- 数据清空
-- 语法 TRUNCATE TABLE 表名 或者 TRUNCATE 表名
-- TRUNCATE 类似 DROP TABLE 
-- 只是清空表中的数据
DELETE from student where sid=1004;
truncate table student2;
truncate student3;
跟新 update
 -- 语法 update 表名 set 字段1=值,字段2=值;
 -- UPDATE 表名 SET 字段=值, WHERE 条件;
UPDATE student SET address = '湖南';

UPDATE student SET address='湖南',score=200 WHERE sid=1001;
-- 将student表中sid=1001的 address跟新为湖南,成绩更新为200;

MySQL约束

constraint 表中数据的限制条件,表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性,比如用户表有些列的值(id)不能为空,有些列的值(pid)不能重复。

主键约束(primary key) PK
-- 语法 create table 表名(
-- <字段名><数据类型> primary key
-- )
-- 在定义字段之后再指定主键,语法格式如下:
-- create table 表名(
--  [constraint <约束名>] primary key [字段名]
-- );

create table emp1(
eid int PRIMARY KEY,
name VARCHAR(20),
deptld int,
salary double
);
 
create table emp2(
eid int ,
name VARCHAR(20),
deptld int,
salary double,
CONSTRAINT pk1 primary key(eid)
);

-- 联合主键
CREATE TABLE test3 (
name varchar(20),
deptld int,
id int,
PRIMARY key(deptld,id)
);

-- 通过修改表结构添加主键
create table test4(
id int,
name varchar(20),
address VARCHAR(20),
score int
);

alter table test4 add primary key (id);

-- 删除主键约束(单主键,双主键)
-- 语法  alter table 表名 drop primary key;
alter table test4 drop primary key; 
alter table test3 drop primary key;
自增长约束(auto_increment)

当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。

-- 语法 字段名 数据类型 auto_increment
-- 默认情况下,auto_increment的初始值是 1,每新增一条记录,字段值自动加 1。
 create table txt1(
 id int primary key auto_increment,
 name varchar(20)
 );
 
-- 指定自增字段初始值
create table txt2(
id int primary key auto_increment,
name varchar(20)
)auto_increment=200;

create table txt3(
id int primary key auto_increment,
name varchar(20)
);
alter table txt3 auto_increment=30;

-- 删除自增长约束
-- delete数据之后自动增长从断点开始
-- truncate数据之后自动增长从默认起始值开始

非空约束(not null)

非空约束(not null)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。

-- 非空约束
-- 语法 <字段名><数据类型> not null;
--      alter table 表名 modify 字段 类型 not null;

create table test5(id int not null,
name varchar(20)
);

create table test6(
id int ,
name varchar(20)
);
alter table test6 modify id int not null;


-- 删除非空约束
-- alter table 表名 modify 字段 类型
alter table test6 modify id int;
唯一性约束(unique)

Unique Key 是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。

-- 唯一约束
-- 语法 字段名 数据类型 unique
--      alter table 表名 add constraint 约束名 unique (列)
 create table test8(
	id int,
	name varchar(20),
	phone_number varchar(20) UNIQUE
 );
 
 create table tst9(
	id int,
	name VARCHAR(20),
	phone_number varchar(20)
 );
 alter table tst9 add constraint unique_ph unique(phone_number);

-- 删除唯一约束
alter table tst9 drop index unique_ph;

默认约束(default)

默认值约束用来指定某列的默认值。

-- 默认约束default
-- 字段名 数据类型 default 默认值;
--     alter table 表名 modify 列名 类型 default 默认值
create table test10(
	id int,
	name varchar(20),
	address varchar(20) DEFAULT '湖南'
);

reate table test11(
	id int, 
	name varchar(20),
	address varchar(20)
);
alter table test11 MODIFY address varchar(20) default '湖南';

-- 删除默认约束
-- alter table 表名 modify 字段名 类型 default null;
alter table test11 modify address varchar(20) default null;
零填充约束(zerofill)

1、插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
2、zerofill默认为int(10)
3、当使用zerofill 时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是
原值的2倍,例如,有符号为-128+127,无符号为0256。

create table test12(
	id int ZEROFILL,
	name varchar(20)
);

-- 删除
alter table test12 modify id int;
外键约束(foreign key) FK

MySQL数据库——DQL——基本查询

-- 语法:select
-- [all|distinct]
-- <目标列的表达式1> [别名],
-- <目标列的表达式2> [别名]... from <表名或视图名> [别名],<表名或视图名> [别名]... [where<条件表达式>]
-- [group by <列名>
-- [having <条件表达式>]]
-- [order by <列名> [asc|desc]]
-- [limit <数字或者列表>];

-- select */列名 from 表 where 条件;
-- 例如对以下数据库、表、数据进行操作
create database if not EXISTS mydb2;
use mydb2;
create table product(
	pid int PRIMARY KEY auto_increment,
	pname VARCHAR(20) not null,
	price DOUBLE,
	category_id VARCHAR(20)
);
insert into product values(null,'海尔洗衣机',5000,'c001');
insert into product values(null,'美的冰箱',3000,'c001');
insert into product values(null,'格力空调',5000,'c001');
insert into product values(null,'九阳电饭煲',200,'c001');
insert into product values(null,'啄木鸟衬衣',300,'c002');
insert into product values(null,'恒源祥西裤',800,'c002');
insert into product values(null,'花花公子夹克',440,'c002');
insert into product values(null,'劲霸休闲裤',266,'c002');
insert into product values(null,'海澜之家卫衣',180,'c002');
insert into product values(null,'杰克琼斯运动裤',430,'c002');
insert into product values(null,'兰蔻面霜',300,'c003');
insert into product values(null,'雅诗兰黛精华水',200,'c003');
insert into product values(null,'香奈儿香水',350,'c003');
insert into product values(null,'SK-II神仙水',350,'c003');
insert into product values(null,'资生堂粉底液',180,'c003');
insert into product values(null,'老北京方便面',56,'c004');
insert into product values(null,'良品铺子海带丝',17,'c004');
insert into product values(null,'三只松鼠坚果',88,null);

-- 简单查询
-- 1.查询所有商品
select * from product;

-- 2.查询商品名和商品价格
select pname,price from product;

-- 3.别名查询.使用的关键字是as(as可以省略的). 
-- 3.1表别名:
select * from product as p; 

-- 3.2列别名:
select pname as pn from product; 

-- 4.去掉重复值.
select distinct price from product; 

-- 5.查询结果是表达式(运算查询):将所有商品的价格+10元进行显示
select pname,price+10 from product;

运算符

1、算数运算符

算术运算符说明
+加法运算
-减法运算
*乘法法运算
/除法法运算
/ 或 DIV除法运算,返回商
% 或 MOD求余运算,返回余数

2、比较运算符
在这里插入图片描述
3、逻辑运算符
在这里插入图片描述
4、位运算符
在这里插入图片描述

-- 运算符操作——算数运算符
select 6+4;
select 8-4;
select 4*2;
select 8/2;
select 10%2;

-- 将每件商品的价格+10;
select pname,price +10 as new_price from product;

-- 将所有商品的价格上调10%;
select pname,price*1.1 as new_price from product;

-- 查询商品名称为“海尔洗衣机”的商品所有信息;
select * from product where pname = '海尔洗衣机';

-- 查询价格为800商品
select *from product where price=800;

-- 查询价格不是800的所有商品;
 select *from product where price !=800;
 select * from product where price <>800;
 select * from product where not(price = 800);
 
 -- 查询商品价格大于60的所有商品信息;
 select * from product where price > 60;
 
 -- 查询商品在200到1000之间的商品;
 select * from product where price >=200 and price <=1000;
 select * from product where price between 200 and 1000;
 
-- 查询商品价格是200或800 的所有商品;
select * from product where price =200 or price =800;
select * from product where price in(200,800);

-- 查询含有'裤'字的所有商品
select * from product where pname like '%裤%';

-- 查询以'海'开头的所有商品
select * from product where pname like '海%';

-- 查询第二个字为'蔻'的所有商品
select * from product where pname like '_蔻%';

-- 查询category_id为null的商品
select * from product where category_id is null;

-- 查询category_id不为null分类的商品
select * from product where category_id is not null;

-- 使用least求最小值
select least(10,20,30);
-- 10
select least(10,null,30);
-- null

-- 使用greatest求最大值
select greatest(10,20,30);
select greatest(10,null,30);

-- 位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。
select 3&5; -- 位与
select 3|5; -- 位或
select 3^5; -- 位异或
select 3>>1; -- 位左移
select 3<<1; -- 位右移
select ~3; -- 位取反

排序查询

select 字段名1,字段名2,…… from 表名 order by 字段名1 [asc|desc],字段名2[asc|desc]……
• 特点
1.asc代表升序,desc代表降序,如果不写默认升序
2.order by用于子句中可以支持单个字段,多个字段,表达式,函数,别名
3.order by子句,放在查询语句的最后面。LIMIT子句除外

-- 价格排序 降序
select * from product order by price desc;

-- 在价格排序(降序)的基础上,以分类排序(降序)
select * from product ORDER BY price DESC,category_id asc;

-- 显示商品的价格(去重复),并排序(降序)
select distinct price from product ORDER BY price desc;

聚合查询

在这里插入图片描述

-- 查询商品的总条数
select count(*) from product; 

-- 查询价格大于200商品的总条数
select count(*) from product where price > 200; 

-- 查询分类为'c001'的所有商品的总和
select sum(price) from product where category_id = 'c001';

-- 查询商品的最大价格
select max(price) from product; 

-- 查询商品的最小价格
select min(price) from product; 

-- 查询分类为'c002'所有商品的平均价格
select avg(price) from product where category_id = 'c002';
聚合查询对空值的处理

1、count函数对null值的处理如果count函数的参数为星号(*),则统计所有记录的个数。而如果参数为某字段,不统计含null值的记录个数。
2、sum和avg函数对null值的处理这两个函数忽略null值的存在,就好象该条记录不存在一样。
3、max和min函数对null值的处理max和min两个函数同样忽略null值的存在

如下例子:

create table test_null(
	c1 varchar(20),
	c2 int
);

insert into test_null values('aaa',3);
insert into test_null values('bbb',3);
insert into test_null values('ccc',null);
insert into test_null values('ddd',3);

select count(*),count(1),count(c2) from test_null;
select sum(c2),max(c2),min(c2),avg(c2) from test_null;

在这里插入图片描述

在这里插入图片描述

分组查询 group by
--    语法 select 字段1 ,字段2, ……from 表名 group by 分组字段 having 分组条件;

-- 统计各个分类商品的个数
select category_id,count(*) from product GROUP BY category_id;
-- 如果要进行分组的话,则SELECT子句之后,只能出现分组的字段和统计函数,其他的字段不能出现:
分组之后的条件筛选-having

分组之后对统计结果进行筛选的话必须使用having,不能使用where 。
where子句用来筛选 FROM 子句中指定的操作所产生的行。
group by 子句用来分组 WHERE 子句的输出。
having 子句用来从分组的结果中筛选行

-- 统计各个分类商品的个数,且只显示个数大于4的信息;
select category_id,count(*) from product GROUP BY category_id HAVING count(*)>4;
分页查询-LIMIT

分页查询在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式。例如数据共有30条,每页显示5条,第一页显示1-5条,第二页显示6-10条

-- 语法 select 字段1,字段2... from 表明 limit n
--     select 字段1,字段2... from 表明 limit m,n
-- m: 整数,表示从第几条索引开始,计算方式(当前页-1)*每页显示条数
-- n: 整数,表示查询多少条数据

-- 查询前五条记录
select * from product LIMIT 5;

-- 从第四条开始显示,显示五条
select * from product LIMIT 3,5;
INSERT INTO SELECT 语句
-- 将一张表的数据导入到另一张表中,可以使用INSERT INTO SELECT语句 。

-- 语法   insert into Table2(field1,field2,…) select value1,value2,… from Table1 或者:insert into Table2 select * from Table1
-- 要求目标表Table2必须存在
SELECT INTO FROM语句
-- 将一张表的数据导入到另一张表中,有两种选择 SELECT INTO 和 INSERT INTO SELECT 。
-- 语法 SELECT vale1, value2 into Table2 from Table1
-- 要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。

正则表达式

正则表达式(regular expression)描述了一种字符串匹配的规则,正则表达式本身就是一个字符串,使用这个字符
串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替
换那些符合某个规则的文本。
MySQL通过REGEXP关键字支持正则表达式进行字符串匹配。

在这里插入图片描述

在这里插入图片描述

-- ^ 在字符串开始处进行匹配
SELECT 'abc' REGEXP '^a'; 

-- $ 在字符串末尾开始匹配
SELECT 'abc' REGEXP 'a$';
SELECT 'abc' REGEXP 'c$'; 

-- . 匹配任意字符
SELECT 'abc' REGEXP '.b';
SELECT 'abc' REGEXP '.c';
SELECT 'abc' REGEXP 'a.'; 

-- [...] 匹配括号内的任意单个字符
SELECT 'abc' REGEXP '[xyz]';
SELECT 'abc' REGEXP '[xaz]';

-- [^...] 注意^符合只有在[]内才是取反的意思,在别的地方都是表示开始处匹配
SELECT 'a' REGEXP '[^abc]';
SELECT 'x' REGEXP '[^abc]';
SELECT 'abc' REGEXP '[^a]';

 -- a* 匹配0个或多个a,包括空字符串。可以作为占位符使用.有没有指定字符都可以匹配到数据
SELECT 'stab' REGEXP '.ta*b';
SELECT 'stb' REGEXP '.ta*b';
SELECT '' REGEXP 'a*'; 

-- a+ 匹配1个或者多个a,但是不包括空字符
SELECT 'stab' REGEXP '.ta+b';
SELECT 'stb' REGEXP '.ta+b';

-- a? 匹配0个或者1个a
SELECT 'stb' REGEXP '.ta?b';
SELECT 'stab' REGEXP '.ta?b';
SELECT 'staab' REGEXP '.ta?b'; 

-- a1|a2 匹配a1或者a2,
SELECT 'a' REGEXP 'a|b';
SELECT 'b' REGEXP 'a|b';
SELECT 'b' REGEXP '^(a|b)';
SELECT 'a' REGEXP '^(a|b)';
SELECT 'c' REGEXP '^(a|b)'; 

-- a{m} 匹配m个a
SELECT 'auuuuc' REGEXP 'au{4}c';
SELECT 'auuuuc' REGEXP 'au{3}c';

-- a{m,n} 匹配m到n个a,包含m和n
SELECT 'auuuuc' REGEXP 'au{3,5}c';
SELECT 'auuuuc' REGEXP 'au{4,5}c';
SELECT 'auuuuc' REGEXP 'au{5,10}c'; 

-- (abc) abc作为一个序列匹配,不用括号括起来都是用单个字符去匹配,如果要把多个字符作为一个整体去匹配就需要用到括号,所以括号适合上面的所有情况。
SELECT 'xababy' REGEXP 'x(abab)y';
SELECT 'xababy' REGEXP 'x(ab)*y';
SELECT 'xababy' REGEXP 'x(ab){1,2}y';

MySQL的多表操作

多表关系

 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系。

在这里插入图片描述
MySQL多表之间的关系可以概括为:一对一、一对多/多对一关系,多对多

一对一关系:
一个学生只有一张身份证;一张身份证只能对应一学生。
在任一表中添加唯一外键,指向另一方主键,确保一对一关系。
一般一对一关系很少见,遇到一对一关系的表最好是合并表。

在这里插入图片描述
一对多/多对一关系:
部门和员工
分析:一个部门有多个员工,一个员工只能对应一个部门
实现原则:在多的一方建立外键,指向一的一方的主键

在这里插入图片描述
多对多关系:
学生和课程
分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择
原则:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,将多对多的关系,拆成一对多的 关系,中间表至少要有两个外键,这两个外键分别指向原来的那两张表的主键
在这里插入图片描述

外键约束:

MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。
在这里插入图片描述
定义一个外键时,需要遵守下列规则:

主表必须已经存在于数据库中,或者是当前正在创建的表。

必须为主表定义主键。

主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这 个外键的内容就是正确的。

在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。

外键中列的数目必须和主表的主键中列的数目相同。

外键中列的数据类型必须和主表主键中对应列的数据类型相同。

-- 外键约束
--  语句格式
--          [constraint <外键名>] foreign key 字段名 [,字段名2,…] references <主表名> 主键列1 [,主键列2,…]

-- 例如:
 create table if not EXISTS dept(
	deptno varchar(20) PRIMARY KEY,
	name varchar(20)
 );
-- 在创建表时添加外键
create table if not exists emp(
	eid varchar(20) PRIMARY KEY,
	ename varchar(20),
	age int,
	dept_id VARCHAR(20),
	constraint emp_fk foreign key (dept_id) REFERENCES dept(deptno)
);
--  方式2-在创建表时设置外键约束
-- 语法 : alter table <数据表名> add constraint <外键名> foreign key(<列名>) references  <主表名> (<列名>);

-- 创建部门表
create table if not exists dept2(
  deptno varchar(20) primary key ,  -- 部门号
  name varchar(20) -- 部门名字
);
-- 创建员工表
create table if not exists emp2(
  eid varchar(20) primary key,
  ename varchar(20),
  age int,
  dept_id varchar(20)
);

-- 创建外键约束
alter table emp2 add constraint dept_id_fk foreign key(dept_id) references dept2 (deptno);

-- 1、添加主表数据
 -- 注意必须先给主表添加数据
insert into dept values('1001','研发部');
insert into dept values('1002','销售部');
insert into dept values('1003','财务部');
insert into dept values('1004','人事部');

-- 2、添加从表数据
  -- 注意给从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列
insert into emp values('1','乔峰',20, '1001');
insert into emp values('2','段誉',21, '1001');
insert into emp values('3','虚竹',23, '1001');
insert into emp values('4','阿紫',18, '1002');
insert into emp values('5','扫地僧',35, '1002');
insert into emp values('6','李秋水',33, '1003');
insert into emp values('7','鸠摩智',50, '1003'); 
insert into emp values('8','天山童姥',60, '1005');  -- 不可以

-- 3、删除数据
 /*
   注意:
       1:主表的数据被从表依赖时,不能删除,否则可以删除
       2: 从表的数据可以随便删除
 */
delete from dept where deptno = '1001'; -- 不可以删除
delete from dept where deptno = '1004'; -- 可以删除
delete from emp where eid = '7'; -- 可以删除

-- 删除外键约束
-- 语法 ;alter table <表名> drop foreign key <外键约束名>;

alter table emp2 drop FOREIGN key dept_id_fk;
外键约束-多对多关系

在多对多关系中,A表的一行对应B的多行,B表的一行对应A表的多行,我们要新增加一个中间表,来建立多对多关系
在这里插入图片描述

-- 学生表和课程表(多对多)
	-- 1 创建学生表student(左侧主表)
   create table if not exists student(
    sid int primary key auto_increment,
    name varchar(20),
    age int,
    gender varchar(20)
   );
  -- 2 创建课程表course(右侧主表)
  create table course(
   cid  int primary key auto_increment,
   cidname varchar(20)
  );
	-- 3创建中间表student_course/score(从表)
  create table score(
    sid int,
    cid int,
    score double
  );
	-- 4建立外键约束(2次)
	alter table score add foreign key(sid) references 	student(sid);
	alter table score add foreign key(cid) references course(cid);
-- 5给学生表添加数据
insert into student values(1,'小龙女',18,'女'),(2,'阿紫',19,'女'),(3,'周芷若',20,'男');
-- 6给课程表添加数据
insert into course values(1,'语文'),(2,'数学'),(3,'英语');
-- 7给中间表添加数据
insert into score values(1,1),(1,2),(2,1),(2,3),(3,2),(3,3);

MySQL的多表操作-多表联合查询

多表查询就是同时查询两个或两个以上的表,因为有的时候用户在查看数据的时候,需要显示的数据来自多张表.
多表查询有以下分类:

1、交叉连接查询 [产生笛卡尔积,了解]

  -- 语法:select * from A,B; 

2、内连接查询(使用的关键字 inner join – inner可以省略)

 -- 隐式内连接(SQL92标准):
 	select * from A,B where 条件;
 -- 显示内连接(SQL99标准):
   select * from A inner join B on 条件;

3、外连接查询(使用的关键字 outer join – outer可以省略)

  -- 左外连接:left outer join
            select * from A left outer join B on 条件;
       -- 右外连接:right outer join
            select * from A right outer join B on 条件;
       -- 满外连接: full outer join
             select * from A full outer join B on 条件;

子查询
select的嵌套
表自关联:
将一张表当成多张表来用

-- 创建部门表
create table if not exists dept3(
  deptno varchar(20) primary key ,  -- 部门号
  name varchar(20) -- 部门名字
);
 
-- 创建员工表
create table if not exists emp3(
  eid varchar(20) primary key , -- 员工编号
  ename varchar(20), -- 员工名字
  age int,  -- 员工年龄
  dept_id varchar(20)  -- 员工所属部门
);
-- 给emp表添加数据
insert into emp3 values('1','乔峰',20, '1001');
insert into emp3 values('2','段誉',21, '1001');
insert into emp3 values('3','虚竹',23, '1001');
insert into emp3 values('4','阿紫',18, '1001');
insert into emp3 values('5','扫地僧',85, '1002');
insert into emp3 values('6','李秋水',33, '1002');
insert into emp3 values('7','鸠摩智',50, '1002'); 
insert into emp3 values('8','天山童姥',60, '1003');
insert into emp3 values('9','慕容博',58, '1003');
insert into emp3 values('10','丁春秋',71, '1005');

-- 给dept3表添加数据
insert into dept3 values('1001','研发部');
insert into dept3 values('1002','销售部');
insert into dept3 values('1003','财务部');
insert into dept3 values('1004','人事部');

-- 交叉连接查询
-- 语法:select * from 表1,表2,表3….;
select * from dept3,emp3;


-- 内连接查询
		-- 内连接查询求多张表的交集
-- 隐式内连接(SQL92标准):select * from A,B where 条件; 
-- 显示内连接(SQL99标准):select * from A inner join B on 条件;

-- 查询每个部门的所属员工
select * from dept3,emp3 where dept3.deptno = emp3.dept_id;
select * from dept3 inner join emp3 on dept3.deptno = emp3.dept_id;
-- 查询研发部和销售部的所属员工
select * from dept3,emp3 where dept3.deptno = emp3.dept_id and name in( '研发部','销售部');
select * from dept3 join emp3 on dept3.deptno = emp3.dept_id and name in( '研发部','销售部');

-- 查询每个部门的员工数,并升序排序
select deptno,count(1) as total_cnt from dept3,emp3 where dept3.deptno = emp3.dept_id group by deptno order by total_cnt;
select deptno,count(1) as total_cnt from dept3 join emp3 on dept3.deptno = emp3.dept_id group by deptno order by total_cnt;

-- 查询人数大于等于3的部门,并按照人数降序排序
select deptno,count(1) as total_cnt from dept3,emp3 where dept3.deptno = emp3.dept_id group by deptno having total_cnt >= 3 order by total_cnt desc;
 
select deptno,count(1) as total_cnt from dept3 join emp3 on dept3.deptno = emp3.dept_id group by deptno having total_cnt >= 3 order by total_cnt desc;
外连接查询

外连接分为左外连接(left outer join)、右外连接(right outer join),满外连接(full outer join)。
注意:oracle里面有full join,可是在mysql对full join支持的不好。我们可以使用union来达到目的。

 左外连接:left outer join
            select * from A left outer join B on 条件;
  右外连接:right outer join
            select * from A right outer join B on 条件;
  满外连接: full outer join
             select * from A full outer join B on 条件;
-- 查询哪些部门有员工,哪些部门没有员工
select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id;
 
-- 查询哪些员工有对应的部门,哪些没有
select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;
 
 
-- 使用union关键字实现左外连接和右外连接的并集
select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id
union 
select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;
子查询

子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一点就是包含select嵌套的查询。

子查询可以返回的数据类型一共分为四种:
1、单行单列:返回的是一个具体列的内容,可以理解为一个单值数据;
2、单行多列:返回一行数据中多个列的内容;
3、多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围;
4、多行多列:查询返回的结果是一张临时表

-- 查询年龄最大的员工信息,显示信息包含员工号、员工名字,员工年龄
select eid,ename,age from emp3 where age = (select max(age) from emp3);
 
 
-- 查询年研发部和销售部的员工信息,包含员工号、员工名字
select eid,ename,t.name from emp3 where dept_id in (select deptno,name from dept3 where name = '研发部' or name = '销售部') ;
 
 
-- 查询研发部20岁以下的员工信息,包括员工号、员工名字,部门名字
select eid,age,ename,name from (select * from dept where name = '研发部 ')t1,(select * from emp3 where age <20)t2
子查询关键字

在子查询中,有一些常用的逻辑关键字,这些关键字可以给我们提供更丰富的查询功能,主要关键字如下:

1.ALL关键字
ALL: 与子查询返回的所有值比较为true 则返回true
ALL可以与=、>、>=、<、<=、<>结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据。
ALL表示指定列中的值必须要大于子查询集的每一个值,即必须要大于子查询集的最大值;如果是小于号即小于子查询集的最小值。同理可以推出其它的比较运算符的情况。

selectfromwhere c > all(查询语句)
--等价于:
select ...from ... where c > result1 and c > result2 and c > result3
-- 查询年龄大于‘1003’部门所有年龄的员工信息
select * from emp3 where age > all(select age from emp3 where dept_id = '1003);
-- 查询不属于任何一个部门的员工信息 
select * from emp3 where dept_id != all(select deptno from dept3);

2.ANY关键字

3.SOME关键字

4.IN关键字

5.EXISTS关键字

四级标题
五级标题
六级标题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值