1. 程式人生 > >Oracle sql查詢語法

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