1、group by相关使用
group by:主要用于数据分组,也就是某一些相同的放在一组。
下面讲讲一些规定:
1):如果分组列中具有null值,则null将作为一个分组返回,如果有多个null值,则它们将分为一组。
2):group by自居必须出现在where子句之后,order by子句之前。
3):除了聚集计算语句外,select 语句中每一列都必须再group by子句中给出。
4):group by子句中列出的每个列都必须是检索列或有效的表达式,但不能是聚集函数,如果再select中使用
表达式,则group by子句中可以指定相同的表达式,不能使用别名。
2、having的相关使用
1):除了能用group by分组数据外,mysql还允许过滤分组,规定包括哪些分组,排除哪些分组。
必须基于完整的分组而不是个别进行过滤。
2):having支持所有的where操作符。
3):也就是说,having只能用于group by之后。
select cust_id, count(*) as orders from orders group by cust_id having count(*)>=2;
3、select 子句顺序
select -> from ->where -> group by ->having ->order by -> limit
4、运用select子查询来进行过滤。
先看一个sql语句:
select cust_id
from orders
where order_num in(select order_num
from orderitems
where prod_id='TNT2');
注意,在子查询中,子查询总是从内向外处理,即先处理内部select,再处理外部select。
另外,再子查询中,列必须匹配,也就是说一个列,对应着一个子查询列,但如果需要,也可以使用多个列。
相关子查询:涉及到外部查询的子查询,例如:
select cust_name,cust_state,
(select count(*)
from orders
where orders.cust_id = customers.cust_id) as orders
from customers
order by cust_name;
5、迪卡尔积(cartesian product):由于没有联结条件的表关系返回的结果为迪卡尔积,
检索的数目将是第一个表中的行数诚意第二个表中的行数。
6、内部联结(inner join)
1):普通联结,例如:
select column1 from table1 join table2 where table1.id = table2.id;
//正常情况下,这种join或者是(inner join)行是可以省略的。
select vend_name,prod_name,prod_price
from vendors inner join products
on vendor.vend_id = products.vend_id;
//在使用inner join时,链接条件用特定的on子句而不是where子句(可以用),
传递给on的实际条件与传递给where的相同。
性能考虑:mysql在运行时关联指定的每个表以及处理链接,这种处理可能是非常耗资源的,
应此应该仔细,不要联结不必要的表,联结的表越多,性能下降越厉害。
2):自联结,自己的表联结自己的表。
如下,两条sql语句结果相同:
select prod_id, prod_name
from products
where vend_id = (select vend_id
from products
where prod_id='dtntr');
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';
7、外部联结(outer join)
许多联结将一个表中的行与另一个表中的行相关联,但有时会需要包含没有关联行的
那些行,举一些例子:
#对每个客户下了多少订单进行计数,包括哪些至今尚未下订单的客户。
#列出所有产品以及订购数量,包括没有人订购的产品。
#计算平均销售规模,包括哪些至今尚未下订单的客户。
也就是还要包括一些关联一起行的外面那些。
看一个简单的句子用法:
select customers.cust_id, orders.order_num
from customers left outer join orders
on customers.cust_id = orders.cust_id;
//也就是结果要包括customers的所有行(不一定所有列),如果有些customers对应的行没有对应的orders,
就用null来表示。
8、既可以给列明用as添加别名外,还可以通过as(或者不用)来给表名添加别名,便于缩短sql语句。
9、组合查询:使用union操作符将多条select 语句组合成一个结果集。
union的使用很简单,所需做的只是给出每条select语句,再各条语句之间放上union。
select vend_id, prod_id, prod_price
from products
where prod_price <= 5
union
select vend_id, prod_id, prod_price
from products
where vend_id in (1001,1002);
1):union中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)。
2):列数据类型必须兼容:类型不必完全相同,但必须是dbms可以隐含转换的类型(
例如:不同的数值类型或不同的日期类型)
3):使用union,重复的行会被自动的取消。如果不想取消,将原来的union改为union all即可。
4):在union的组合查询中使用order by时,只能再最后一条select 语句之后,因为对于结果集,不存在用一种
方式排序一部分,再用另一种方式排序另一部分,因此不允许使用多条order by语句。