Oracle sql查詢語法
一、查詢資料
select
語法:
SELECT
column_1,
column_2,
...
FROM
table_name;
select要求
-
首先,指定要從中查詢資料的表名(必須有from子句)。
-
其次,指示要從中返回資料的列。如果您有多個列,則需要用逗號(,)分隔每個列。
查詢單列
從customers表中獲取名稱
select name
from customers;
查詢多列
dual
虛表
在Oracle中,SELECT
語句必須有一個FROM
子句。但是,某些查詢不需要任何表格,例如:
SELECT UPPER('love') FROM table)name
為了符合語法要求,Oracle為您提供了DUAL
一個表,該表是一個特殊的表,它是為快速訪問而設計的。
除了呼叫內建函式之外,您還可以在SELECT
訪問DUAL
表的查詢子句中使用表示式:
SELECT
(10+ 3)/2
FROM
dual;
二、排序
語法:
SELECT column_1, column_2, column_3, ... FROM table_name ORDER BY column_1 [ASC | DESC] [NULLS FIRST | NULLS LAST], column_1 [ASC | DESC] [NULLS FIRST | NULLS LAST],
單列排序
顧客表根據名字升序排列
SELECT
name,
address,
credit_limit
FROM
customers
ORDER BY
name ;
多列排序
聯絡表根據first_name升序排列,根據last_name降序排列。
SELECT
first_name,
last_name
FROM
contacts
ORDER BY
first_name,
last_name DESC;
null值排序問題
查詢position表根據 city state排序並觀察結果
SELECT country_id, city, state FROM locations ORDER BY state;
oracle允許描述null值與非null值在排序當中到底誰先出現。比如我們期望這個null優先
SELECT
country_id,
city,
state
FROM
locations
ORDER BY
state nulls first;
大家可以猜想一下first有,那麼?
根據列的位置排序
SELECT
name,
credit_limit
FROM
customers
ORDER BY
2 DESC,
1;
注意這裡的2代表了credit_limit, 1代表name
根據函式或者表示式排序
根據顧客表名字(轉換為大寫之後排序)
SELECT
customer_id,
name
FROM
customers
ORDER BY
UPPER( name );
三、去除重複資料
語法
-- 單列
SELECT DISTINCT
column_1
FROM
table;
-- 多列
SELECT
DISTINCT column_1,
column_2,
...
FROM
table_name;
單列去除重複
SELECT DISTINCT
first_name
FROM
contacts
ORDER BY
first_name;
多列去除重複
SELECT
DISTINCT product_id,
quantity
FROM
ORDER_ITEMS
ORDER BY
product_id;
去除重複關於null
DISTINCT
將NULL值視為彼此重複。如果使用該SELECT DISTINCT
語句從具有許多NULL值的列查詢資料,則結果集將僅包含一個NULL值。
SELECT
DISTINCT state
FROM
locations;
四 、條件查詢
語法
SELECT
column_1,
column_2,
...
FROM
table_name
WHERE
search_condition
ORDER BY
column_1,
column_2;
簡單等值判斷
SELECT
product_name,
description,
list_price,
category_id
FROM
products
WHERE
product_name = 'Kingston';
使用比較符號判斷
除了相等運算子之外,Oracle還為您提供了下表中說明的許多其他比較運算子:
*操作符 | 描述 |
---|---|
= | 平等 |
!=,<> | 不等式 |
> | 比...更棒 |
< | 少於 |
> = | 大於或等於 |
<= | 小於或等於 |
in | 等於值列表中的任何值 |
any/some/all | 將值與列表或子查詢進行比較。它必須在另一個運算子之後,例如=,>,<。 |
not in | 不等於值列表中的任何值 |
not between x and y | 相當於[Not]> = n and <= y。 |
[not] exists | 如果子查詢返回至少一行,則返回true |
IS [NOT] null | NULL測試 |
比如
SELECT
product_name,
list_price
FROM
products
WHERE
list_price > 500;
多條件組合
使用 and or not
比如
SELECT
product_name,
list_price
FROM
products
WHERE
list_price > 500
AND category_id = 4;
五、別名
當你[從一個表中查詢資料,Oracle使用的表的列名顯示的列標題,有時候列明本身可能含義並不明確,需要使用一個別的名字表達更清晰點,就可以通過使用別名來完成。有時,你希望簡化這些列明顯示也可以這麼做
別名可以使用在列名和表名上
列別名
比如
SELECT
first_name AS fname,
last_name AS lname
FROM
employees;
as 關鍵字可以省略。此外如果列名別名要包含空格,則別名必須使用""引起來,否則無法通過。
比如
SELECT
first_name "First Name",
last_name "Family Name"
FROM
employees;
表別名
語法
table_name AS table_alias
table_name table_alias
在不使用表別名的情況下列的限定如下
table_name.column_name
但是,在為表分配表別名後,必須使用別名而不是表名:
table_alias.column_name
六、抓取
mysql和postgresql具有LIMIT
允許您檢索查詢生成的行的一部分的子句。但是oracle並沒有limit子句,在12c之前, 可以通過子查詢的方式完成這種部分提取功能,這也就是我們的分頁sql
。自12c釋出以來,它提供了一個類似但更靈活的子句,稱為行限制子句。
需求:取庫存級別最高的前5個產品
這裡需要使用到兩個表
-
inventories 庫存
-
products
指定多少行
SELECT
product_name,
quantity
FROM
inventories
INNER JOIN products
USING(product_id)
ORDER BY
quantity DESC
FETCH NEXT 5 ROWS ONLY;
fetch子句的語法
[ OFFSET offset ROWS]
FETCH NEXT [ row_count | percent PERCENT ] ROWS [ ONLY | WITH TIES ]
指定起始行
所以加入,我要6到10 的資料
SELECT
product_name,
quantity
FROM
inventories
INNER JOIN products
USING(product_id)
ORDER BY
quantity DESC
offset 6 rows
FETCH NEXT 5 ROWS ONLY;
使用百分比
SELECT
product_name,
quantity
FROM
inventories
INNER JOIN products
USING(product_id)
ORDER BY
quantity DESC
FETCH NEXT 5 percent rows ONLY;
七、模糊查詢
語法
expresion [NOT] LIKE pattern [ ESCAPE escape_characters ]
expression:
這expression
是一個列名或要對其進行測試的表示式pattern
。
pattern:
是一個要搜尋的字串expression
。該pattern
包括以下萬用字元:
-
%(百分比)匹配零個或多個字元的任何字串。
-
_(下劃線)匹配任何單個字元。
escape_character:
是出現在萬用字元的前面指定萬用字元不應該被解釋為一個萬用字元
萬用字元%使用
SELECT
first_name,
last_name,
phone
FROM
contacts
WHERE
last_name LIKE 'St%'
ORDER BY
last_name;
萬用字元_使用
SELECT
first_name,
last_name,
email,
phone
FROM
contacts
WHERE
first_name LIKE 'Je_i'
ORDER BY
first_name;
escape使用
SELECT
product_id,
discount_message
FROM
discounts
WHERE
discount_message LIKE '%25!%%' ESCAPE '!';
這裡25後面的第一個%期望他就是一個%不要再解釋為萬用字元,這個時候就要無視通配的含義
持續完善中ow