1、外來鍵為某個表中的一列,它包含另乙個表的主鍵值,定義了兩個表之間的關係。通過外來鍵查詢:
select vend_name, prod_name, prid_price from vendors, products where vendors.vend_id = products.vend_id order by vend_name, prod_name;
在引用的列可能出現二義性,必須使用完全限定列名。
如果沒有用where子句進行條件過濾則返回的結果是笛卡爾積,即兩個錶行的乘積。
2、上條的語句所用的聯結是等值聯結,它基於兩個表之間的相等測試,這種聯結也成為內部聯結。對於這種聯結可以使用不同的語法:
select vend_name, prod_name, prod_price from vendors inner join products on vendors.vend_id = products.vend_id;
ansi sql規範首先inner join語法。
3、sql對一條select語句中可以聯結的表的數目沒有限制,建立聯結規則基本相同。
但mysql在執行時關聯指定的每個表以處理聯結,這種處理可能很耗費資源,因此不要聯結不必要的表,聯結的表越多效能下降越厲害。
4、自聯結
加入想查詢id為dtntr的物品相同生產廠家的其他物品,可以採用子查詢的方式:
select prod_id, prod_name from products
where vend_id = ( select vend_id from products where prod_id =『dtntr』);
也可以採用自聯結的方式:
select p1.prod_id, p1.prod_name from products as p1, products as p2 where p1.vend_id = p2.vend_id and p2.prod_id = 『dtntr』;
在查詢中需要的兩個表實際上是相同的表,但對products的引用具有二義性,所以使用表別名。
自聯結通常作為外部語句用來替代從相同表中檢索資料時使用的子查詢語句。雖然結果相同,但處理聯結比處理子查詢快很多。
5、外部聯結
select customers.cust_id, orders.order_num
from customers left outer join orders
on customers.cust_id = orders.cust_id;
在使用outer join 時必須使用right或left關鍵字指定包括沒有關聯行的表。left指outer join左側的表,以此類推。
6、組合查詢union
組合數條sql查詢:
select vend_id, prod_id, prod_price
from products
where prod_price <= 5
union
select vend_id, prod_id, prod_price
from products
where vend_id in (1001, 1002);
組合時列的型別必須相容,不必完全相同,但是可以隱式的轉換。
組合結果時會自動去掉重複的行,如果不想去掉重複行需使用union all代替union。
對組合結果進行排序,只能使用一條order by子句,它必須出現在最後一條select語句之後。
7、全文搜尋
使用match()和against(),match()指定要搜尋的列,against()指定匹配的文字。
搜尋的列必須建立搜尋索引,建立表時用fulltext()包含列。
只有myisam引擎支援全文搜尋,innodb不支援,並且漢語不具有詞分隔符,所以不能返回全文搜尋的結果,所以工作中應該很少用到。
8、插入
插入完整行,不指定列名插入
insert into customers
values(value1,value2, …valuen);
指定列名插入
insert into 表名(列名1, 列名2,…,列名n)
values(value1, valuen);
如果表的定義允許,則可以在insert操作中省略某些列,省略的列必須滿足以下條件之一:
該列定義為允許null值;
在表定義中給出預設值。
insert語句很耗時,而且可能降低等待處理的select語句的效能。如果資料檢索是最重要的,則可以通過在insert和into之間新增關鍵字low_priority,指示mysql降低insert語句的優先順序。同樣適用於update和delete語句。
可以一條語句插入多行:
insert into 表名(列名1, 列名2,…,列名n)
values(value1,valuen),
(value1, valuen);
9、插入檢索出的資料 insert select
insert into 表名(列名1, …,列名n)
select 列名1,…,列名n
from 另乙個表名;
10、更新資料update
update 表名
set 列名1=value1, 列名2=value2
where 過濾條件;
如果用update語句更新多行,並且在更新這些行中的一行出現錯誤時,則整個update操作被取消;如果想即使發生錯誤也繼續進行更新使用:update ignore 表名。
11、刪除資料
delete from 表名
where 過濾條件;
如果想從表中刪除所有行,不要使用delete。可使用truncate table語句,它完成相同的工作,但速度更快。truncate table實際是刪除原來的表並重新建立乙個表,而不是逐行刪除表中的資料。
在使用update或delete語句前,應該先用select帶相同的where子句進行測試,保證它過濾的是正確的記錄。
12、建立表
create table customers (
cust_id int(11) not null auto_increment,
cust_name char(50) not null,
cust_address char(50) default null,
cust_city char(50) default null,
cust_state char(5) default null,
cust_zip char(10) default null,
cust_country char(50) default null,
cust_contact char(50) default null,
cust_email char(255) default null,
primary key (cust_id
)
) engine=innodb auto_increment=10006 default charset=latin1
建立的表名必須不存在,如果存在將報錯。如果僅想在乙個表不存在時建立它,應該使用create table if not exists 表名。
是否可以為null設定,null為預設值。主鍵只能使用不允許為null的列。
13、auto_increment
每個表只能有乙個auto_increment列,而且它必須被索引。
如果乙個列被指定為auto_increment,它還可以被賦予特殊值,在insert語句中指定值,並且保證它是唯一的即可。該值將被用來替代自動生成的值,後續的增量將開始使用該手工插入的值。
使用last_insert_id()函式可以返回最後乙個auto_increment值。
14、通過defautl關鍵字可以指定列的預設值。mysql不允許使用函式作為預設值,它只支援常量。
建議使用預設值而不是null。
15、引擎型別
dbms使用內部引擎管理和處理資料。mysql具有多種引擎:
innodb是乙個可靠的事務處理引擎,不支援全文搜尋;
memory引擎資料儲存在記憶體中,速度很快(特別適合於臨時表);
myisam是乙個高效能引擎,支援全文搜尋。不支援事務處理。
引擎可以混用,不同的表使用不同的引擎。但是外來鍵不能誇引擎。
16、更新表alert table
新增乙個列:alter table vendors add vend_phone char(20);
刪除乙個列:alter table vendors drop column vend_phone;
定義外來鍵:alter table orderitems add constraint fk_orderitems_oders
foreign key (order_num) references orders(order_num);
17、刪除表drop table 表名
18、重新命名表 rename table 原表名 to 新錶名;
19、檢視是虛擬的表,是幾個表聯結查詢的動態結果。檢視不儲存資料,每次檢視檢視時,要重新執行查詢底表語句,因此大型、複雜檢視效能低。
20、使用檢視的優點:
· 重用sql語句,簡化複雜查詢,不必重複編寫查詢聯結細節。
· 保護資料,可以給使用者授權只能訪問表的一部分資料。
· 更改資料格式和表示,與底表可以不同。
21、建立檢視:create view 檢視名 as select …
檢視建立檢視的語句:show create view 檢視名;
刪除檢視:drop view 檢視名;
更新檢視:
a.先刪除drop view,再建立;
b. create or replace view 檢視名,如果檢視不存在就建立,檢視存在就替換。
mysql必知必會 mysql必知必會(四)
十四 理解子查詢 1 通過子查詢過濾 這本書在所有的章節都關連到了資料庫表,訂單資料是儲存在兩個表中,orders表儲存著 訂單號碼 顧客id和訂單日期。個人的訂單列表關連著orderitems表,訂單表沒有儲存顧客資訊,它只是儲存著顧客id,這實際的顧客資訊是儲存在customers表中。現在假設...
mysql的必知必會 mysql 必知必會 筆記
好久沒有寫了。1 show columns from table 等同於describe table顯示的是表的結構。而select from table 則顯示的是整個表中插入的資料。2 select distinct c1,c2 from table除非列不相同,否則所有行將被檢索出來,即不能對...
mysql必知必會
一周了,總想寫點什麼,有的時候進步真的很難在一周顯示出來,週三的時候,我跟我的領導說,好快啊,又週三了,不知不覺,他說是啊,現在對於他來說,有時候他過一天可能跟我過一周的感覺差不多,每天都在忙,時間過的特別快,也沒有感覺做出來點什麼,當然實際肯定是怎麼做了一些東西的,是否我以後也會如此呢?說說技術把...