子查询与连接

子查询(Subquery)是指出现在其他SQL语句内的SELECT子句

例如:

SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2);

其中SELECT * FROM t1,称为Outer Query/Outer Statement(外层查询)

SELECT col2 FROM t2,称为Subquery

子查询指嵌套在查询内部,且必须始终出现在圆括号内

子查询可以包含多个关键字和条件,如DISTINCT、GROUP BY、ORDER BY、LIMIT、函数等

子查询的外层查询可以是:SELECT、INSERT、UPDATE、SET或DO

子查询可以返回标量、一行、一列或子查询

使用比较运算符的子查询

=、>、<、>=、<=、<>、!=、<=>

语法结构

operand comparison_operator subquery

SELECT AVG(goods_price) FROM tdb_goods;

#从名为tdb_goods的表中查询到的goods_price计算平均值

SELECT ROUND(AVG(goods_price),2) FROM tdb_goods;

#对得到的平均值作四舍五入,并保留到小数点后2位

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price>=5636.36;

#查询哪些商品的价格大于平均价格5636.36

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price>=(SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);

#通过子查询,查询哪些商品的价格大于平均价格,平均价格进行四舍五入,保留2位小数

SELECT goods_price FROM tbd_goods WHERE goods_cate=‘超极本‘;

#查到分类为‘超极本’的价格

SELECT * FROM tdb_goods WHERE goods_cate = ‘超极本‘;

#查询分类为超极本的所有记录

SELECT goods_id goods_name goods_price FROM tdb_goods WHERE goods_price > (SELECT goods_price FROM tdb_goods WHERE goods_cate = ‘超极本‘);

#通过子查询,查询哪些商品的价格比超极本更贵

#系统报错,提示我们子查询返回了多于一行,返回了3条记录,应该告诉系统,大于哪一个值

用ANY、SOME或ALL修饰的比较运算符

operand comparison_operator ANY(subquery)

operand comparison_operator SOME(subquery)

operand comparison_operator ALL(subquery)

使用[NOT]IN的子查询

语法结构

operand comparison_operator [NOT]IN(subquery)

=ANY运算符与IN等效

!=ALL或<>ALL运符与NOT IN等效

使用[NOT] EXISTS的子查询

如果子查询返回任何行,EXISTS将返回TRUE;否则为FALSE

CREATE TABLE IF NOT EXISTS tdb_goods_cates(

cate_id SAMLLINT UNISIGNED PRIMARY KEY AUTO_INCREMENT,

cate_name VARCHAR(40) NOT NULL

);

SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

#查询数据表中的所有分类

将查询结果写入数据表

INSERT [INTO] tbl_name [(col_name,...)]

SELECT ...

INSERT tdb_goods_cates(cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

应该参照分类表去更新商品表,需要有多表更新

多表更新

UPDATA table_references

SET col_name1 = {expr1丨DEFAULT}

[,col_name2 = {expr2丨DEFAULT} ...

[WHERE where_condition]

连接类型

INNER JOIN,内连接

在MySQL中,JOIN,CROSS JOIN和INNER JOIN是等价的

LEFT [OUTER] JOIN,左外连接

RIGHT [OUTER] JOIN,右外连接

语法结构

table_reference

{[INNER丨CROSS] JOIN丨{[LEFT丨RIGHT} [OUTER] JOIN}

table_reference

ON conditional_expr

UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate =cate_name

SET goods_cate =cate_id;

创建数据表同时将查询结果写入到数据表

CREATE TABLE [IF NOT EXISTS] tbl_name

[(create_definition,...)]

select_statement

SELECT brand_name FROM tdb_goods GROUP BY brand_name;

CREATE TABLE tdb_goods_brands(

brand_id SMALLINT UNISIGNED PRIMARY KEY AUTO_INCREMENT,

brand_name VARCHAR(40) NOT NULL,

)

SELECT brand_name FROM tdb_goods GROUP BY brand_name;

UPDATE tdb_goods AS g INNER JOIN tdb_goods_brands AS b ON g.brand_name =b.brand_name;

SET g.brand_name =b.brand id;

ALTER TABLE tdb_goods

CHANGE goods_cate cate_id SAMLLINT UNSIGNED NOT NULL,

CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;

连接

MySQL在SELECT语句、多表更新、多表删除语句中支持JOIN操作

数据表参照

table_reference

tbl_name [[AS alias]丨table_subquery [AS] alias

数据表可以使用tbl_name AS alias_name

或tbl_name alias_name赋予别名

table_subquery可以作为子查询使用在FROM子句中,

这样的子查询必须为其赋予别名

连接条件

使用ON关键字来设定连接条件,也可以使用WHERE来代替

通常使用ON关键字来设定连接条件

使用WHERE关键字进行结果集记录的过滤

内连接

仅显示符合连接条件的记录

左外连接

显示左表的全部记录及右表符合连接条件的记录

右外连接

显示右表的全部记录及左表符合连接条件的记录

SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g

INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id

INNER JOIN tdb_goods_brands AS b ON g.brand_id = c.brand_id\G;

外链接

A LEFT JOIN B join_condition

数据表B的结果集依赖数据表A

数据表A的结果集根据左连接条件依赖所有数据表(B表除外)

左外连接条件决定如何检索数据表B(在没有指定WHERE条件的情况下)

如果数据表A的某条记录符合WHERE条件,但是在数据表B不存在符合连接条件的记录,将生成一个所有列为空的额外的B行

无限分类的数据表设计

CREATE TABLE tdb_goods_types(

type_id SMALLINT UNISIGNED PRIMARY KEY AUTO_INCREMENT,

type_name VARCHAR(20) NOT NULL,

parent_id SMALLINT UNISIGNED NOT NULL DEFAULT 0

);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘家用电器‘,DEFAULT);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘电脑、办公‘,DEFAULT);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘大家电‘,1);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘生活电器‘,1);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘平板电视‘,3);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘空调‘,3);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘电风扇‘,4);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘饮水机‘,4);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘电脑整机‘,2);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘电脑配件‘,2);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘笔记本‘,9);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘超极本‘,9);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘游戏本‘,9);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘CPU‘,10);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘主机‘,10);

自身连接

同一个数据表对其自身进行连接

SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p

ON s.parent_id = p.type_id;

SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types  p LEFT JOIN

tdb_goods_types s ON s.parent_id = p.type_id;

多表删除

DELETE tbl_name [.*] [,tbl_name[.*]]...

FROM table_references

[WHERE where_condition]

SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >=2;

DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name)>=2) AS t2 ON t1.goods_name =t2.goods_name WHERE t1.goods_id > t2.goods_id;

时间: 2024-12-08 12:53:43

子查询与连接的相关文章

MySQL学习笔记-子查询和连接

MySQL学习笔记-子查询和连接 使客户端进入gbk编码方式显示: mysql> SET NAMES gbk; 1.子查询 子查询的定义: 子查询(Subquery)是指出现在其他SQL语句内的SELECT子句. 例如:  SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中SELECT * FROM t1 称为Outer Query / Outer Statement (外部查询) SELECT col2 FROM t2 , 被称为Su

mysql查询、子查询、连接查询

mysql查询.子查询.连接查询 一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.group by子句通常和count().sum()等聚合函数一起使用. having子句(筛选):有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出. order by子句(排序):按照“属性名”指定的字段进行排序.排序方式由“asc”和“desc”两个参数指出,默

mysql的查询、子查询及连接查询

一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数)  1.where常用运算符: 比较运算符 > ,  < ,=  , != (< >),>=   ,   <= in(v1,v2..vn) between v1 and v2    在v1至v2之间(包含v1,v2) 逻辑运算符 not ( ! )  逻辑非 or ( || )    逻辑或 and ( &&am

Mysql子查询,连接,多表更新

1.子查询是指在另一个查询语句中的SELECT子句. 例句: SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); 其中,SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement), SELECT column1 FROM t2 称为Sub Query[子查询]. 所以,我们说子查询是嵌套在外查询内部.而事实上它有可能在子查询内部再嵌套子查询. 子查询必须出现在圆括号之间. 行

27. SQL -- TSQL(SELECT语句的使用,子查询,连接,通配符 )(3)

通配符: 通配符一般是通过LIKE 使用的. T-SQL 中支持四种通配符,如表所示: 运算 符 含 义 % 代表零个或多个任意字符 _ 代表一个任意字符 [] 指定范围内的任意单个字符 [^] 不在指定范围内的任意单个字符 例如, "AB%"表示以AB 开始的任意字符串: "_cd"表示以cd 结尾的三个字符的字符串: "[ef]%"表示以e 或f 开始的任意字符串: "[s-v]ing"表示开始是s 到v,结尾是ing,长

25. SQL -- TSQL(SELECT语句的使用,子查询,连接,通配符 )(1)

SELECT语句的使用 select 语句: ○5 SELECT select_list ○1 FROM table_source ○2 [ WHERE search_condition ] ○3 [ GROUP BY group_by_expression] ○4 [ HAVING search_condition ] ○6 [ ORDER BY order_expresion [ASC |DESC ] ] SELECT语句执行顺序: A.FROM阶段 B.WHERE阶段 C.GROUPBY阶

SQL 子查询,连接查询复习

use lianxi0720 go --创建部门表 create table bumen ( bcode int primary key,--部门编号 bname varchar(20), --部门名称 bceo varchar(20), --部门负责人 btel varchar(20), --部门电话 ) go --创建人员表 create table renyuan ( code int primary key identity(10001,1),--人员编号,自增长用identity,从1

MySQL 子查询与连接操作笔记

SQL语句之间是可以进行连接操作的,在一些复杂的数据操作中必须用到连接操作.简单的说就是一个SQL语句的结果可以作为相连接的SQL操作的一部分.SQL结构化查询语句,子查询是指的所有的SQL操作,并非单一的SELECT语句.   1.由比较运算符产生: SELECT user_name,user_id,user_phone FROM users WHERE user_age >=(SELECT ROUND(AVG(age),0) FROM users); 可以使用ANY,SOME,ALL对查询进

[mysql]子查询与连接

1,子查询(Subquery)是指出现在其他 SQL 语句内的select子句 例如: select * from t1 where col1 = (select col2 from t2); 其中 select * from t1, 称为Outer Query/Outer Statement select col2 from t2 ,称为 SubQuery. 2,子查询指嵌套在查询内部,并且始终出现在圆括号内 子查询有多个关键字或条件,如 distinct , group by, order