SQL 学习

作者: 奔跑的笨鸟 | 来源:发表于2017-07-05 16:08 被阅读6次

    table (test1)

    col1 col2
    22 33
    33 22
    12 33
    55 78
    78 55
    16 31
    31 16

    查询哪些行是可以互换的?

    SELECT 
        *
    FROM
        test1 AS t1,
        test1 AS t2
    WHERE
        t1.col1 = t2.col2 AND t1.col2 = t2.col1
    

    执行结果:

    | col1 | col2 | col1 | col2 |
    | :---: | : ---: | :---: | :---: |
    | 16 | 31 | 31 | 16 |
    | 22 | 33 | 33 | 22 |
    | 31 | 16 | 16 | 31 |
    | 33 | 22 | 22 | 33 |
    | 55 | 78 | 78 | 55 |
    | 78 | 55 | 55 | 78 |

    like

    like 'xxx%' 匹配所有xxx开头的字符串
    like '%xxx%' 匹配包含xxx的所有字符串
    like ‘xxxx_’ 匹配xxx开头的长度是4的字符串
    like '__' 匹配长度为2的所有字符串

    table(test2)

    id name sex salary bonus department
    1 王五 1000 23 开发一部
    2 李四 300 400 开发二部
    3 张三 3000 45 开发一部
    4 大国 345 67 人事部门
    5 小妞 499 99 人事部门

    查下每个部门的总工资?

    SELECT 
        department, SUM(salary + bonus) AS 工资
    FROM
        test.test2
    GROUP BY department;
    

    执行结果:

    department 工资
    人事部门 1010
    开发一部 4068
    开发二部 700

    查下每个人的总工资,按高低排序?

    SELECT 
        salary + bonus AS 工资, name
    FROM
        test.test2
    ORDER BY 工资 DESC
    

    执行结果:

    工资 name
    3045 张三
    1023 王五
    700 李四
    598 小妞
    412 大国

    查询工资最高者?

     SELECT 
        MAX(salary + bonus), name
    FROM
        test.test2;
    

    查询每个部门工资最多的员工?

    SELECT 
        name, MAX(salary + bonus) as salary, department
    FROM
        test.test2
    GROUP BY department;
    

    table(test3)

    name Course score
    张三 语文 81
    张三 数学 79
    李四 英语 88
    李四 物理 90
    李四 语文 81
    王五 化学 78
    王五 语文 90
    王五 英语 87

    用一条SQL 语句 查询出每门课都大于80 分的学生姓名?
    第一种方式:

    
    SELECT DISTINCT
        name
    FROM
        test.test3
    WHERE
        name NOT IN (SELECT DISTINCT
                name
            FROM
                test.test3
            WHERE
                score < 80);
    

    第二种方式:

    SELECT 
        name
    FROM
        test.test3
    GROUP BY name
    HAVING MIN(score) > 80;
    

    结果:

    name
    李四

    table(table4)

    id number name coursenum coursename score
    1 200501 张三 0001 数学 89
    2 200502 李四 0001 数学 79
    3 200501 张三 0001 数学 89

    查询所有的除了id,不重复的数据

    SELECT 
        *
    FROM
        test.test4 AS t1
    WHERE
        EXISTS( SELECT 
                1
            FROM
                (SELECT 
                    MIN(id) AS id
                FROM
                    test.test4
                GROUP BY number , name , coursenum , coursename , score) AS t2
            WHERE
                t1.id = t2.id);
    

    上面的有点多余嵌套查询:

    SELECT 
        MIN(id), number, name, coursenum, coursename, score
    FROM
        test.test4
    GROUP BY number , name , coursenum , coursename , score;
    

    这2个sql 是同一个结果。

    查询所有重复的数据?

    SELECT 
        t1.*
    FROM
        test.test4 AS t1,
        test.test4 t2
    WHERE
        t1.id <> t2.id AND t1.number = t2.number
            AND t1.name = t2.name
            AND t1.coursenum = t2.coursenum
            AND t1.coursename = t2.coursename
            AND t1.score = t2.score;
    
    

    删除除了自动编号不同, 其他都相同的学生冗余信息?

    DELETE FROM test.test4 
    WHERE
        id NOT IN (SELECT 
            MIN(id)
        FROM
            test.test4
        GROUP BY number , name , coursenum , coursename , score);
    

    table

    一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球对,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合.

    select a.name, b.name
    from team a, team b
    where a.name < b.name 
    

    table(test)

    请用SQL语句实现:从test数据表中查询出所有月份的发生额都比10000科目相应月份的发生额高的科目。请注意:test中有很多科目,都有1-12月份的发生额。
    AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。

    AccID Occmonth DebitOccur
    10000 01 100
    10000 01 100
    10000 01 100
    10000 02 300
    10000 03 150
    10000 04 130
    10000 05 200
    10000 06 800
    10000 07 900
    10000 10 110
    10000 11 90
    10000 12 103
    10000 08 120
    10000 09 130
    10001 01 140
    10001 02 350
    10001 03 160
    10001 04 530
    10001 05 240
    10001 06 860
    10001 07 970
    10001 10 150
    10001 11 970
    10001 12 163
    10001 08 127
    10001 09 131
    10002 01 10
    10002 02 350
    10002 03 16
    10002 04 530
    10002 05 20
    10002 06 860
    10002 07 90
    10002 10 150
    10002 11 970
    10002 12 163
    10002 08 127
    10002 09 131

    SQL语句:

    SELECT 
        *
    FROM
        test
    WHERE
        accid NOT IN (SELECT DISTINCT
                t.accid
            FROM
                test AS t,
                (SELECT 
                    *
                FROM
                    test
                WHERE
                    accID = 10000) AS t1
            WHERE
                t.occmonth = t1.occmonth
                    AND t.debitoccur <= t1.debitoccur);
    

    执行结果:

    AccID Occmonth DebitOccur
    10001 01 140
    10001 02 350
    10001 03 160
    10001 04 530
    10001 05 240
    10001 06 860
    10001 07 970
    10001 10 150
    10001 11 970
    10001 12 163
    10001 08 127
    10001 09 131

    相关文章

      网友评论

        本文标题:SQL 学习

        本文链接:https://www.haomeiwen.com/subject/pzoxhxtx.html