在数据库操作中,我们使用最多的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;