Java與MySQL數據庫初步

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)完成

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章