MySQL中select相关语法总结(join,group by ,having, order by,union)

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语句。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值