zoukankan      html  css  js  c++  java
  • mysql 语句资料总结

    一.UNION命令

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

    请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

    例:

    Employees_China:

    E_IDE_Name
    01 Zhang, Hua
    02 Wang, Wei
    03 Carter, Thomas
    04 Yang, Ming

    Employees_USA:

    E_IDE_Name
    01 Adams, John
    02 Bush, George
    03 Carter, Thomas
    04

    Gates, Bill

    列出所有在中国和美国的不同的雇员名:

    SELECT E_Name FROM Employees_China
    UNION
    SELECT E_Name FROM Employees_USA
    

    结果

    E_Name
    Zhang, Hua
    Wang, Wei
    Carter, Thomas
    Yang, Ming
    Adams, John
    Bush, George
    Gates, Bill

    二。exists,not exists的用法

    exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:
      select name from student where sex = 'm' and mark exists(select 1 from grade where ...) ,只要
    exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1,如果改成“select 2 from grade where ...”,那么返回的字段就是2,这个数字没有意义。所以exists子句不在乎返回什么,而是在乎是不是有结果集返回。

    而 exists 与 in 最大的区别在于 in引导的子句只能返回一个字段,比如:
      select name from student where sex = 'm' and mark in (select 1,2,3 from grade where ...) 
    ,in子句返回了三个字段,这是不正确的,exists子句是允许的,但in只允许有一个字段返回,在1,2,3中随便去了两个字段即可。

    而not exists 和not in 分别是exists 和 in 的 对立面。

    exists (sql 返回结果集为真) 
    not exists (sql 不返回结果集为真)

    下面详细描述not exists的过程:

    如下:
    表A
    ID NAME 
    1   A1
    2   A2
    3   A3

    表B
    ID AID NAME
    1   1     B1
    2   2     B2 
    3   2     B3

    表A和表B是1对多的关系 A.ID => B.AID

    SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID=B.AID)
    执行结果为
    1 A1
    2 A2
    原因可以按照如下分析
    SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)
    --->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据

    SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
    --->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据

    SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
    --->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据

    NOT EXISTS 就是反过来
    SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)
    执行结果为
    3 A3
    ===========================================================================
    EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因
    SELECT ID,NAME FROM A  WHERE ID IN (SELECT AID FROM B)

    NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别
    SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)

    三。case when

    Case具有两种格式。简单Case函数和Case搜索函数。

    --简单Case函数
    CASE sex
    WHEN '1' THEN '男'
    WHEN '2' THEN '女'
    ELSE '其他' END
    --Case搜索函数
    CASE WHEN sex = '1' THEN '男'
    WHEN sex = '2' THEN '女'
    ELSE '其他' END


    这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
    还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。

    --比如说,下面这段SQL,你永远无法得到“第二类”这个结果
    CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类'
    WHEN col_1 IN ('a')       THEN '第二类'
    ELSE'其他' END

    四。CONCAT

    CONCAT(字串1, 字串2, 字串3, ...): 将字串1、字串2、字串3,等字串连在一起。

    请注意,Oracle的CONCAT()只允许两个参数;

    换言之,一次只能将两个字串串连起来。不过,在Oracle中,我们可以用'||'来一次串连多个字串。

    来看几个例子。假设我们有以下的表格:

    Geography 表格

    region_name store_name
    East Boston
    East New York
    West Los Angeles
    West San Diego

    例子1:

    MySQL/Oracle:
    SELECT CONCAT(region_name,store_name) FROM Geography
    WHERE store_name = 'Boston';

    结果

    'EastBoston'

    例子2:

    Oracle:
    SELECT region_name || ' ' || store_name FROM Geography
    WHERE store_name = 'Boston';

    结果

    'East Boston'

  • 相关阅读:
    51nod 1113 矩阵快速幂 如题目
    poj Raising Modulo Numbers 快速幂模板(取膜)
    bzoj 1503: [NOI2004]郁闷的出纳员 平衡树
    codevs 1063 合并果子 优先队列相关
    bzoj 3224: Tyvj 1728 普通平衡树 Treap模版
    快排模板
    hdu 4353 统计点在三角形内的个数
    hdu 3264 圆的交+二分
    hdu 3685 多边形重心+凸包
    hdu 3992 AC自动机上的高斯消元求期望
  • 原文地址:https://www.cnblogs.com/weblv/p/5287307.html
Copyright © 2011-2022 走看看