(原)SQL掃盲貼

urinator發表於2009-03-06

select 這句話,我相信你已經知道了

就是 select 表裡面的列 column1, column2 from 表的名字;

比方表的名字是 employee 僱員,然後列,有 ID, 姓名 name,職位 title,部門dpet,薪水 salary,你只要知道名字和薪水

就是 select name, salary from employee;

簡單吧?

如果要加上條件,就是加一句 where 在最後,比方你要知道部門 id 是 20 的職員的薪水,

就是:


select name, salary from employee where dept=20;

也很簡單,是不是?

order by 你也會用的,我不用說了吧?就是排序?

正排,反排是 order by column_name desc

上面這些,對於一個表的操作,基本上就是這些了,

但是要注意的地方,比方在 where 這句裡面

如果是 文字的 列 要用 單引號或者雙引號

WHERE tblStaff.Department = "Marketing”

or

  WHERE tblStaff.Department = 'Marketing’

數字就是不用。

  WHERE tblInvoices.InvoiceNumber > 1500

據說日期要用 # 我不記得了,你自己試驗一下

WHERE tblStaff.BirthDate = #09/27/1950#

對了,還有一個地方,要明確一下,就是 where 的時候要用括號

比方,你要找 dept 10 和 20 的月薪大於 2000 的人

要用到 括號

where (dept=20 or dept=10) and salary >2000  這樣來限定你選擇的資料


比方說,同樣的 employee 的表,你要知道每個部門每個月發放的的工資,要這樣寫

select dept, sum(salary) from employee
group by dept;


這樣你使用的單列的 function, 如果需要對上面資料作限定,比方 部門單月工資超過 100,000 的,這個時候用 having


select dept, sum(salary) from employee
group by dept
having sum(salary) > 100000;

 

如果說多個表,就要說到表之間的關聯,所謂的 primary key and foreigh key 就是外來鍵之間的關係

 

RDBMS relational database management system 中要把資料放入一個資料庫,要遵循 normalization, 這玩意一級一級說上去,挺麻煩的,主要就是說,在資料庫裡面的資料不要重複存放。

比方上面說的 employee 的表,就存放的一個 部門 id,  因為如果存放了 部門的名字,就會出現很多重複的資料,這個時候,就要另外做一個部門表


dept  包括 dept_id, dept_name, location(地點),在這個表裡面,部門 id 不能重複的,可以做 primary key.

在 employee 的表裡面,每個員工的 id 也是不能重複的,是 primary key. 


這個時候,employee 表裡面的存在的 dept_id 的這個列,就要對應 dept 裡面 dept_id 的這個列。他們之間的關係,是 多 對 一

dept_id 在 employee 的表裡面,就是外來鍵,foreign key 對應 dept 表的 PK

這是聯絡這兩個表的線索。

這個關係不一定是物理存在,但是如果要 query 兩個表,這兩個表一定要有某種關係

n 個表之間,如果算起來最少的關係,應該有 n-1 個 條件


比方:

表: A  列  x, y   其中 x, pk  y fk to B.y
表  B     列  y, p  ....  跟上面相同
表 C  列 p, q  ...

如果要把所有的資料選出來,是這樣

select A.x, B.y, C.p, C.q
from A, B, C
where A.y=B.y
and B.p = C.p;


這個關係理順了,表才能聯合正確。條件要剛剛好,如果重複加疊已經建立正確的關係的表,會引發 performance 效能方面的問題

pk primary key 主鍵的意思,簡單點說,就是這個欄位或者這個一組欄位不能重複,如果重複則報錯,儲存不進去。
那個query 的意思是,如果你想從2個表中去資料,那必須2個表其中的欄位能夠關聯起來。比如你的人事表中有工號,你的薪資表中也有工號,那可以通過2個表的工號連線,把2個表的資料顯示在一行。

pk 就是 primary key  是不是叫主鍵,一般來說每個表都有一個主鍵,不能空,不能重複這樣的列。

query 就是 查詢語句。

關於 union 有兩種,union 和 union all


如果兩個表的結構完全相同,你可以:


SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

如果這兩個表中又重複的資料,union 之後重複的資料只出現一次,


SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

這樣的話,重複的資料,不會被踢出去~~~

pk是主鍵,fk是外來鍵

例如2個表
1.   item,name,item_type,warehouse....

  2.   warehouse,name ,quantity

   2表 的warehouse關聯,      item 為 1這個表的 pk,warehouse 是其外來鍵,warehouse 是表2的主鍵,,

比方你說得你的十二個月的工資表

如果要要查詢資料,十二個月並起來,是沒有問題的

但是如果十二張單表,都是用 employ_id 做的主鍵

如果一個人領了超過兩次的工資,這個 id 就有重複了,就不能符合主鍵的定義了
所以如果合併的話,不能有主鍵


但是你如果建立一個新表,不設立主鍵,只要你自己知道資料沒有錯誤,也是沒關係的:比方

create table ABC as
(select columns from A union all select columns from B ...)

你選的 columns 都要一致。。。
2、如果要從6個表中查詢某人在6個月的工資,怎麼寫?


第二個,

如果這個人的emp_id 是 008

select emp_id, name, salary from table_month_1 where emp_id=008
union all
select emp_id, name, salary from table_month_2 where emp_id=008
union all
select emp_id, name, salary from table_month_3 where emp_id=008
union all
select emp_id, name, salary from table_month_4 where emp_id=008
union all
select emp_id, name, salary from table_month_5 where emp_id=008
union all
select emp_id, name, salary from table_month_6 where emp_id=008;


 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7942439/viewspace-563135/,如需轉載,請註明出處,否則將追究法律責任。

相關文章