SQL基础--常见SQL查询

SQL基础–常见SQL查询

1 . TOP-N查询

Oracle没有limit语句,自由对排序好的表取ROWNUM在前N个的记录

--查询薪资前3的员工
SELECT s.*
FROM
(
  SELECT e.LAST_NAME, e.SALARY
   FROM EMPLOYEES e
  ORDER BY SALARY DESC
) s
WHERE ROWNUM <= 3;

同样的分页查询可以通过下面的语句来完成

-- 分页查询
SELECT s.*
FROM
(
  SELECT e.LAST_NAME, e.SALARY,ROWNUM CNT
   FROM EMPLOYEES e
  ORDER BY SALARY DESC
) s
WHERE CNT >= 2 AND CNT <= 3;

2 . EXIST 和 IN 查询

查询有历史工作记录的员工

--EXIST查询
SELECT d.DEPARTMENT_NAME
FROM DEPARTMENTS d
WHERE EXISTS (
      SELECT 'X' FROM EMPLOYEES e WHERE d.DEPARTMENT_ID = e.DEPARTMENT_ID

);

SELECT d.DEPARTMENT_NAME
FROM DEPARTMENTS d
WHERE EXISTS (
      SELECT 'X' FROM EMPLOYEES e WHERE d.DEPARTMENT_ID = e.DEPARTMENT_ID AND ROWNUM <= 1

);


SELECT d.DEPARTMENT_NAME
FROM DEPARTMENTS d
WHERE d.DEPARTMENT_ID IN  (
      SELECT e.DEPARTMENT_ID FROM EMPLOYEES e
);

3 . NOT IN(A,B,NULL)

NOT IN 中包含NULL时,条件衡为FALSE

(原因可能是NULL和任何值的运算结果都为NULL,而NULL可看成是FALSE)

所以大致有这样的使用优先级(从高到低):EXIST—>IN—->OR

SELECT d.DEPARTMENT_ID,d.DEPARTMENT_NAME
FROM DEPARTMENTS d
WHERE d.DEPARTMENT_ID NOT IN  (80,90,NULL);

---->

SELECT d.DEPARTMENT_ID,d.DEPARTMENT_NAME
FROM DEPARTMENTS d
WHERE NOT( d.DEPARTMENT_ID = 80 OR d.DEPARTMENT_ID = 90 OR d.DEPARTMENT_ID = NULL);

--> d.DEPARTMENT_ID = 80    FALSE
--> d.DEPARTMENT_ID = 90    FALSE
--> d.DEPARTMENT_ID = NULL  NULL
-->FALSE  or  FALSE  or NULL = NULL
-->not NULL = NULL

4 . 取某个字段最小的记录

查询平均工资最高的部门中的最低薪水


--1
SELECT DEPARTMENT_ID, MIN(SALARY)
  FROM EMPLOYEES
 GROUP BY DEPARTMENT_ID
HAVING AVG(SALARY) >= ALL (SELECT AVG(SALARY)
                             FROM EMPLOYEES
                            GROUP BY DEPARTMENT_ID);

--2
SELECT DEPARTMENT_ID, MIN(SALARY)
  FROM EMPLOYEES
 GROUP BY DEPARTMENT_ID
HAVING AVG(SALARY) = (SELECT MAX(AVG(SALARY))
                             FROM EMPLOYEES
                            GROUP BY DEPARTMENT_ID);

5 . HAVING子句

查询总人数大于3的部门

--HAVING子句
SELECT DEPARTMENTS.DEPARTMENT_ID, DEPARTMENT_NAME, COUNT(*)
FROM DEPARTMENTS, EMPLOYEES
WHERE DEPARTMENTS.DEPARTMENT_ID = EMPLOYEES.DEPARTMENT_ID
GROUP BY DEPARTMENTS.DEPARTMENT_ID,DEPARTMENT_NAME
HAVING COUNT(*) > 3;

6 . 数字与字符串比较

Oracle在比较时,会将字符串自动转换成数字,建议明确指出类型转换,否则在有的情况下会报错(原始数据)


SELECT * FROM EMPLOYEES e WHERE e.FIRST_NAME = 111;

--->>

SELECT * FROM EMPLOYEES e WHERE to_number(e.FIRST_NAME) = 111;

7 .

8 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值