• CUBRID学习笔记 41 sql语法之groupby 等


    cubrid的中sql查询语法groupby


    GROUP BY ... HAVING Clause

    按dept_no分组

    SELECT dept_no, avg(sales_amount)
    FROM sales_tbl
    GROUP BY dept_no;

    分组前先执行条件比较

    SELECT dept_no, avg(sales_amount)
    FROM sales_tbl
    WHERE sales_amount > 100
    GROUP BY dept_no;

    分组后,having操作

    SELECT dept_no, avg(sales_amount)
    FROM sales_tbl
    WHERE sales_amount > 100
    GROUP BY dept_no HAVING avg(sales_amount) > 200;

    使用别名

    SELECT dept_no AS a1, avg(sales_amount) AS a2
    FROM sales_tbl
    WHERE sales_amount > 200 GROUP
    BY a1 HAVING a2 > 200
    ORDER BY a2;

    WITH ROLLUP 分组后统计(没有用过)

    SELECT dept_no AS a1, name AS a2, avg(sales_amount) AS a3
    FROM sales_tbl
    WHERE sales_amount > 100
    GROUP BY a1, a2 WITH ROLLUP;

    GROUP BY 排序
    SELECT *
    FROM sales_tbl
    ORDER BY dept_no DESC, name ASC;

    null排在前面还是后面
    SELECT * FROM tbl ORDER BY b NULLS FIRST;
    SELECT * FROM tbl ORDER BY b NULLS LAST;

    limit 分页

    SELECT t1.*
    FROM (SELECT * FROM sales_tbl AS t2 WHERE sales_amount > 100 LIMIT 5) AS t1
    LIMIT 1,3;

    等同
    SELECT t1.*
    FROM (SELECT * FROM sales_tbl AS t2 WHERE sales_amount > 100 LIMIT 5) AS t1
    LIMIT 3 OFFSET 1;

    join 查询

    1 Inner Join
    SELECT DISTINCT h.host_year, o.host_nation
    FROM history h INNER JOIN olympic o ON h.host_year = o.host_year AND o.host_year > 1950;
    等同
    SELECT DISTINCT h.host_year, o.host_nation
    FROM history h, olympic o
    WHERE h.host_year = o.host_year AND o.host_year > 1950;

    2 Outer Join

    SELECT DISTINCT h.host_year, o.host_year, o.host_nation
    FROM history h RIGHT OUTER JOIN olympic o ON h.host_year = o.host_year
    WHERE o.host_year > 1950;

    SELECT DISTINCT h.host_year, o.host_year, o.host_nation
    FROM olympic o LEFT OUTER JOIN history h ON h.host_year = o.host_year
    WHERE o.host_year > 1950;

    SELECT DISTINCT h.host_year, o.host_year, o.host_nation
    FROM history h, olympic o
    WHERE o.host_year = h.host_year(+) AND o.host_year > 1950;

    SELECT DISTINCT h.host_year, o.host_year, o.host_nation
    FROM olympic o LEFT OUTER JOIN history h ON h.host_year = o.host_year AND o.host_year > 1950;

    3 CROSS JOIN

    SELECT DISTINCT h.host_year, o.host_nation
    FROM history h CROSS JOIN olympic o;
    等同
    SELECT DISTINCT h.host_year, o.host_nation
    FROM history h, olympic o;

    子查询

    单行子查询

    SELECT h.host_year, (SELECT host_nation FROM olympic o WHERE o.host_year=h.host_year) AS host_nation,
    h.event_code, h.score, h.unit
    FROM history h;

    多行子查询

    SELECT name, capital, list(SELECT host_city FROM olympic WHERE host_nation = name) AS host_cities
    FROM nation;
    结果

    name capital host_cities

    'Somalia' 'Mogadishu' {}
    'Sri Lanka' 'Sri Jayewardenepura Kotte' {}
    'Sao Tome & Principe' 'Sao Tome' {}
    ...
    'U.S.S.R.' 'Moscow' {'Moscow'}
    'Uruguay' 'Montevideo' {}
    'United States of America' 'Washington.D.C' {'Atlanta ', 'St. Louis', 'Los Angeles', 'Los Angeles'}
    'Uzbekistan' 'Tashkent' {}
    'Vanuatu' 'Port Vila' {}

    values函数
    类似自定义了两列

    SELECT a.*
    FROM athlete a, (VALUES ('Jang Mi-Ran', 'F'), ('Son Yeon-Jae', 'F')) AS t(name, gender)
    WHERE a.name=t.name AND a.gender=t.gender;

    结果
    code name gender nation_code event

        21111  'Jang Mi-Ran'       'F'      'KOR'              'Weight-lifting'
        21112  'Son Yeon-Jae'      'F'      'KOR'              'Rhythmic gymnastics'
    

    for updae 为了更新或者删除,锁定前面查询出的结果

    只有引用的表和视图被锁定
    不能在子查询中使用,但是可以引用子查询
    不能在包含group by ,distinct 或者汇总函数的sql声明中使用
    不能引用union

    CREATE TABLE t1(i INT);
    INSERT INTO t1 VALUES (1), (2), (3), (4), (5);

    CREATE TABLE t2(i INT);
    INSERT INTO t2 VALUES (1), (2), (3), (4), (5);
    CREATE INDEX idx_t2_i ON t2(i);

    CREATE VIEW v12 AS SELECT t1.i AS i1, t2.i AS i2 FROM t1 INNER JOIN t2 ON t1.i=t2.i;

    SELECT * FROM t1 ORDER BY 1 FOR UPDATE;
    SELECT * FROM t1 ORDER BY 1 FOR UPDATE OF t1;
    SELECT * FROM t1 INNER JOIN t2 ON t1.i=t2.i ORDER BY 1 FOR UPDATE OF t1, t2;

    SELECT * FROM t1 INNER JOIN (SELECT * FROM t2 WHERE t2.i > 0) r ON t1.i=r.i WHERE t1.i > 0 ORDER BY 1 FOR UPDATE;

    SELECT * FROM v12 ORDER BY 1 FOR UPDATE;
    SELECT * FROM t1, (SELECT * FROM v12, t2 WHERE t2.i > 0 AND t2.i=v12.i1) r WHERE t1.i > 0 AND t1.i=r.i ORDER BY 1 FOR UPDATE OF r;

  • 相关阅读:
    第07组 Beta冲刺(2/5)
    第07组 Beta冲刺(1/5)
    第07组 Alpha事后诸葛亮
    第07组 Alpha冲刺(5/6)
    第07组 Alpha冲刺(6/6)
    软工实践个人总结
    第01组 Beta版本演示
    第01组 Beta冲刺(5/5)
    第01组 Beta冲刺(4/5)
    第01组 Beta冲刺(3/5)
  • 原文地址:https://www.cnblogs.com/wang2650/p/5291545.html
Copyright © 2020-2023  润新知