分组数据
select [column_name], count(*) as [new_name] from [table_name] group by [column_name] (with rollup);
select [column_name], count(*) as [new_name] from [table_name] group by [column_name] having count(*) >= 2;
# 1 分组 相同[column_name]为一组 count(*) 为统计数量, with rollup 显示所有数量之和
# 2 having 语句为过滤 只能过滤分组 不能过滤子句(where 可以过滤子句)
select [column_name], count(*) as [new_name] from [table_name] where [condition] group by [column_name] having [condition] (order by [column_name]);
# where 与 having 综合使用,where 表示查询字句, having表示查询分组。
# 一般来说 group by 的排序是不准确的, 所以一般分组之后,要用 order by 排序
子句 | 说明 | 是否必须使用 |
select | 返回列或表达式 | 是 |
from | 从中检索的表 | 仅在表选择数据时使用 |
where | 行级过滤 | 否 |
group by | 分组说明 | 仅在计算聚集时使用 |
having | 组级过滤 | 否 |
order by | 输出排列顺序 | 否 |
limit | 输出行数 | 否 |
联结表
想要学习联结表,首先要了解两个概念:
主键:每行具有的唯一的标识符为主键
外键:外键为某个表中的某一列,它包含了另一个表达主键值。
创建联接表如下
select vend_name, prod_name, prod_price from vendors, products where vendors.vend_id = products.vend_id;
这种方法叫做等值联结,又叫内部联结,可以用join关键字来表示相同的功能
select vend_name, prod_name, prod_price from vendors inner join products on vendors.vend_id = products.vend_id;
创建高级联结
自联结
select p1.prod_id, p1.prod_name from products as p1, products as p2 where p1.vend_id = p2.vend_id and p2.prod_id = 'DTNTR';
上述代码表示的是:查找prod_id 为'DITNTR' 的 vend_id, 并将这个vend_id下的所有产品展示出来
由于是在一个表中查找,products引用了两次,具有二义性(雾),所以取了两个别名 p1, p2 加以区分。
使用自联结代替子查询的原因是在某些情况下,自联结的效率要高一些。
外部联结
select customers.cust_id, orders.order_num from customers left join orders on customers.cust_id = orders.cust_id;
left join 返回左表达全部子列,当左表某行未在右表中出现,则该行为null。