SQL常用实际命令

假设我有一张航班表
我想看看我的表究竟有多长呢?
select count(*) from flights;

然后我想看看这些航班究竟属于那些航空公司。也就是提取出不重复的航公公司字段
select distinct FlightCompany from flights;
最后的结果只出现一列。显示的是表中出现的所有航空公司。每个航空公司只出现一次

然后我又想算一算一共有多少航空公司
select count(distinct FLIGHTCOMPANY )from flights

然后我有想让你告诉我这些公司分别每个出现了几次呢?
(下面的语句提取了前20名)
select flightcompany,count(flightcompany) countc from flights group by flightcompany order by countc desc limit 20;

如果只显示航空公司名称,而不显示具体数目
select distinct flightcompany from flights group by flightcompany order by count(flightcompany) desc limit 20;

如果我让你不是按照航空公司分,而是按照时间点么。也就是分别计算0-1点,1-2点,2-3点的航班数据呢?
select Hour(PTD) hourc, count(PTD) countc from flights group by Hour(PTD) order by hourc asc;

如果我在让你找上面这些公司的飞机的班次都是在那起飞的,找出前五个机场并显示数量呢?
那么我们就使用嵌套查询。正好用到上面的查询结果
这样可以列出查询的前10的航空公司的所有出发地和航班数
select distinct flightcompany ,ADEPT,count(ADEPT) countc from flights where flightcompany in
(select t.flightcompany from
(select distinct flightcompany from flights group by flightcompany order by count(flightcompany) desc limit 10) as t)
group by flightcompany,ADEPT;
或者整理的更有格式一点,体现嵌套表

select * from(
    select distinct flightcompany ,ADEPT,count(ADEPT) countc from flights where flightcompany in
        (select t.flightcompanyc from
            (select distinct flightcompany  from flights group by flightcompany order by count(flightcompany) desc limit 10)
        as t)
    group by flightcompany,ADEPT)
group by flightcompany order by countc ;

但 是,我们每个航空公司只要前面三个机场啊,于是乎,换一种方法嵌套一层

SELECT * FROM (
        select distinct flightcompany ,ADEPT,count(ADEPT) countc from flights where flightcompany
        in(
            select t.flightcompany 
            from(
                select distinct flightcompany  from flights group by flightcompany order by count(flightcompany) desc limit 10
            ) as t
        )
        group by flightcompany,ADEPT    
) as main
WHERE(
    SELECT COUNT(1) 
    FROM(
        select distinct flightcompany ,ADEPT,count(ADEPT) countc from flights where flightcompany
        in(
            select t.flightcompany 
            from(
                select distinct flightcompany  from flights group by flightcompany order by count(flightcompany) desc limit 10
            ) as t
        )
        group by flightcompany,ADEPT    
    ) 
    as x  WHERE 
     main.FlightCompany = FlightCompany
     AND main.countc < countc
  ) < 3;

上面的嵌套语句又长又不好理解。好在mysql允许我们自定义函数和存储过程。所谓函数,和我们日常编程时用到的差不多,接受一堆参数返回一个。而存储过程就类似于我们上面的sql语句,是用来对表格进性操作的。
我们写一个上述语句的的存储过程版本

DROP PROCEDURE IF EXISTS Proc; 
DELIMITER //
CREATE PROCEDURE Proc() 
BEGIN
#新建一个表,统计前10的航空公司,列出每一个航空公司起飞的所有机场,并列出对应的航班数目
drop table if exists test;
CREATE  TABLE    test
(
    select distinct flightcompany ,ADEPT,count(ADEPT) countc from flights where flightcompany
    in(
        select t.flightcompany 
        from(
            select distinct flightcompany  from flights group by flightcompany order by count(flightcompany) desc limit 10
        ) as t
    )
    group by flightcompany,ADEPT
);


#对上面标进行查找,每个航空公司只取前三个机场
SELECT * FROM test main
WHERE(
    SELECT COUNT(1) FROM test sub WHERE 
     main.FlightCompany = sub.FlightCompany
     AND main.countc < sub.countc
  ) < 3;

END//
DELIMITER ;

类似于编程的做法。比嵌套查询有条理多了。

很可惜的是,mysql里没有with as的用法。所以,我们只能使用临时表。对于临时表来说,一旦你断开数据库。临时表就会被删掉。
create temporary table 名称

在SQL中有having子句。用来克服where语句没办法和合计函数一起的缺点。合计函数,group by和having常常放在一起使用。

数据库回滚可以使用roll back回滚,但是对create,alter等就是不支持回滚的操作。

union是把两次查询结果合并起来
(select * from a) UNION (select * from B)

如果是select * from A,B
那么就是返回所有AB中每一项的组合。比如a有两条记录,b有两条记录,那么一共就有四条记录。不过一般情况下,我们后面要加上where子句说明条件。

nysql和常见数据库中都支持多种存储引擎。
可以用show engines查看。show variables like “%storage_engine%”;来查看默认的引擎。如果在建立表格时没有指定,则默认引擎就是该引擎。

如果要批量更新多条数据:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值