那些年的记忆

习惯改变行为,行为决定命运。

复习(五) 子查询与连接

在客户端设置字符集

mysql> SET NAMES gbk;

子查询

子查询是指出现左其他SQL语句内的SELECT子句。

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

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

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

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

例如:

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

其中SELECT col2 FROM t2就称为子查询


1. 使用比较运算符的子查询

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

例如:

mysql> SELECT goods_id, goods_name,goods_price FROM tdb_goods WEHRE goods_price > (SELECT ROUND(AVG(goods_price), 2) FROM tdb_goods);


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

例如:

mysql> SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > (SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods) ORDER BY goods_price DESC;

2. 使用[NOT] IN的子查询

例如:

mysql> SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price IN (SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本') ORDER BY goods_price DESC;


3. 使用[NOT] EXISTS的子查询

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


多表更新

UPDATE table_references SET col_name1 = {expr1 | DEFAULT} [, col_name2 = {expr2 | DEFAULT}] ... [WHERE where_condition]

例如:

mysql> UPDATE tdb_goods INNER JOIN tdb_goods_cates ON tdb_goods.goods_cate = tdb_goods_cates.cate_name SET tdb_goods.goods_cate = tdb_goods_cates.cate_id;


CREATE...SELECT

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

CREATE TABLE [IF NOT EXISTS] table_name [(create_definition,...)] select_statement

例如:

mysql> CREATE TABLE tdb_goods_brands(
    -> brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    -> brand_name VARCHAR(40) NOT NULL
    -> )
    -> SELECT brand_name FROM tdb_goods GROUP BY brand_name;


连接查询

table_reference {[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN} table_reference ON conditional_expr

table_reference

table_name [[AS] alias] | table_subquery [AS] alias

数据表可以使用table_name AS alias_name 或table_name alias_name赋予别名

table_subquery可以作为子查询使用在FROM子句中,这样的子查询必须为其赋予别名


连接类型

INNER JOIN 内连接 显示左表和右表符合连接条件的记录

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

LEFT [OUTER] JOIN 左外连接 显示左表的全部和右表符合连接条件的记录

RIGHT [OUTER] JOIN 右外连接 显示右表的全部和右表符合连接条件的记录


连接条件

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

通常使用ON关键字来设定连接条件,使用WHERE关键字进行结果集记录的过滤

例如:

mysql> SELECT goods_id, goods_name, cate_name FROM tdb_goods INNER JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;
mysql> SELECT goods_id, goods_name, cate_name FROM tdb_goods LEFT JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;
mysql> SELECT goods_id, goods_name, cate_name FROM tdb_goods RIGHT JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;
mysql> SELECT goods_id, goods_name, cate_name, brand_name, goods_price FROM tdb_goods AS tg INNER JOIN tdb_goods_cates AS tgc ON tg.cate_id = tgc.cate_id INNER JOIN tdb_goods_brands AS tgb ON tg.brand_id = tgb.brand_id;


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。