Java之數據庫相關內容
——MySQ數據庫與JDBC編程
一.JDBC:Java database connectivity 即Java數據庫連接,是一種可以執行SQL語句的Java 即。即可以通過這個鏈接對外連接數據庫。
這體現了Java的跨平臺性。
JDBC可以完成下列操作:
1, 建立與數據庫的連接
2, 執行SQL語句
3, 獲得SQL語句的執行結果
JDBC驅動有四種形式,主推一種形式:
純Java的,直接與數據庫實例交互,這種驅動是智能的,它知道數據庫使用的底層協議。
二.MySQL數據庫基本命令與關係數據庫
數據庫的全稱是:database management system簡稱DBMS
DBMS是所有數據的知識庫,它負責儲存,安全,一致,併發,恢復和訪問等操作。
DBMS有一個數據字典(有時也被稱之爲系統表),它擁有儲存每個事物的相關信息。
根據時間順序出現了四種數據庫:
網狀數據庫,層次數據庫,關係數據庫,面向對象數據庫。
上述四種數據庫中,關係數據庫理論最成熟,應用最廣泛。
對於關係數據庫而言最基本的儲存單元就是數據表,因此可以簡單地把數據庫想象成表的集合,當然這只是簡單的認爲。
數據表是數據儲存的邏輯單元,可以將表理解爲由行和列組成的表格,其中每一條稱之爲一條記錄,每一列也被稱之爲一個字段。爲數據庫建表時通常要指出該表包含多少列,
每行數據類型。無需指定需要多少行,因爲行是動態改變的,每行用於保存一條用戶數據。
除此之外還應該爲每個數據表指定一個特殊列,該特殊列可以唯一的表示此行記錄,這叫做主鍵列。
MySQL的一個實例Server instance可任意同時包含多個數據庫,mySQL通過下列命令來查看當前實例包含多少個數據庫。
show database;
用戶想要創建一個新的數據庫:
create database [IF NOTEXISTS] 數據庫名;
刪除數據庫:
Drop database 數據庫名;
建立數據庫後若想要操作數據庫(進行增刪改查等工作):
Use database;
進入數據庫後若想知道該數據庫包含多少個表:
Show tables;
查看錶結構(看有多少列,每行的數據類型等信息):
Desc 表名;
如果一次性將多條數據庫命令導入到mySQL數據庫命令行窗口裏,這種方式被稱之爲導入SQL腳本。
MySql的兩種儲存機制:
MyISAM:MySQL早期的儲存機制。
Innodb:innoDB提供事物的安全的儲存機制。通過建立行級鎖,保證事務完整性。這是默認的儲存方式,可以通過skip-innodb命令進行調整。
若要在建表的時候默認任何一種儲存機制,可以在建表語法後加入下面任何一句:
ENGING=MyISAM強制使用MyISAM儲存方式
ENGING=InnoDB強制使用InnoDB儲存方式
SQL語句介紹:
(結構化查詢語言)
Sql 語言是數據庫檢索關鍵數據的標準語言。
使用SQL語言實現的功能主要有:
1, 在數據庫中檢索信息。
2, 對數據庫的信息進行更新
3, 改變數據結構
4, 更改系統安全設置
5, 增加用戶對數據庫或表的許可權限。
上述五個功能前三個主要有程序員來完成,但後兩個主要有dba來完成。
根據語言來分類:
主要有以下幾種:
1, 查詢語句:select關鍵字,查詢語句在所有數據庫語言中是最重要的。
2, DML語句(數據操作語言):insert(插入),delete(刪除),update(更新)。
3, DDL語言(數據定義語言):create,alert,drop,truncate(清空數據表)。
4, DCL語言(數據控制語言):grant,revoke。
5, 事物控制語句:commit,rollback,savepoint。
特別的SQL語句關鍵字不區分大小寫。
其中dcl語句用於授權用戶權限,收回權限,通常不需要程序員來完成。
SQL命令中可以使用標識符,可以用於定義表名,列名,也可以用於定義變量。
規則:
1,標識符通常需要以字母開頭。
2,標識符包括字母,數字,#,_,$。
3,不能使用數據庫語言的關鍵字保留字。建議使用多個關鍵字中間以_連接。
4,同一個模式下的對象不應該重名。
DDL語句與數據庫中的數據類型:
常見數據庫對象:
表table:數據庫的邏輯單元,以行和列存在,列就是字段,行就是記錄。
數據字典(系統表):存放系統關鍵信息的表。程序員不應更改,只能查詢。
約束constraint:執行數據校驗的規則。
視圖view:一個或多個表中數據的顯示方法,不用於儲存數據。
索引index:用於提高數據的查詢性能,相當於目錄。
函數function:用於完成一次特定的計算,具有一個返回值。
存儲過程procedure:用於完成一次完整的業務處理,沒有返回值,但可以通過傳出參數將多個值傳給調用環境。
觸發器trigger:相當於一個數據監聽器。
這些數據庫對象都可以通過DDL語言進行相對應的create alert drop truncate
建表語法:
Create table [模式名]表名
(
#多個列的定義
列名 數據類型,
……
)
每個列名的之間以“,”隔開
若要使用列默認值,使用關鍵字-default
MySQL中的列數據類型:
Tinyint/samllint/mediumint/int(integer)/bigint1字節2字節3字節4字節8字節整數。又可以分爲有無符號。
Float/double
Decimal(dec)精確小數,相對於上述兩個精度的小數不會產生小數丟位問題。
Date日期類型,不能保存時間,當把Java.date對象儲存進來時,會發生時間部分丟失。
Time事件類型,不能保存日期,類似於上面。
Datetime日期,時間類型
timestamp時間戳類型
year年類型只保存年
char定義長字符串類型
varchar可變長度字符串類型
binary定義二進制字符串類型,以二進制保存字符串類型。
Varbinary可變二進制字符串類型。
Tinyblob/blob/midiumblob/longblob1字節2字節3字節4字節的二進制大對象,可用於儲存圖片,音樂等二進制文件分別可儲存:255b,64k,16m,4g
Tinytext/text/midiumtext/longtext1字節2字節3字節4字節文本對象,可用於儲存超長長度的字符串儲存空間類似於上面的blob。
Enum(‘value1’,‘value2’…)枚舉,只能儲存括號中的類型之一。
Set(‘value1’,‘value2’…)集合,可以是括號中的幾個。
這樣建表的結果僅僅是一個空表,但如果使用子查詢建表語句可以在創建表格的同時添加數據。語法:
Create table 表名1 [字段列表]<可以省略>
As
Select * from 表名2;
這時必須要滿足的:
1, 表2必須已經存在;
2, 表1和表2的字段列表類型和大小必須相同,或者表1沒有字段列表(此時)。
修改表結構數據方法(追加alert):
Alert table 表名
Add
(與建表括號相同);
此時的括號中的列表定義都將追加到原有列定義後面。
提示:如果僅僅是追加新的一列,可以省略括號,僅在add後面追加一個列的定義即可。
注意SQL中的字符串使用單引號引入的,而非雙引號。
修改失敗:新增的列,或者已有列的修改與已有的數據約束相沖突時修改失敗,這是很常見的一種情況。
更改語法:
Alert 表名
Modify列名 數據類型;
可見modify語句不支持一次性更改多個列的定義。
如果數據表裏已有數據記錄則更改數據類型很容易失敗,但是如果要更改默認值,則之前已存在的數據是不會受到影響的,從更改後的數據儲存開始生效。
刪除:
Alert table 表名
Drop 列名;
這個語法總可以成功。回釋放相對應的儲存空間。
重命名數據表:
Alert table 表名
Rename to 新表名;
重命名列名:
Alert 表名
Change 列名 新列名 數據類型;
刪除表:
Drop table表名;
’truncate表:
Truncate被稱爲截斷,他的作用是:刪除表中的全部數據但是保留表的數據結構。
Truncate相對於delete而言要快得多。
語法:
Truncate 表名;
數據庫約束:
上面僅僅是一些對於列的約束,這裏還可以對錶進行相對應的一些列約束,通過約束可以。保證數據表裏數據的完整性。
大部分數據庫支持的5種完整性約束:
NOT NULL:不能爲空,某列不能爲空。
UNIQUE:唯一約束,指定某列或者某幾個列的組合不能重複。
PRIMARY KEY:主鍵指定該列的值可以唯一的標識該條記錄。
FORIGN KEY:外鍵,指定該行記錄從屬於主表中的某一條記錄。
CHECK:檢查,指定該行必須滿足的某一個布爾表達式。
注意:MySQL不支持最後一個check約束
約束也是一種數據,是儲存在數據庫中的。
分爲以下幾類:
單列約束:每個約束之約束一列。
多列約束:相對應。
爲數據表指定約束:
建表的同時爲表指定約束。
建表後創建,以修改表,的形式來修改表。
大部分約束都可以使用列級約束語法,或者表級約束語法。
注意:MySQL使用information_schema數據庫中的TABLE_CONSTRAINTS 來保存這個數據庫中的所有約束信息。
5中約束的建立和刪除:
1, 非空
SQL中的null
1, 不區分大小寫,包括Boolean,float,int都可以是null
2, 與Java相類似,null不是空字符串,也不是0
非空約束的指定只要在每一列定義之後加上一個not null即可。
如:hehe_id int not null,
同時可以使用alert modify加入not null約束。
2, UNIQUE約束
, 唯一約束指定不可以出現重複值,但可以出現多個null,因爲在數據庫中null值是不等於null的。
列級語法指定unique與上面的非空約束相類似。
值的注意的是,唯一約束是有名字的,若不指定約束名則默認爲表的名字。
但是要指定約束名就只能使用表級語法指定約束。
表級約束語法:
Constraint 約束名(可以沒有) 約束定義;<也可以沒有constraint ,但要改名則必有constraint>
例:
Create table text
(
Test _id int not null,
Test_name varchar(255),
Unique (test_name ),
Constraint bb unique(test_id)
)
當然unique後面括號跟隨的內容可以是多個表名以逗號隔開。
也可以在alert table 表名
Add unique();
或者alert table 表名
Modify 列名 數據類型unique;
對於大部分數據庫來說,使用drop constraint 約束名;刪除約束
但MySQL執行drop index 約束名;刪除約束。
3, Primary key 約束
主鍵約束在某種程度上相當於上述兩個約束的集合。
每個表中最多允許有一個主鍵,但這個主鍵可以有多個列組成。(即只能指定一次primary key)
同樣這個時候也是可以使用列級語法,和表級語法。
同上只有表級約束可以指定約束名,但mySQL中默認主鍵約束名:PRIMAY
語法與唯一約束幾乎相同(unique 換爲 primary key即可)。
只有刪除時:
Alert table 表名
Drop primary key;
即可。
很多數據庫對主鍵列都支持一種自增長的特性——主鍵列爲整型時,可以指定自增長。
指定自增長功能通常用於設置邏輯主鍵,改鍵的值沒有任何邏輯意義,僅用於標識(即類似與人的id)。
使用關鍵字:auto_increment,設置某一列的自增長。
在創建列的時候使用:列名 int auto_increment primary key,
4,Foreign key約束
外鍵約束,主要用於兩個字段之間的關係(一個表的兩個字段之間,或者兩個表的兩個字段之間關係)
外鍵確保了兩個字段之間的主從關係,當主表的記錄被刪除時,從表記錄全部被刪除,或者從表的記錄全部刪除後纔可以刪除主表記錄。
從表參照的只能是主表唯一鍵列,或者直接是主鍵列。
同一個表可以同時有多個外鍵。
MySQL在外鍵約束建立時會設置索引。
外鍵約束通常建立在事物之間一對多或一對一關係。
其中增加外鍵列的表叫做從表,從表外鍵列設置爲唯一約束就可以體現一對一的關係。
對於多對多的關係可以增加一個關聯表,來設置之間的關聯關係。
列級語法:
references關鍵字,指定該列參照那個主表。
列名1 數據類型 references表名(列名2)
然後列2就是列1的外鍵了,但mysql此時不會生效該外鍵的設置,這種語法只是爲了使sql語句兼容。
若想生效,則應使用表級語法:
Foreign key (本表列名<即外鍵列>) references 表名 (列名)
使用表級語法同時也可以重命名外鍵約束 在之前加上
constraint 約束名
就可以了。
如果不指定約束名則mysql會自動設置爲
表名_ibfk_n (其中 n=1,2,3……)
其中本表列名和外表列名可以是多個列名,中間以“ ,”
隔開。
同樣刪除約束也是十分簡單:
Alert table 表名
Drop foreign key 約束名
增加只需將表級語法前加上:
Alert table 表名
Add
即可。
設置主表記錄刪除時從表記錄也會刪除:
在表級語法後面加入:
On delete cascade #也可以是 on delete set null
5,check約束
雖然mySQL不支持check約束,但也可以寫在建表語法裏,儘管這種語法不會有任何的作用。
表級語法:
Check(邏輯表達式<如:salary[這是一個列名]>0>)
索引
索引是存放在schema中的一個數據庫對象,雖然索引總是從屬於數據表,但索引時一個對象。
索引的作用是:減少io,加速搜索。
MySQL在schema的 STATISTICS表來儲存索引,可以查詢該表來查詢信息。
創建:
自動創建:在某一列定義主鍵約束,或者外鍵約束時會自動的添加索引。
手動:通過create inde…語句來創建索引。
刪除:
自動:數據表被刪除時,其上的索引自動被刪除。
手動:drop index…語句來刪除。
就像每一本書都有一個目錄一樣,每一個表格總有一個索引。
一個表中可以有多個索引列用來加速查詢速度。
手動創建語法:
Create index indexname
On tablename (列1,列2);
刪除語法:
Drop index indexname on tablename
有些數據庫不需要指定表名,因爲每個索引都是獨立不重名的。但mySQL只要求每個表中的索引不能重名,所以也需要指定表名。
索引的弊:
當數據表中的信息被刪除或者修改時,索引也需要相當的維護。
儲存索引也要一定的空間。
視圖
視圖是一個表或者多個表中數據的邏輯顯示,與表相似。
視圖的優勢:
可以限制對數據的訪問。
使一個複雜的查詢變得簡單。
提供了數據的獨立性。
提供了數據庫的不同顯示。
在創建視圖的同時還要創建一個用於查詢該視圖的查詢語句
語法:
Create or replace view view_name
As
Subquery
創建和修改視圖所使用的語法都是上述語法。
上述語法中subquery是一條自定義的語法,可以變得很複雜用途是查詢該視圖。
通常不推薦修改是圖中的數據,所以mySQL提供了一種限定不可修改其中數據的子語句。
在最後一行加入:
With check option;
這樣這個視圖就只能用作查詢不能用於刪除了。
刪除:
Drop view view_name
DML(數據操作語言)語句
Dml的作用對象主要是表中的數據,而非表格本身。
作用:
插入(insert into)
修改(update)
刪除(delete from)
1, insert to
用於向表格中插入數據:
語法:
Insert into table_name [(列……)]
Values(value[……])
如果省略列的話,則默認將所有列都插入值(默認值,或者自增長值,或者指定的值)
並且如果不確定某一列的值可以使用null,自增長的列如果指定爲null的話,仍然會自增長插入值。
Values(值),中的值可以根據列的順序依次給值,這樣就不用再前面一一寫出每個列的名稱。
當主值列表中有數據的時候,外鍵列表中的外鍵列纔能有值否則只能爲null,並且外鍵列的值只能是在主鍵列中的一個,不能填寫主值列以外的值。
可以使用袋帶子查詢的插入語句這樣可以一次性的插入多個列。
語法:
Inset into table_name1 (colum_name1 )
Select colum_name2 from table_name2
這種從一個列的所有值複製到另外一個列中的方法,要求兩個列的數據類型,匹配,數據列數相同即可。
當然也可以在values之後列出多個(值)以逗號隔開,這樣可以簡化多個數據的插入。
2,Update語句
修改表中的記錄。
通過where子句可以限定修改的位置。
語法:
Update table_name
[WHERE condition<布爾表達式,總爲真> ]
通過where語句可以限定只修改特定的值。
2, delete from 語句
刪除。
語法:
Delete from table_name
[where condition ]
如果省略where則刪除整個表格的全部數據。
值得注意:如果從表的記錄沒有被刪除,則不可以刪除主表數據,但如果設置了on delete set null約束,則可以刪除主標記錄,此時從表外鍵直接設置爲null。
單表查詢
Select關鍵字用於查詢數據。
Select可以查詢單表也可以查詢多表。
單表查詢語法:
Select colum1,colum2…
From 數據源(table_name)
[where coditon]
如果想查詢所有列則可以使用*代表所有列。
Select限定查詢的列,where限定查詢的行。
在使用select語句時還可以使用算數表達式(-,+,*,/)
規則:
對數值型的列,變量,常量可以使用算術運算符。
對日期型的列,變量,常量只能使用加減運算符。
運算符也可以在兩個列之間。
數據列可以當做一個變量(如:列名+n代表該列從第n+1開始的數據)
MySQl沒有字符串連接符(+),但可以使用concat表示連接
例:
Concat(column_name,‘s’)。
即這裏表示的是column_name列的字符串和‘s’字符連接的結果。
注意:如果在表達式中使用null值,則表達式的返回值會是null。
例:concat(column_name,null)
則結果爲null。
如果想查詢的列使用別的名字,可以在select column_name [as 或者空格] 新的名字。
這樣查詢結果列標題頭就是新的名字了,但是數據庫中的內容本什麼有改變。
注意:如果強調大小寫敏感,或者需要使用敏感符號(如空格等),則可以在別名外使用雙引號。
如果同時使用多個列的select並且使其重命名,則每個列的後面可以緊跟其別名。列和列之間以逗號隔開。
當然也可以爲表格起別名,如:from table table_name 別名
Select和where後面都可以不出先列,這樣的情況會比對所有表中的數據。
當然還有一種相對應的
Select 表達式 from dual;
語法,這種語法中的dual只是一種佔位符,本身沒有什麼效果。
若果想要去除多個列表一起查詢時重複的行(注意是兩行記錄而不是單純的兩個值)
使用distinct語法。
Select distinct column_name
From table table_name;
注意where後的比較運算符也可以用於字符串,日期之間的比較。
注意SQL語句中賦值符號是:= 而比較是否相等是=,並且不相等是<>
並且sql中還有一些非常特殊的比較運算符:
語法:A between B and C (B<=A<=C)
A in (B1,B2, B3…)(A在後面的集合中)
Like (字符串的匹配,like後面緊跟的表達式可以是通配符,主要用在模糊查詢)
Is null (指定的值是null)
通配符:SQL中的通配符有(下劃線,代表某一個字符,注意不要在多個下劃線中加空格,另外百分號可以代表多個字符,當然如果要在字符中使用這兩個字符只需要使用轉義字符\即可,但是標準SQL語句中並沒有提供這樣的語法,不能使用反斜槓代表轉義字符,而是使用了escepe關鍵字,語法:
Where column_name like ‘/_%’escape’/’
表示查詢以_開頭的所有該列的數據。)
且注意:字符串勿忘使用單引號引起。
同時SQL中也可以使用或且非連接多個表達式代表對多個表達式求真值。
其中使用 and or not關鍵字。
執行後的數據顯示以默認插入序列顯示,但是如果對數據的的顯示有要求可以使用Order by語句。
語法:
Order by column_name1 [desc], column_2…
進行時默認以升序排列,若要使用降序排列,則在後面使用關鍵字desc。
(與其相對應的是asc關鍵字)
如果需要按多列排序,則每列的desc與asc必須單獨設置,且放在第一個位置的是首要排列,只有第一列存在多組數據的時候第二列的數據纔會有作用。
數據函數庫
SQL語句中函數的位置多樣,比較常見的是出現在select語句和where語句中(如前面講的concat)
這裏的函數分爲多行函數和單行函數。
單行函數對每個行的數據單獨計算,每一行都將有一個返回值多行行數對多個行同時計算,最後返回一個值。
SQL中的函數可以直接使用,無需引進類什麼的。
執行函數的語法:
Function_name (arg1…)
多行函數主要用於分組,求和一些統計功能。
MySQL中的函數具有特性:
單行函數的參數可以是變量,常量,數據列。單行函數可以接受多個值,但最後只返回一個值。
單行函數會對每行單獨起作用,每行都會返回一個值。
使用單行函數可以改變數據類型,單行函數可以嵌套使用。
MySQL中的單行函數主要進行數據轉換,其他的還有:
位函數,流程控制函數,加密解密函數,信息函數。
函數簡介:
Char_length(column_name)
計算字符長度
Sin(integer)
計算sin值
Date_add(‘year-month-day’,interval integer 單位<year month day>)
其中interval是關鍵字。
Adddate(‘year-month-date’,integer)
這種與上述用法相對應。
Curdate()
計算當前時間,注意沒有單位如:select curdate();
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2017-03-08 |
|
相對應的還有curtime()
顯示當前時間
Md5(‘string’)
這是一種md5加密
處理null的函數:
Ifnull(expr1,expr2)
若e1爲null則返回e2否則返回e1
Nullif(e1,e2)
如果e1=e2則返回null,否則返回e1
If(e1,e2,e3)
如果e1爲true且不爲0,且不爲null則返回e2,否則返回e3.
Isnull(e1)
判斷是否爲null,爲null則返回true,否則返回false
流程控制函數case:
Case value
When compare_value1 then result 1
When compare_value2 then result 2
……
Else result
End
類似於switch case語句。
不同的是compare_value
可以換成一個表達式,如果表達式成立則會執行。
而且此時case後面沒有value
注意不能在Java中使用數據庫函數,將導致函數耦合。
分組和組函數
也就是多行函數。
常用組函數:
Avg([distinct/all]e)計算e的平均值,e可以是變量,常量或者數據列,其數據類型必須是數值,可以在變量,列前,使用distinct或者all關鍵字,若使用distinct則表示不計算重複的值,使用all表示需要計算重複的值,可以不使用。
Count({*/[distinct/all]e})計算e的總條數,其中e可以是變量常量或者數據列,其中數據類型任意,*表示該表中的任意條數,distinct表示不計重複值。
Max(e)計算最大值,其中e可以是變量,常量,數據列,類型可以是任意。
Min(e)與上相對應。
Sum([diatinct/all]e)計算多行e的總和,數據類型必須是數值型。
使用案例:
Select count(*)
From table_name;
計算table_name中的記錄條數
注意:count方法不會計算null,如果要計算null可以使用ifnull()函數返回一個別的值。
Distinct關鍵字不能和*一起使用。
在默認情況下會自動分成一組,爲了顯示的進行分組,可以使用group by關鍵字,在group by後面加入一列或者多列的列名,當這些列的組合值完全相同的時候就會被分成一組。
注意:如果使用了group by 將導致多個相同的值僅有一個輸出。在select函數後面的子列要求要麼在組函數中出現要麼在group by後面出現。
如果需要對分組進行過濾應使用having子句,having後面也是一個表達式,與where相似,但也有不同之處。
1, 不能在where子句中過濾組,只能在where子句中過濾行。
2, 不能在where子句中使用組函數,只能在having子句中使用。
例:
Select *
From table_name
Group by column_name
Having e;
其中e是該組數據列滿足的條件。
多表查詢
多表查詢相對於單表查詢,是一種多個數據來源於不同表。與之前僅僅是來自於不同的數據列完全不同。
多表連接查詢有兩種規範:
SQL92規範和SQL99規範。
SQL92規範:
這種規範語法比較簡潔,將多個數據表的表名放在from之後,多個表之間以逗號隔開。連接條件放置於where之後。與查詢條件之間使用and邏輯運算符連接。如果條件要求兩列的值相等則成爲等值連接,否則稱爲非等值連接,其中沒有任何連接符稱爲廣義笛卡爾。
語法:
Select column_name ,…
From table_name, …
[where condition ]
多表查詢相對於單表查詢,存在可能出現重名列的問題,所以在相應的列名前增加表名前綴或者表別名前綴。
如:
Select s.*, column_name
From table_name s,table_name t
Where s.column_name=t.column_name
顯示時會顯示相應的select後面的列。
這是一種嵌套循環(有些像排序算法),不斷判斷的過程,其中如果不使用where就是廣義笛卡爾積。會顯示n×m條記錄。
非等值連接就是使用不等號連接兩個列之間。
左外鏈接與右外鏈接(mySQL不支持這種連接)
符號:+或*
位置在左則稱爲左外鏈接,位置在右則稱右外鏈接。(位置在where column_name(*left)=column_name(*right))
這種連接就是在表中增加一個萬能行,不管連接條件是否滿足,都可以將另外一個表中的所有數據都選出來。
還有一種自連接,當不同的記錄之間存在主外鍵關係可以使用自連接查詢。
SQL99規則
這與SQL92規則很相似但是不同的是,SQL99的可讀性更強。連接不在放在where之後。並且from之後不在有多個表名而是隻有一個表名。
交叉連接:
效果就是92規則中的笛卡爾積,交叉連接無需任何連接條件。
使用關鍵字cross
語法:
Select column…
From table_name table_othername
Cross joint othertable_nameothertable_othername;
自然連接:
自然連接看似無連接條件,實際上有,自然連接根據連個表格的重名列進行分類。
如果沒有重名列效果與交叉連接相同。
Select column…
From table_name table_othername
Natural joint othertable_nameothertable_othername;
Using子句連接:
可以指定一列或多列顯示的兩個表中的同名列進行連接。
可以指定那些同名列是連接條,可以不是所有。
語法:
Select column…
From table_name table_othername
Joint othertable_name othertable_othername
Using(column_name)
如果兩個表中無重名列則出現錯誤。
On子句連接:
最常用的連接方式,用於指定連接條件。可以是等值條件,也可以非等值條件。若有N個表格之間分組,則需要N-1個 on…joint對
語法:
Select column…
From table_name table_othername
Joint othertable_name othertable_othername
On condition;
左,右,全外連接:
就是在on 子句連接的基礎上加上left,right, full關鍵字(在joint前面)。
但與92規則不相同的是:
這裏的left會將左邊不滿足表達式全部列出,right會將右邊不滿足表達式的全部列出,full會將兩個表中不滿足表達式的都列出。
子查詢
子查詢是一種在查詢語句中嵌套另一個的查詢,子查詢可以支持多層嵌套。
子查詢可以出現在兩個位置。
1, 出現在from之後當成數據表,這種用法也被稱爲內視圖。
2, 出現在where條件之後作爲過濾條件。
注意:子查詢需要使用括號括起。把子查詢看做數據表時可以爲該子查詢起別名。且若作爲前綴限定數據列,必須給該子查詢起別名。把子查詢當成過濾條件時應放在比較運算符的右方,把子查詢當成過濾條件時,單行子查詢使用單行運算符,多行子查詢使用多行運算符。
使用案例:
1, select *
from (select * from table_name) t
where condition
這種用法將子查詢看做數據表使用。
2, 當返回單值,或者單列,單行值時子查詢可以看成一個量,用於比較
當子查詢返回多個值的時候,需要使用 in any all等關鍵字。
In:可單獨使用,表示某個值在後面的查詢結果中。
如:where x in
(select column_name
From table_name
);
Any, all 與>,<,>=,<=,<>,=連用
Any表示任何一個值,all表示這其中的全部值。
其中=any與上述in的用法相同。
例:select column_name
From table_name
Where x =
Any(select column_name
From table_name );
<any 只要小於最大值,>any只要大於最小值——這是一種存在性的關係
All與之相反,是一種全稱性,任意性的關係。
還可以使用多個列的子查詢,此時where後面的匹配量應該使用括號括起來。
例:
Select column_name
From table_name
Where (x,y) > any
(select column_name ,column_name
From table_name );
集合運算
select運算的結果是一個集合,相對的集合可以進行交併補的運算。
兩個集合需滿足一定條件:
1, 兩個集合包含的數據列數一定相等
2, 數據類型一一對應。
1 union運算(並集)
語法:select statement union select statement;
2 minus運算(差集)
語法: select statement minus select statement;
注意MySQL不支持這種語法
可以通過where … not in …完成
3 intersect運算(交集運算)
語法:select statement intersect select statement;
同樣mySQL不支持這樣的語句。
可以通過join…on(condition)完成