您的位置:首页 > 数据库 > MySQL

MySQL的子查询与连接查询

2015-10-05 21:39 746 查看
在数据库操作中,我们使用最多的SQL语句那无疑是SELECT 查询语句,当然也是最复杂的一个,接下来就学习一下这条语句:

子查询:是指嵌套在查询内部,且必须始终出现在圆括号内。子查询的外层查询可以是:SELECT , INSERT , UPDATE , SET 或DO 。

常见的聚集函数:

AVG:求平局值。例如:  SELECT AVG(price) from db;

ROUND:保留小数位数(四舍五入)。 例如:SELECT ROUND(AVG(price),2) from db;

在查询中使用ANY,SOME,ALL关键字:





使用[ NOT ] IN 的子查询:

operand comparision_operator [ NOT ] IN (subquery);

使用[ NOT ] EXISTS 的子查询:

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

创建写入(CREATE ... SELECT) :

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

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

连接:

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

table1 {[INNER | CROSS ] JOIN | {LEFT | RIGHT } [OUTER] JOIN}  table2  ON  expr;

连接类型:

INNER JOIN(内连接):在mysql中JOIN, CROSS JOIN 和 INNER JOIN 是等价的。

LEFT [OUTER] JOIN : 左外连接。

RIGHT [OUTER] JOIN: 右外连接。

区别:



说明:A LEFT JOIN B  join_condition(RIGHT JOIN 与此相反)

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

数据表的自身连接:

例如:创建一个数据表unlimited_classification(无限级分类):

CREATE TABLE
unlimited_classification(

     type_id   SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

     type_name VARCHAR(20) NOT NULL,

     parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0

  ); (其中parent_id 依赖于 type_id)

先插入记录:



为了得到每一个分类的父类名称,即实现如下结果:



就需要做表的自身连接:

SELECT c.type_id,c.type_name,p.type_name AS parent_name FROM unlimited_classification AS c LEFT JOIN unlimited_classification AS p ON c.parent_id = p.type_id;

为了得到每一个分类的子类名称,即实现如下结果:



任然需要做自身连接:

SELECT p.type_id,p.type_name,c.type_name FROM unlimited_classification AS p LEFT JOIN unlimited_classification AS c ON c.parent_id = p.type_id;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql