資料庫相關

2021-10-07 17:29:07 字數 3896 閱讀 2302

資料庫中模糊查詢命令like有兩個萬用字元」%」和」_」,其中:

%匹配0或多個字元

_匹配任意1個字元(必須有乙個)

即巢狀在其他查詢中的查詢,乙個 select 語句的查詢結果能夠作為另乙個語句的輸入值

注意:mysql 的早期版本不支援子查詢,對子查詢的支援是從4.1 版本引入的。

看乙個例子:

select cust_id

from orders

where order_num in (select order_num

from orderitems

where prod_id = 『rgan01』);

在select 語句中,子查詢總是從內向外處理。在處理上面的select 語句時,dbms 實際上執行了兩個操作。

首先,它執行下面的查詢:

select order_num from orderitems where prod_id=『rgan01』

此查詢返回兩個訂單號:20007 和20008。然後,這兩個值以in 操作

符要求的逗號分隔的格式傳遞給外部查詢的where 子句。

外部查詢變成:

select cust_id from orders where order_num in (20007,20008)

可以看到,輸出是正確的,與前面硬編碼where 子句所返回的值相同。

使用子查詢的另一方法是建立計算字段。假如需要顯示customers 表中每個顧客的訂單總數。訂單與相應的顧客id 儲存在orders 表中。

執行這個操作,要遵循下面的步驟:

(1) 從customers 表中檢索顧客列表;

(2) 對於檢索出的每個顧客,統計其在orders 表中的訂單數目。

select cust_name,

cust_state,

(select count(*)

from orders

where orders.cust_id = customers.cust_id) as orders

from customers

order by cust_name;

這條select 語句對customers 表中每個顧客返回三列:cust_name、cust_state 和orders。orders 是乙個計算字段,它是由圓括號中的子查詢建立的。該子查詢對檢索出的每個顧客執行一次。在此例中,該子查詢執行了5 次,因為檢索出了5 個顧客。

where orders.cust_id = customers.cust_id

用乙個句點分隔表名和列名,在有可能混淆列名時必須使用這種語法。

好的做法是,如果在select 語句中操作多個表,就應使用完全限定列名來避免歧義。

sql 最強大的功能之一就是能在資料查詢的執行中聯結(join)表。聯結

是利用sql 的select 能執行的最重要的操作,很好地理解聯結及其語

法是學習sql 的極為重要的部分。

關係表關鍵是,相同的資料出現多次決不是一件好事,這是關聯式資料庫設計的

基礎。關係表的設計就是要把資訊分解成多個表,一類資料乙個表。各

表通過某些共同的值互相關聯(所以才叫關聯式資料庫)。

將**商資訊與產品資訊分開儲存的理由是:

 同一**商生產的每個產品,其**商資訊都是相同的,對每個產品

重複此資訊既浪費時間又浪費儲存空間;

 如果**商資訊發生變化,例如**商遷址或**號碼變動,只需修

改一次即可;

 如果有重複資料(即每種產品都儲存**商資訊),則很難保證每次

輸入該資料的方式都相同。不一致的資料在報表中就很難利用。

關聯式資料庫的可伸縮性遠比非關聯式資料庫要好。

可伸縮(scale):

能夠適應不斷增加的工作量而不失敗。設計良好的資料庫或應用程式

稱為可伸縮性好(scale well)。

為什麼使用聯結

簡單說,聯結是一種機制,用來在一條select 語句中關聯表,因此稱為聯結。使用特殊的語法,可以聯結多個表返回一組輸出,聯結在執行時關聯表中正確的行。

例子:select vend_name, prod_name, prod_price

from vendors, products

where vendors.vend_id = products.vend_id;

where 子句的重要性

在聯結兩個表時,實際要做的是將第乙個表中的每一行與第二個表中的每一行配對。where 子句作為過條件,只包含那些匹配給定條件(這裡是聯結條件)的行。

笛卡兒積(cartesian product)

由沒有聯結條件的表關係返回的結果為笛卡兒積。檢索出的行的數目將是第乙個表中的行數乘以第二個表中的行數。返回笛卡兒積的聯結,也稱叉聯結(cross join)

內聯結目前為止使用的聯結稱為等值聯結(equijoin),它基於兩個表之間的相

等測試。這種聯結也稱為內聯結(inner join)。其實,可以對這種聯結使

用稍微不同的語法,明確指定聯結的型別。下面的select 語句返回與

前面例子完全相同的資料:

例子:select vend_name, prod_name, prod_price

from vendors inner join products

on vendors.vend_id = products.vend_id;

這裡,兩個表之間的關係是以inner join 指定的部分from 子句。在使用

這種語法時,聯結條件用特定的on 子句而不是where 子句給出。傳遞

給on 的實際條件與傳遞給where 的相同。

聯結多個表

例子:select prod_name, vend_name, prod_price, quantity

from orderitems, products, vendors

where products.vend_id = vendors.vend_id

and orderitems.prod_id = products.prod_id

and order_num = 20007;

這裡的from 子句列出三個表,where 子句定義這兩個聯

結條件,而第三個聯結條件用來過濾出訂單20007 中的物品。

注意:效能考慮

dbms 在執行時關聯指定的每個表,以處理聯結。這種處理可能非常

耗費資源,因此應該注意,不要聯結不必要的表。聯結的表越多,性

能下降越厲害。

目的:縮短sql 語句;

允許在一條select 語句中多次使用相同的表。

例子:select cust_name, cust_contact

from customers as c, orders as o, orderitems as oi

where c.cust_id = o.cust_id

and oi.order_num = o.order_num

and prod_id = 『rgan01』;

ustomers as c 使用c作為customers 的別名,如此等等。這樣,就可以使用省略的c 而不用全名customers。在這個例子中,表別名只用於where 子句。其實它不僅能用於where 子句,還可以用於select 的列表、order by 子句以及其他語句部分。

需要注意,表別名只在查詢執行中使用。與列別名不一樣,表別名不返回到客戶端。

自聯結(self-join)、自然聯結(natural join)和外聯結(outer join)

資料庫相關

1.操作類 godb public goosundb open throws sqlexception public void close public cursor search int mark mark mark,null,null,null,col date desc if cursor n...

資料庫相關

資料庫的設計 分庫分表,記憶體資料庫,主從讀寫分離,資料庫中介軟體mycat 整合了主從讀寫分離,分庫分表等功能 資料庫優化 sql語句優化,資料庫配置優化,索引優化,資料庫設計優化 資料庫的鎖 1.樂觀鎖,表中增加版本字段,每次更改加1,查的時候先把版本字段查出來,更新的時候加上條件版本欄位沒變,...

資料庫相關

1 多顯示乙個字段,格式 使用者名稱 手機號 select concat name,tel from user 2 手機號顯示 132 22 select concat left tel,3 right tel,2 as 安全手機號 from user 1 多顯示乙個字段,格式 使用者名稱 手機號 ...