11、使用子查询
- 子查询subquery:嵌套在其他查询中的查询
- 使用简单的子查询嵌套:
–SELECT [COL1] FROM [TABLE] WHERE [COL2] IN (SELECT [COL2] FROM [TABLE] WHERE [COL3] = [VAL])
– 作为子查询的语句只能查询单个列,否则出错 - 在子查询使用计算字段:
–SELECT [COL1], (SELECT COUNT(*) FROM [TABLE1] WHERE [TABLE1].id= [TABLE2].id) AS [COL2] FROM [TABLE2]
– 完全限定列名:指定表名和列名,避免混淆
12、联结表
- 笛卡尔积:没有联结条件的表返回的结果,又称作叉联结cross join
- 等值联结或内联结:由INNER JOIN+ON子句或WHERE子句给出
–SELECT [COL1], [COL2] FROM [TABLE1] INNER JOIN [TABLE2] ON [TABLE1].id=[TABLE2].id
–SELECT [COL1], [COL2] FROM [TABLE1], [TABLE2] WHERE [TABLE1].id=[TABLE2].id
– 以上查询等价 - 多个表的联结:
– 等价与嵌套的子查询
– 应该避免过多的表联结,性能会下降
13、创建高级联结
- 使用表别名:缩短语句;可用于SELECT语句的各部分
- 自联结self-join:用来替代处理相同表的子查询
- 自然联结natural join:使得每列只出现一次
- 外联结outer join:包含没有关联行的行
– left outer join:选中左边表的所有的行
– right outer join: 选中右边表的所有的的行 - 使用带聚集函数的联结:
–SELECT [COL1], COUNT([COL2]) FROM [TABLE1] INNER JOIN [TABLE2] ON [TABLE1].id=[TABLE2].id
–个人认为与平常的使用方法无异
14、组合查询
- UNION操作符:组合多个SQL查询
– 每个查询必须包含相同的列、表达式或聚集函数,但次序无须一致 - 包含或删除重复的行:
– UNION操作符默认删除重复的行,这与WHERE一致
– UNION ALL 操作符可以输出重复的行,WHERE无法做到 - 对组合查询的结果排序:
– 只能使用一条ORDER BY子句
– 只能位于最后一条SELECT语句之后
15、插入查询
- INSERT:进行行插入
- 插入完整的行:
–INSERT INTO [TABLE] VALUES ([VAL1]....)
–INSERT INTO [TABLE]([COL1]....) VALUES ([VAL1]....)
– 第二种方式更保险,可以适应表结构的变化 - 插入部分行:
– 可以不提供某列和某列的值
– 前提是该列允许NULL值或者有默认值 - 插入检索出的数据:INSERT SELECT
–INSERT INTO [TABLE1] ([COL1]....) SELECT [COL1]... FROM [TABLE2]
– DBMS关注的是两个语句中列名的位置,而不是列名是否相同
– 其中SELECT可以使用WHERE语句 - 将数据复制到全新的表:SELECT INTO
–SELECT * INTO [TABLE1] FROM [TABLE2]
–CREATE TABLE [TABLE1] AS SELECT * FROM [TABLE2]
– 后者是MySQL、SQLite等的语法