oracle将查询结果声明为伪表,Oracle查询操作(增删改查,伪表,高级查询)实例讲解...
SQL查詢操作:增刪改查
一、SQL操作符
算術操作符 + - * /
比較操作符 = != < > <= >= BETWEEN……AND IN LINK IS NULL
邏輯操作符 NOT AND OR
連接操作符 || 用來連接字符串
集合操作符 UNION UNION ALL INTERSECT MINUS
示例1:關于 + 與 || 拼接
SQL Server寫法: SELECT sid, sname, sex +’生’ FROM tb_name;
Oracle寫法: SELECT sid, sname, sex||’生’ FROM tb_name;
提示:
在Sql Server中“+”既有算術作用,也有字符串拼接作用;但在Oracle中,“+”就只有算術作用。
操作符的優先級:
算術 > 連接 > 比較 > NOT > AND > OR
二、SQL語言的組成
數據定義語言DDL :CREATE、ALTER、DROP
數據操縱語言DML:INSERT、DELETE、UPDATE、SELECT
事物控制語句TCL:COMMIT、ROLLBACK、SAVEPOINT
數據控制語言DCL:GRANT、REVOKE
二、數據操縱語言DML
1. 增加數據
INSERT INTO 表名[(列名1,列名2,……)] VALUES (值1, 值2,……);
示例1:將部門編號為20的員工插入到新表中
INSERT INTO tb_new
SELECT * FROM emp WHERE deptno=20;
示例2:使用union插入多條數據,要借用偽表
INSERT INTO tb_new
SELECT 1,'張三','男' FROM dual UNION
SELECT 2,'李四','女' FROM dual UNION
SELECT 3,'王五','男' FROM dual UNION
SELECT 4,'趙六','女' FROM dual;
2. 刪除數據
DELETE FROM 表名 [WHERE ]
示例:刪除性別為男的記錄
DELETE FROM emp WHERE sex = ‘男’
3. 修改數據
UPDATE 表名 SET 列名=表達式, …… [WHERE ]
示例1:修改emp表中編號7369的薪水sal為1000.
UPDATE emp SET sal=1000 WHERE 編號=’7369’
示例2:修改emp表中編號7369的薪水sal為800,姓名后添加個S。
UPDATE emp SET sal=800, name=name ||’s’ WHERE 編號=’7369’
習題:
--修改emp表中部門編號為30的工資+100。
--將emp表中所有人的工資提升10%。
4. 查詢/檢索數據
SELECT * FROM 表名
三、查詢/檢索
1. 簡單查詢
SELECT * FROM tb_name;
SELECT sid, sname FROM tb_name;
SELECT DISTINCT sname FROM tb_name;
SELECT age*2 FROM tb_name;
SELECT sname AS 姓名 FROM tb_name;
2. 查詢中的偽表dual
dual偽表,它確實是一張表,表中只有一個字段
SELECT * FROM dual;
為什么要偽表?
因為Oracle數據庫中SQL標準規定,SELECT語句中必須有FROM,就是必須有表名。
SELECT 9*999 FROM dual;
SELECT ‘好好學習’,’天天向上’ FROM dual;
提示:用dual來做一個偽表,也就是數據不在任何一張表的時候使用它。
3. 偽列ROWID、ROWNUM
ROWID 是表中行的存儲地址,唯一標識符。
通過ROWID可快速查找到某行。
ROWNUM 類似SQL Server中的ROW_NUMBER()函數,為查詢出的每條記錄進行連續不間斷編號。
在Oracle中一般用于分頁。
示例1:查看偽列
SELECT *,ROWID,ROWNUM FROM tb_name;
示例2:求前兩條記錄(Oracle不支持TOP)
SELECT *,ROWNUM FROM emp WHERE ROWNUM<3;
示例3:求3~5條記錄(ROWNUM只能作用于小于號)
SELECT * FROM (
SELECT *,ROWNUM rid FROM emp
) tb WHERE rid>2 AND rid<5;
示例4:求薪水前5的人
SELECT t.*, ROWNUM FROM (
SELECT * FROM emp ORDER BY sal DESC
) t WHERE ROWNUM < 6;
4. 查詢子句
4.1 WHERE子句
WHERE是條件查詢,WHERE后一般都接查詢的條件。
SELECT * FROM tb_name WHERE sex=’男’;
SELECT * FROM tb_name WHERE age<18;
SELECT * FROM tb_name WHERE name LIKE ‘張%’;
4.2 GROUP BY子句
GROUP BY是分組查詢,即按某個列分組,一般用于分組統計,常與聚合函數配合使用。
SELECT COUNT(*) FROM tb_name GROUP BY deptno;
4.3 HAVING子句
HAVING是對分組查詢后的結查進行過濾。
SELECT COUNT(*) FROM tb_name GROUP BY deptno HAVING COUNT(*)>2;
4.4 ORDER BY子句
ORDER BY是按某列進行升序或降序排列。
SELECT * FROM tb_name ORDER BY birthday DESC;
5. 查詢常見函數的使用
5.1 聚合函數
COUNT(*或列名)、SUM(列名)、AVG(列名)、MAX(列名)、MIN(列名)
5.2 NVL(exp1, exp2)
當exp1為NULL,則用exp2替代。與SQL Server中的isNull()相同。
示例:求emp表中每人的收入(薪水+獎金)
SELECT sal+NVL(comm, 0) FROM emp;
注意:
SELECT t.*,ROWNUM FROM emp t ORDER BY sal+NVL(comm,0);
先通過ROWNUM分號,再進行排序,結果會導致ROWNUM混亂。
5.3 NVL(exp1, exp2, exp3)
當exp1為NULL,返回exp2,否則返回exp3
示例:
SELECT sal+NVL(comm, 0, comm+100) FROM emp;
--如果comm為NULL,則用0替代comm的值;否則comm+100。
5.4 IS NULL
Oracle規定NULL不能用=號來判斷邏輯關系,須使用IS NULL。
示例:查詢沒有獎金的人
SELECT * FROM emp WHERE comm IS NULL;
四、高級查詢
1. 多表連接查詢
笛卡爾積交叉查詢:
SELECT e.ename, d.dname FROM emp e, dept d
內聯查詢:返回多個表中共同的數據
SELECT * FROM emp e, dept d WHERE e.deptno = d.deptno;
SELECT * FROM emp e INNER JOIN dept d ON e.deptno = d.deptno;
左、右外聯查詢:
左外聯查詢即以左表為準;右外聯查詢即以右表為準。
怎么判斷左表還是右表?前面的表為左表,后面的表為右表。
SELECT * FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;
SELECT * FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno;
(+)左外聯寫法:
SELECT * FROM emp e, dept d WHERE e.deptno=d.deptno(+);
(+)右外聯寫法:
SELECT * FROM emp e, dept d WHERE e.deptno(+)=d.deptno;
提示: (+)=:放在等號的左邊,表示右連接;
=(+):放在等號的右邊,表示左連接;
全聯查詢:
全聯不支持(+)這種寫法
SELECT * FROM emp e FULL JOIN ,dept d ON e.deptno=d.deptno;
2. 子查詢(嵌套查詢)
2.1 簡單子查詢
簡單子查詢是指子查詢返回一個值時做為外部查詢的一個條件。(使用>、=、
SELECT deptno FROM emp WHERE ename=’KING’
示例1:求收入第3~6名的員工
SELECT * FROM (
SELECT t.*, ROWNUM mya FROM (
SELECT * FROM emp ORDER BY sal+NVL(comm,0) DESC
) t
) a WHERE mya BETWEEN 3 AND 6;
--ROW_NUMBER()寫法:
SELECT * FROM (
SELECT t.*,ROW_NUMBER() OVER(ORDER BY sal+NVL(comm,0) DESC) myr FROM emp t
) t WHERE myr BETWEEN 3 AND 6;
2.2 IN或NOT IN子查詢
IN或NOT IN子查詢是子查詢返回多個值時使用。
SELECT * FROM tb_name WHERE sid IN (
SELECT sid FROM tb_name WHERE sex = ‘男’
);
2.3 EXISTS或NOT EXISTS子查詢
EXISTS 操作對在子查詢的結果集中存在的行進行檢驗。
示例1:查找是否存在emp表
IF EXISTS( SELECT * FROM sysdatabases WHERE name=’emp’ )
示例2:查找至少有一個雇員的經理
SELECT * FROM emp
WHERE EXISTS (
SELECT 'X' FROM employees WHERE r_id =e_id
);
如果返回X,則TRUE;否則FALSE.最后看是不是TRUE,即返回X。
總結
以上是生活随笔為你收集整理的oracle将查询结果声明为伪表,Oracle查询操作(增删改查,伪表,高级查询)实例讲解...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP7不能用string类名,thin
- 下一篇: 胰腺癌吃点什么中药能延长生命期(胰腺癌吃