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关键字:
![](https://img-blog.csdn.net/20151005184055204)
![](https://img-blog.csdn.net/20151005184035183)
使用[ 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: 右外连接。
区别:
![](https://img-blog.csdn.net/20151005200848537)
说明: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)
先插入记录:
![](https://img-blog.csdn.net/20151005210432782)
为了得到每一个分类的父类名称,即实现如下结果:
![](https://img-blog.csdn.net/20151005210440474)
就需要做表的自身连接:
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;
为了得到每一个分类的子类名称,即实现如下结果:
![](https://img-blog.csdn.net/20151005212827585)
任然需要做自身连接:
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;
子查询:是指嵌套在查询内部,且必须始终出现在圆括号内。子查询的外层查询可以是: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中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复