MySQL进阶使用

Flannel,Calico 和 Cilium 之间有哪些优缺点和差别? 例如,在一个多租户的容器集群中,可以通过Calico为不同租户的容器设置精细的访问控制策略,确保每个租户的资源安全。例如,在设置复杂的网络策略和BGP路由时,需要对网络概念和Calico的配置语法有比较深入的了解。它可以根据容器的标签、服务等信息来定义访问规则,并且可以实现更加细粒度的网络安全策略,如HTTP层的策略。性能损耗:在overlay网络模式下(如VXLAN),由于需要对数据包进行额外的封装和解封装操作,会带来一定的性能损耗,尤其是在高流量的场景下,这种性能损耗可能会更加明显。 阅读详情

【第一章】约束【重点】

外键约束

问题:什么是外键约束以及外键约束的作用是什么?

当一个表中需要使用到另一个表的的数据时,但是又要保证数据的正确性,可以是用外键约束。如下图。

外键约束语法

CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名)

添加外键

建表时添加外键

-- 创建user用户表(主表)
CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT,    -- id
	NAME VARCHAR(20) NOT NULL             -- 姓名
);
-- 添加用户数据
INSERT INTO USER VALUES (NULL,'张三'),(NULL,'李四');

-- 创建orderlist订单表(从表)
CREATE TABLE orderlist(
	id INT PRIMARY KEY AUTO_INCREMENT,    -- id
	number VARCHAR(20) NOT NULL,          -- 订单编号
	uid INT,			      -- 外键列
	CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)
);
-- 添加订单数据
INSERT INTO orderlist VALUES (NULL,'hm001',1),(NULL,'hm002',1),
(NULL,'hm003',2),(NULL,'hm004',2);

建表后添加外键

-- 语法
alter table 表名 add constraint 外键名称 foreign key(外键列) references 主表(主键);
-- orderlist中的uid关联user表中的id列
alter table orderlist add constraint fk foreign key(uid) references user(id);

删除外键

-- 语法
alter table 表名 drop foreign key 外键名称;
-- 删除orderlist表中的外键
alter table orderlist drop foreign key ou_fk1;

外键级联操作(了解)

外键让多个表之间产生了关系,但是如果主表中的数据所有改变,从表中关联的数据也必须跟着改变。这叫做外键级联操作。

-- 添加外键级联更新、级联删除
-- ON UPDATE CASCADE 级联更新
-- ON DELETE CASCADE 级联删除
ALTER TABLE 从表 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键列) REFERENCES 主表(主键列) ON UPDATE CASCADE ON DELETE CASCADE;

【第二章】多表操作【重点】

多表关系

问题1:多表关系有哪几种?

问题2:思考:学生和班级属于哪一种?商品和订单属于哪一种?

在实际项目开发的时候可能设计到多张表,表与表之间存在一定关系,如何设计表之间的关系让系统更加优化,需要考虑到多表之间关系,学习多表关系主要就是学习多表的建表原则。

1. 一对一(了解)
	* 如:人和身份证
	* 分析:一个人只有一个身份证,一个身份证只能对应一个人
2. 一对多(多对一)
	* 如:部门和员工
	* 分析:一个部门有多个员工,一个员工只能对应一个部门
3. 多对多
	* 如:学生和课程
	* 分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择

一对一关系

问题:一对一关系中如何添加外键?

一个人有一个身份证号码,一个身份证号码只对应一个人

 

-- 创建身份证表
CREATE TABLE card(
	id INT PRIMARY KEY,
	number VARCHAR(18)
);
-- 设置身份证号码唯一
ALTER TABLE card MODIFY number VARCHAR(20) UNIQUE;

INSERT INTO card(id,number) VALUES(1,420923199211090512);
INSERT INTO card(id,number) VALUES(2,420923199310230807);
INSERT INTO card(id,number) VALUES(3,420923199007080908);

-- 创建人员表
CREATE TABLE person(
	id INT PRIMARY KEY,
	NAME VARCHAR(20),
	cid INT
);
-- 给人员表添加外键
ALTER TABLE person ADD CONSTRAINT cid_kf FOREIGN KEY(cid) REFERENCES card(id);
-- 设置外键唯一
ALTER TABLE person MODIFY cid INT UNIQUE;

-- 向person表中添加数据
INSERT INTO person(id,NAME,cid) VALUES(1,"张三",1);
INSERT INTO person(id,NAME,cid) VALUES(2,"李四",2);
INSERT INTO person(id,NAME,cid) VALUES(3,"王五",3);

==建表原则:在任意一个表建立唯一(UNIQUE)外键,去关联另外一个表的主键。==

一对多关系

问题:一对多关系中如何添加外键?

一个部门可以有多个员工,一个员工只能对应一个部门

-- 创建部门表(主表)
CREATE TABLE department(
	id INT PRIMARY KEY,
	NAME VARCHAR(20)
);
-- 向部门表中添加数据
INSERT INTO department(id,NAME) VALUES(1,"教研部");
INSERT INTO department(id,NAME) VALUES(2,"学工部");
INSERT INTO department(id,NAME) VALUES(3,"就业部");

SELECT * FROM department;

-- 创建员工表(从表)
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20) NOT NULL,
	age INT,
	dep_id INT,
	CONSTRAINT emp_depid_fk FOREIGN KEY(dep_id) REFERENCES department(id)
);
-- 向员工表中添加数据
INSERT INTO employee(NAME,age,dep_id) VALUES("张三",18,1);
INSERT INTO employee(NAME,age,dep_id) VALUES("李四",20,2);
INSERT INTO employee(NAME,age,dep_id) VALUES("王五",21,1);
INSERT INTO employee(NAME,age,dep_id) VALUES("赵六",19,3);
INSERT INTO employee(NAME,age,dep_id) VALUES("田七",24,2);
INSERT INTO employee(NAME,age,dep_id) VALUES("周八",23,3);
INSERT INTO employee(NAME,age,dep_id) VALUES("黄九",25,1);

SELECT * FROM employee;

==建表原则:在多的一方建立外键约束指向一的一方主键。==

多对多关系

问题:多对多关系中如何添加外键?

一个学生可以选择很多门课程,一个课程也可以被很多学生选择

 

-- 创建学生表
CREATE TABLE student(
	sid INT PRIMARY KEY,
	NAME VARCHAR(20),
	age INT
);
INSERT INTO student(sid,NAME,age) VALUES(1,"张三",20);
INSERT INTO student(sid,NAME,age) VALUES(2,"李四",19);
INSERT INTO student(sid,NAME,age) VALUES(3,"王五",18);
INSERT INTO student(sid,NAME,age) VALUES(4,"赵六",21);
INSERT INTO student(sid,NAME,age) VALUES(5,"田七",24);
INSERT INTO student(sid,NAME,age) VALUES(6,"周八",23);

-- 创建课程表
CREATE TABLE class(
	cid INT PRIMARY KEY,
	NAME VARCHAR(20)
);
INSERT INTO class(cid,NAME) VALUES(1,"Java基础");
INSERT INTO class(cid,NAME) VALUES(2,"HTML");
INSERT INTO class(cid,NAME) VALUES(3,"Javascript");
INSERT INTO class(cid,NAME) VALUES(4,"mysql");

-- 创建外键表
CREATE TABLE foreign_table(
	sid INT,
	cid INT,
	CONSTRAINT sid_fk FOREIGN KEY(sid) REFERENCES student(sid), -- 外键sid 关联 student sid主键
	CONSTRAINT cid_fk FOREIGN KEY(cid) REFERENCES class(cid)   -- 外键cid 关联 class cid主键
);
INSERT INTO foreign_table(sid,cid) VALUES(1,1);
INSERT INTO foreign_table(sid,cid) VALUES(1,2);
INSERT INTO foreign_table(sid,cid) VALUES(1,3);
INSERT INTO foreign_table(sid,cid) VALUES(1,4);
INSERT INTO foreign_table(sid,cid) VALUES(2,1);
INSERT INTO foreign_table(sid,cid) VALUES(2,2);
INSERT INTO foreign_table(sid,cid) VALUES(3,4);
INSERT INTO foreign_table(sid,cid) VALUES(3,1);

==建表原则:创建一张中间表,在中间表中至少有两列作为外键分别指向多对多双方的主键。==

建表原则总结

一对一建表原则:在任意一方添加唯一外键指向另一方的主键字段或者唯一非空字段
一对多/多对一建表原则:在多的一方添加外键指向一的一方主键字段或者唯一非空字段。
多对多建表原则:创建一张中间表,在中间表中至少有两个字段作为外键分别指向多对多双方的主键。

多表查询

准备数据

-- 创建db4数据库
CREATE DATABASE db4;
-- 使用db4数据库
USE db4;

-- 创建user表
CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT,	-- 用户id
	NAME VARCHAR(20),			-- 用户姓名
	age INT                                 -- 用户年龄
); 

-- 添加数据
INSERT INTO USER VALUES (1,'张三',23);
INSERT INTO USER VALUES (2,'李四',24);
INSERT INTO USER VALUES (3,'王五',25);
INSERT INTO USER VALUES (4,'赵六',26);


-- 订单表
CREATE TABLE orderlist(
	id INT PRIMARY KEY AUTO_INCREMENT,	-- 订单id
	number VARCHAR(30),			-- 订单编号
	uid INT,    -- 外键字段
	CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)
);
-- 添加数据
INSERT INTO orderlist VALUES (1,'hm001',1);
INSERT INTO orderlist VALUES (2,'hm002',1);
INSERT INTO orderlist VALUES (3,'hm003',2);
INSERT INTO orderlist VALUES (4,'hm004',2);
INSERT INTO orderlist VALUES (5,'hm005',3);
INSERT INTO orderlist VALUES (6,'hm006',3);
INSERT INTO orderlist VALUES (7,'hm007',NULL);


-- 商品分类表
CREATE TABLE category(
	id INT PRIMARY KEY AUTO_INCREMENT,  -- 商品分类id
	NAME VARCHAR(10)                    -- 商品分类名称
);
-- 添加数据
INSERT INTO category VALUES (1,'手机数码');
INSERT INTO category VALUES (2,'电脑办公');
INSERT INTO category VALUES (3,'烟酒茶糖');
INSERT INTO category VALUES (4,'鞋靴箱包');


-- 商品表
CREATE TABLE product(
	id INT PRIMARY KEY AUTO_INCREMENT,   -- 商品id
	NAME VARCHAR(30),                    -- 商品名称
	cid INT, -- 外键字段
	CONSTRAINT cp_fk1 FOREIGN KEY (cid) REFERENCES category(id)
);
-- 添加数据
INSERT INTO product VALUES (1,'华为手机',1);
INSERT INTO product VALUES (2,'小米手机',1);
INSERT INTO product VALUES (3,'联想电脑',2);
INSERT INTO product VALUES (4,'苹果电脑',2);
INSERT INTO product VALUES (5,'中华香烟',3);
INSERT INTO product VALUES (6,'玉溪香烟',3);
INSERT INTO product VALUES (7,'计生用品',NULL);


-- 中间表
CREATE TABLE us_pro(
	upid INT PRIMARY KEY AUTO_INCREMENT,  -- 中间表id
	uid INT, -- 外键字段。需要和用户表的主键产生关联
	pid INT, -- 外键字段。需要和商品表的主键产生关联
	CONSTRAINT up_fk1 FOREIGN KEY (uid) REFERENCES USER(id),
	CONSTRAINT up_fk2 FOREIGN KEY (pid) REFERENCES product(id)
);
-- 添加数据
INSERT INTO us_pro VALUES (NULL,1,1);
INSERT INTO us_pro VALUES (NULL,1,2);
INSERT INTO us_pro VALUES (NULL,1,3);
INSERT INTO us_pro VALUES (NULL,1,4);
INSERT INTO us_pro VALUES (NULL,1,5);
INSERT INTO us_pro VALUES (NULL,1,6);
INSERT INTO us_pro VALUES (NULL,1,7);
INSERT INTO us_pro VALUES (NULL,2,1);
INSERT INTO us_pro VALUES (NULL,2,2);
INSERT INTO us_pro VALUES (NULL,2,3);
INSERT INTO us_pro VALUES (NULL,2,4);
INSERT INTO us_pro VALUES (NULL,2,5);
INSERT INTO us_pro VALUES (NULL,2,6);
INSERT INTO us_pro VALUES (NULL,2,7);
INSERT INTO us_pro VALUES (NULL,3,1);
INSERT INTO us_pro VALUES (NULL,3,2);
INSERT INTO us_pro VALUES (NULL,3,3);
INSERT INTO us_pro VALUES (NULL,3,4);
INSERT INTO us_pro VALUES (NULL,3,5);
INSERT INTO us_pro VALUES (NULL,3,6);
INSERT INTO us_pro VALUES (NULL,3,7);
INSERT INTO us_pro VALUES (NULL,4,1);
INSERT INTO us_pro VALUES (NULL,4,2);
INSERT INTO us_pro VALUES (NULL,4,3);
INSERT INTO us_pro VALUES (NULL,4,4);
INSERT INTO us_pro VALUES (NULL,4,5);
INSERT INTO us_pro VALUES (NULL,4,6);
INSERT INTO us_pro VALUES (NULL,4,7);

连接查询

内连接查询

语法

-- 显示内连接查询【了解】,中括号中的内容表示可以省略
SELECT 列名 FROM 表名1 [INNER] JOIN 表名2 ON 关联条件 [where 其他条件];
SELECT 列名 FROM 表名1 [INNER] JOIN 表名2 ON 关联条件 [INNER] JOIN 表名3 ON 关联条件 ... [where 其他条件];

-- 隐式内连接查询
SELECT 列名 FROM 表名1,表名2,... WHERE 关联条件或者其他条件; 

查询原理

内连接查询的是两张表有交集的部分数据(有主外键关联的数据)。

举例

-- 查询用户信息和对应的订单信息,使用显示内连接
SELECT * FROM USER INNER JOIN orderlist ON user.id=orderlist.uid;
-- 查询用户信息和对应的订单信息,使用隐式内连接
select * from user,orderlist where user.id=orderlist.uid;

-- 查询用户姓名、用户年龄和对应的订单编号。起别名
select -- 查询的列
	u.name,
	u.age,
	o.number 
from 	-- 查询的表
	user u,
	orderlist  o
where 	-- 查询的条件
	u.id=o.uid;

外连接查询

语法

-- 左外连接查询:左表中所有的数据,以及左右表交集的数据
SELECT 列名 FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 条件 [where 其他条件];

-- 右外连接查询:右边中所有的数据,以及左右表交集的数据
SELECT 列名 FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 条件 [where 其他条件];

左外连接查询原理

查询左表的全部数据,和左右两张表有交集部分的数据。

右外连接查询原理

查询右表的全部数据,和左右两张表有交集部分的数据。

举例

-- 查询所有用户信息,以及用户对应的订单信息,使用左外连接
SELECT
	u.*,
	o.number
FROM
	USER u
	LEFT OUTER JOIN
	orderlist o
ON
	o.uid=u.id;

-- 查询所有订单信息,以及订单所属的用户信息,使用右外连接
SELECT
	u.*,
	o.number
FROM
	USER u
	RIGHT OUTER JOIN
	orderlist o
ON
	o.uid=u.id;

子查询

概念

查询语句中嵌套了查询语句,我们就将嵌套的查询称为子查询。

换一句话说:将一个查询的结果作为另一个查询的条件或者虚拟表连接,这样的查询就叫做子查询。

子查询的结果是单行单列

使用场景:子查询的结果是一行一列,可以将子查询的结果当做某一个字段的值,作为where子句的条件;

-- 查询用户最大的年龄
SELECT MAX(age) FROM USER;

-- 查询年龄最大的用户姓名
select name ,age from user where age=(select max(age) from user); 

子查询的结果是多行单列

使用场景:子查询的结果是多行单列,可以将子查询的结果当做某一个字段的多个值,作为where子句的条件。

-- 查询张三和李四的id
select id from user where name in('张三','李四');

-- 查询张三和李四的订单信息
select * from orderlist where uid in (select id from user where name in('张三','李四'));

子查询的结果是多行多列

使用场景:子查询的结果是多行多列,可以将子查询的结果当做一个表来看待,并和其他表进行连接查询。

-- 查询订单表中id>4的订单信息
select * from orderlist where id>4;

-- 查询订单表中id大于4的订单信息和所属用户信息
select u.name,o.number from user u ,(select * from orderlist where id>4) o where o.uid=u.id;

==总结:子查询可以作为条件也可以作为虚拟表和其他表连接查询,如果是作为条件,那么子查询结果一定是单列的,如果子查询结果有多列,那么必须作为虚拟表和其他表连接查询。==

自关联查询

概念

在同一张表中数据有关联性,我们可以把这张表当成多个表来查询。

准备数据

-- 创建员工表
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,	-- 员工编号
	NAME VARCHAR(20),			-- 员工姓名
	mgr INT,				-- 上级编号
	salary DOUBLE				-- 员工工资
);
-- 添加数据
INSERT INTO employee VALUES (1001,'孙悟空',1005,9000.00),
(1002,'猪八戒',1005,8000.00),
(1003,'沙和尚',1005,8500.00),
(1004,'小白龙',1005,7900.00),
(1005,'唐僧',NULL,15000.00),
(1006,'武松',1009,7600.00),
(1007,'李逵',1009,7400.00),
(1008,'林冲',1009,8100.00),
(1009,'宋江',NULL,16000.00);
-- 查询所有员工的姓名及其直接上级的姓名,没有上级的员工也需要查询
/*
分析
	员工信息 employee表
	条件:employee.mgr = employee.id
	查询左表的全部数据,和左右两张表有交集部分数据,左外连接
*/
SELECT
	e1.id,
	e1.name,
	e1.mgr,
	e2.id,
	e2.name
FROM
	employee e1
LEFT OUTER JOIN
	employee e2
ON
	e1.mgr = e2.id;

多表查询练习

  1. 查询用户的编号、姓名、年龄。订单编号

/*
分析:
	查询的表:用户表(user),订单表(orderlist)
	查询的字段:用户编号,姓名,年龄,订单编号
	查询的条件:user.id=orderlist.uid
*/

select
	u.id,u.name,u.age,o.number
from 
	user u,orderlist o
where 
	u.id=o.uid;

查询所有的用户。用户的编号、姓名、年龄。订单编号

/*
分析:
	查询的表:用户表(user),订单表(orderlist)。 所有用户,左外连接
	查询的字段:用户编号,姓名,年龄,订单编号
	查询的条件:orderlist.uid = user.id
*/

select 
	u.id,u.name,u.age,o.number
from 
	user u 
left join
	orderlist o 
on
	u.id=o.uid;

查询所有的订单。用户的编号、姓名、年龄。订单编号

/*
分析:
	查询的表:用户表(user),订单表(orderlist)。所有订单,忧外连接
	查询的字段:用户的编号、姓名、年龄、订单编号
	查询的条件:orderlist.uid = user.id
*/

select 
	u.id,u.name,u.age,o.number
from 
	user u 
right join
	orderlist o
on 
	o.uid=u.id;

查询用户年龄大于23岁的信息。显示用户的编号、姓名、年龄。订单编号

/*
分析:
	查询的表:用户表(user),订单表(orderlist)
	查询的字段:用户的编号、姓名、年龄。订单编号
	查询的条件:user.id=orderlist.uid and user.age>23
*/

select 
	u.id,u.name,u.age,o.number
from 
	user u,orderlist o
where 
	u.id=o.uid and u.age>23;
  1. 查询张三和李四用户的信息。显示用户的编号、姓名、年龄。订单编号

/*
分析:
	查询的表:用户表(user),订单表(orderlist)
	查询的字段:显示用户的编号、姓名、年龄。订单编号
	查询的条件:user.name in ("张三","李四") and user.id=orderlist.uid;
*/

select 
	u.id,u.name,u.age,o.number
from 
	user u,
	orderlist o
where 
	u.id=o.uid and u.name in ("张三","李四");
  1. 查询商品分类的编号、分类名称。分类下的商品名称

/*
分析:
	查询的表:商品表(product)、分类表(category)
	查询的字段:商品分类的编号、分类名称、商品名称
	查询的条件:product.cid=category.id
*/

select 
	c.id,c.name,p.name
from 
	product p,
	category c
where 
	p.cid=c.id;
  1. 查询所有的商品分类。商品分类的编号、分类名称。分类下的商品名称

/*
分析:
	查询的表:商品表(product)、分类表(category)
	查询的字段:商品分类的编号(id)、分类名称(name)、商品名称(name)
	查询的条件:product.cid=category.id
*/
select 
	c.id,c.name,p.name
from 
	product p 
right join
	category c
on 
	p.cid=c.id;
  1. 查询所有的商品信息。商品分类的编号、分类名称。分类下的商品名称

/*
分析:
	查询的表:商品表(product)、分类表(category)
	查询的字段:商品分类的编号(id)、分类名称(name)、商品名称(name)
	查询的条件:product.cid=category.id
*/

select 
	c.id,c.name,p.name
from 
	product p 
left join
	category c
on 
	p.cid=c.id;
  1. 查询所有的用户和该用户能查看的所有的商品。显示用户的编号、姓名、年龄。商品名称

/*
分析:
	查询的表:用户表(user),商品表(product),中间表(us_pro)
	查询的字段:用户的编号、姓名、年龄。商品名称
	查询的条件:user.id=us_pro.uid and product.id=us_pro.pid;
*/

select 
	u.id,u.name,u.age,p.name
from 
	user u,
	product p,
	us_pro up
where 
	u.id=up.uid and p.id=up.pid;

  1. 查询张三和李四这两个用户可以看到的商品。显示用户的编号、姓名、年龄。商品名称

/*
分析:
	查询的表:用户表(user),商品表(product),中间表(us_pro)
	查询的字段:用户的编号、姓名、年龄。商品名称
	查询的条件:
		user.name in ("张三","李四")
        and us_pro.uid=user.id;
        and us_pro.pid=product.id;
*/

select 
	u.id,u.name,u.age,p.name
from 
	user u,product p,us_pro up
where 
	u.name in ("张三","李四") and up.uid=u.id and up.pid=p.id;

总结

1 约束:对表中的数据进行限制,保证数据的正确性、有效性。
	单表约束:
		主键约束:主键字段默认非空且唯一,一个表中只能有一个主键,一般主键作为一条数据的唯一标识
		主键自增约束:一般是给主键字段添加自增,自增字段的类型必须是整型。
		唯一约束:保证某列数据不重复
		非空约束:保证某列数据没有null值
		
		核心:创建表时添加约束
		create table 表名(
			id int primary key auto_increment,
			列2 值2 unique not null ...,
			...
			列n 值n 约束 约束 ...
		);
		
		create table 表名(
			id int auto_increment,
			列2 值2 unique not null ...,
			...
			列n 值n 约束 约束 ...,
			primary key(id)
		);
		
	多表约束:
		外键约束:当一个表(A表)中的某个字段值都来自于另一张表(B表)的主键时,那么就需要约束A表的字段的值,这个约束就叫做外键约束。
		语法:
			create table 表名(
			   id int auto_increment,
                列2 值2 unique not null ...,
                ...
                列n 值n 约束 约束 ...,
                CONSTRAINT 外键名称 FOREIGN KEY(列名) REFERENCES 主表(主键)
			);
2 多表关系以及建表原则(添加外键)
	一对一:在任意一方添加一个外键指向另一方的主键,但是外键还必须添加唯一约束(unique)
	一对多/多对一:在多的一方添加外键指向一的一方的主键。
	多对多:创建一张中间表,中间表中至少有两个字段作为外键分别指向多对多双方的主键。
	
3 多表查询
	3.1 内连接
	语法:
		显示内连接:
		select * from 表1 [inner] join 表2 on 关联条件 [where 其他条件]
		select * from 表1 [inner] join 表2 on 关联条件 [inner] join 表3 on 关联条件 ... [where 其他条件]
		
		隐式内连接:
		select * from 表1,表2,... where 关联条件或者其他条件
	查询结果:多张表的交集数据,也就是主外键能连接的数据。
	
	3.2 外连接
	语法:
		左外连接:
		select * from 表1 left [outer] join 表2 on 关联条件 [where 其他条件]
		右外连接:
		select * from 表1 right [outer] join 表2 on 关联条件 [where 其他条件]
	查询结果:
		左外连接:查询左边表(前面的表)的全部数据,加上和右边表的交集数据。
		右外连接:查询右边表(后面的表)的全部数据,加上和左边表的交集数据。
	3.3 子查询
	概念:查询中嵌套查询,将一个查询的结果作为另一个查询的条件或者虚拟表进行连接,就叫做子查询。		
	语法:
		子查询作为条件:子查询结果必须是单列的
			select * from 表 where 列名=(子查询);  -- 子查询结果是单行单列的
			select * from 表 where 列名 in (子查询);  -- 子查询结果是多行单列的
		子查询作为虚拟表:子查询结果可以是多列的
			select * from 表1,(子查询) where 条件
	3.4 自关联查询
	概念:表自己关联自己,可以使用内连接、外连接。

用树莓派Pico低成本更新USB-C PD控制器固件实战指南 固件更新是嵌入式系统开发与维护中的核心环节,它直接决定了硬件设备的功能、性能与兼容性。其原理通常是通过特定的通信接口(如SWD、JTAG、UART或USB)与设备内部的Bootloader建立连接,将新的程序代码安全写入非易失性存储器。在USB Power Delivery(PD)和Type-C生态中,固件更新技术尤为重要,它能修复协议握手Bug、适配新设备并提升供电策略的灵活性。本文聚焦于一个典型的工程实践场景:如何利用广泛普及且成本极低的树莓派Pico开发板,作为USB-C协议到I²C协议的转换桥,实现 阅读详情

相关推荐

OpencvSharp学习笔记(一):图片的打开,保存灰度化,保存

近来萌生了学习OpenCv的想法,经过度娘得知老夫会的C#不能直接用OpenCv,只能用他的儿子OpenCvSharp与EmguCV,奈何奈何,这两玩意的资料少的出奇,只能慢慢的摸索了,EmguCV先不说,老夫找到了牛批的资料,先摸索OpencvSharp吧 首先打开VS通过Nuget安装 选择版本后点击安装就OK了. 安装完成后,引用里面就有以下的玩意儿了… 废话不多说了,在写程序前先 using OpenCvSharp 图片打开,灰度化,保存代码如下: static void Main(strin

猥琐de专注 7186

MYSQL查询结果作为另外条件的数据_sql中引用一个表的查询结果作为条件来查询另一个表如何实现?...

展开全部sql中引用一个表的查询结果作为条件来查询另一个表称为sql嵌套查询。简单子查询示例:Copyselect name,age from personwhere age >( select age from personwhere name = '孙权62616964757a686964616fe4b893e5b19e31333433626564')in嵌套查询in关键字...

weixin_39964819的博客 1万+

电赛备赛笔记:用STM32驱动AD9959信号发生器模块,从接线到出波保姆级教程

本文详细介绍了如何使用STM32驱动AD9959信号发生器模块,从硬件接线到软件调试的全流程。AD9959作为高性能DDS芯片,适用于电子设计竞赛中的信号生成需求。文章包含硬件连接指南、寄存器配置解析、多通道控制技巧以及常见问题解决方案,帮助参赛者快速掌握AD9959的应用。

weixin_31858171的博客 366

将 mysql 查询结果作为另一个表的查询条件

举栗子:deletefromtawhereidin(selectmax(id)fromta)上述语句报错:[Err]1093-Youcan'tspecifytargettable'ta'forupdateinFROMclause这是因为:在 mysql 中,不能先 select 一个表的记录,在按此条件进行更新和删除同一个表的记录。...

weixin_33826609的博客 2万+

AI+医疗:多模态模型让肺结节诊断准确率突破95%+的实战方案

多模态融合是必由之路:单一影像模型难以突破95%准确率,必须整合临床、生物标志物等多维数据跨模态注意力机制是核心:简单拼接效果差,注意力机制能自动学习各模态权重,提升融合效果临床适配比技术先进更重要:模型输出必须符合医生诊断习惯,提供可解释的决策依据持续学习是长期成功的关键:医疗数据分布不断变化,模型必须具备自适应能力多学科协作是保障:放射科、胸外科、病理科、AI工程师共同参与模型设计与优化。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1022

DBeaver 实战:手动配置 PostgreSQL JDBC 驱动的高级技巧

本文详细介绍了在DBeaver中手动配置PostgreSQL JDBC驱动的高级技巧。针对企业内网、多版本数据库兼容等场景,从获取官方驱动文件、创建自定义驱动配置,到使用Maven坐标管理、连接参数调优及解决常见连接问题,提供了完整的实战指南,帮助开发者实现对数据库连接环境的精准掌控。

apple5的专栏 835

如何把sql查询出来的结果当做另一个sql的条件查询

--table2的name作为table1的条件 select*fromtable1wherenamein(selectnamefromtable2) --如果有多条语句,可以使用字段相加再等于 select*fromtable1wherefld1+fld2in(selectfld1+fld2fromtable2) --也可以使用...

CAO11021的博客 1万+

HPE磁盘阵列管理04——MSA事件

本文介绍了HPE MSA存储系统的事件处理机制,重点分析了常见磁盘故障事件及其解决方案。文章首先定义了MSA事件的五个严重级别(严重、错误、警告、信息和解决),然后详细列举了多个典型事件案例(如事件1、3、6、8、172等),包括每种事件的触发条件、对系统的影响以及具体修复步骤。针对磁盘故障场景,文章提供了更换磁盘、重建磁盘组、取消隔离等操作建议,并强调应及时配置备用磁盘以降低数据风险。最后指出更详细的事件说明可参考《MSA事件描述参考指南》,并提供了HPE官方手册下载链接。全文为技术人员处理MSA存储故障

istrangeboy&begin zero的博客 1117

进阶MySQL使用指南

在掌握了MySQL的基础使用之后,你可能会对如何更高效地使用MySQL感兴趣。本文将介绍一些进阶技巧,包括索引的使用、事务处理、连接查询等,以帮助你更深入地了解MySQL的强大功能。

Mortal3306的博客 999

TOGAF架构内容—TOGAF 内容框架和企业元模型

TOGAF架构内容—TOGAF 内容框架和企业元模型

深圳市多克创新科技有限公司 1663

华为OD机考双机位C卷 - 天然蓄水库(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 天然蓄水库(OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1740

MySQL查询进阶——从函数到表连接的使用你还记得吗_mysql 熟悉吗 用过子函数表连接哪些吗

✅作者简介:C/C++领域新星创作者,为C++和java奋斗中📃推荐一款模拟面试、刷题神器👉🔥前言书接上文,今天学习查询的进阶操作,包括。

weixin_49617799的博客 791

基于SOLIDWORKS API的工业级插件开发指南

SOLIDWORKS API是基于COM技术的一套开发接口,支持C#、VB.NET等语言,用于自动化建模、属性管理、界面定制等功能。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 2744

【MySQL进阶使用语句与语法】

MySQL作为最流行的开源关系型数据库之一,广泛应用于各类互联网项目。掌握基础的增删改查(CRUD)后,进一步学习MySQL的进阶语法和优化技巧,将极大提升开发效率和系统性能。本文将系统介绍MySQL进阶用法,包括复杂查询、窗口函数、子查询、索引优化、事务控制等内容,并结合实际案例进行讲解。本文介绍了MySQL进阶语法和常用优化技巧,掌握这些内容可以帮助你写出更高效、更健壮的SQL语句。建议大家多实践、多用EXPLAIN分析SQL执行计划,持续优化数据库性能。如有问题或建议,欢迎评论区留言交流!

bojikeqian的博客 438

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

MySQL查询进阶——从函数到表连接的使用你还记得吗_mysql 熟悉吗 用过子函数表连接哪些吗 (1)

📃推荐一款模拟面试、刷题神器👉🔥前言书接上文,今天学习查询的进阶操作,包括。

2401_85015259的博客 852

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【MySQL 进阶之路】索引的使用

在数据库管理系统(DBMS)中,索引是提高查询效率的关键机制之一。MySQL索引优化是指通过设计、调整和选择合适的索引策略,以提高数据库的查询性能和降低资源消耗。

ajsbxi的博客 1084

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

MySQL从使用到进阶

MySQL从使用到进阶1.关系型数据库中的佼佼者2.MySQL数据库服务器3. MySQL 数据库服务器的优化方案4. MySQL 数据库的创建5.Mysql 数据表的创建6. Mysql 索引6.1 索引的原理 B+ tree6.2 索引最左匹配原则7. Mysql 存储引擎8.Mysql 数据表中数据的操作8.1 数据的增删改8.2 数据的查询(重点) 1.关系型数据库中的佼佼者 MySQL作...

RollingInTheDeepc的博客 304

MySql进阶使用之视图、索引(详解)

今天给大家带来分享有关MySql进阶使用的知识分享,希望能给大家带来帮助,请认真阅读。接下来跟着我们的思维导图一起来看看吧。视图(View)是在数据库中创建的虚拟表,它基于查询的结果集。它是通过使用存储在数据库中的数据来动态生成的,但在物理存储上并不保留数据。视图可以被视为一个存储了特定数据的虚拟表,类似于物理表,但实际上并不存储任何数据。视图可以由一个或多个表的列组成,并且可以根据需求进行筛选、过滤、排序和聚合等操作。它提供了一种简化和抽象的方式来访问和处理数据库中的数据。

weixin_74352229的博客 1466

MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】

MySQL 进阶使用

功不唐捐,玉汝于成 1829

MySQL进阶——索引使用规则

在上篇文章我们学习了,这篇文章学习MySQL进阶——索引使用规则。

霖hero 892

MYSQL进阶使用(一)

文章目录MYSQL高级视图何为视图:定义视图:查看视图:使用视图:删除视图:视图的作用:事务:事务是什么?事务四大特性(ACID):1.原子性:2.一致性:3.隔离性:4.持久性:事务命令:查看表的创建语句:开启事务:提交事务:回滚事务:提交事务:回滚事务: MYSQL高级 视图 何为视图: 视图就是一条select语句执行后返回的结果的集合 视图时对很多张表的引用,一张虚表,查询语句执行的结果,但不会储存具体的数据 注:基本表数据发生了改变,视图也会跟着改变 定义视图: 代码: create view 视

Little_Fish_KEKE的博客 930

【MySQL】MySQL数据库的进阶使用

对表的CURD操作,聚合函数,group by、having、order by,limit等关键字的使用,MySQL内置函数,MySQL多表查询,子查询,内连接,左外连接,右外连接,

The porters of knowledge 828

mysql的进阶使用(备份)

1.mysql配置文件 mysql的配置文件为/etc/my.cnf 配置文件查找次序:若在多个配置文件中均有设定,则最后找到的最终生效 /etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf mysql常用配置文件参数: 参数 说明 ...

weixin_44435182的博客 180

【进阶】MySQL中如何使用索引

前言 学完基础的MySQL知识,以及MySQL的增删改查,我们要学习一些性能方面的东西。今天来讲一下索引(Index)。 索引 在关系数据库中,索引是一种单独的、物理的数对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到

数据之魅的博客 1179

【MySQL进阶】索引使用

因为索引是用来索引少量数据的,如果通过索引查询返回大批量的数据,则还不如走全表扫描来的快,此时索引就会失效。可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值, 索引选择性越高则查询效率越高, 唯一索引的选择性是1。尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间, 避免回表,提高查询效率。存在,索引就会生效,只不过索引的长度不同。要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。

Javascript_tsj的博客 1573

MySQL进阶:索引的使用及理解

索引是mysql中非常重要的一个知识点,面试中会经常会被问到.为了offer,认真理解下面知识点吧. 1:什么是索引? 索引是一种用于快速查询和检索数据的数据结构。mysql中的索引结构有: B+树和Hash。 索引的作用就相当于目录的作用。我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。这样查找就会非常快. 2:索引的优缺点? 优点:可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因。毕竟大部分系统的读请求总是大于写请求的. ...

wang5701071的博客 8181
上一篇: SQL基本使用
Figure_TheKeyboard
博客等级 码龄5年 6粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值