Java知识123

SQL 学习

2017-07-05  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读