SQL基礎教程

SQL基礎教程

一、SQL簡介

1:什麼是SQL?

A:SQL指結構化查詢語句    B:SQL使我們有能力訪問數據庫     C:SQL是一種ANSI(美國國家標準化組織)的標準計算機語言

2:SQL能做什麼?

*面向數據庫執行查詢   *從數據庫中取出數據   *向數據庫插入新的記錄  

*更新數據庫中數據   *從數據庫刪除記錄   *創建數據庫   *創建表  

*創建存儲過程   *創建視圖   *設置表、存儲過程和視圖的權限

3:RDBMS

RDBMS是指關係型數據庫管理系統

RDBMS是SQL的基礎,同樣也是所有現代數據庫系統的基礎,如MS SQL Server、IBM DB2、Oracle、MySQL以及Microsoft Access

RDBMS中的數據存儲在被稱爲表的數據庫對象中

表是相關的數據項的集合,他由列和行組成。

二、SQL語法

注意:SQL對大小寫不明感!!!

1:SQL語句後面的分號

某些數據庫系統要求在每條SQL命令的末端使用分號。

分號是在數據庫系統中分隔每條SQL語句的標準方法,這樣就可以在服務器的相同請求中執行一條以上的語句。

如果使用的是MS Access和SQL Server 2000,則不必在每條SQL語句之後使用分號,不過某些數據庫要求必須使用分號。

2:SQL DML和DDL

可以把SQL分爲兩個部分:數據操作語言(DML)和數據庫定義語言(DDL)

SQL(結構化查詢語句)適用於執行查詢的語法。但是SQL語言也包含用於更新、插入和刪除記錄的語法。查詢和更新構成了SQL的DML部分:select、update、delete、insert into 。 數據庫定義語言(DDL)部分使我們有能力創建或刪除表格,我們也可以定義索引(鍵),規定表之間的連接,以及事假表間的約束:

Create database、alert database、create table、alert table、drop table、create index、drop index

三、Select

User表裏面的數據如下

wps53D5.tmp

查詢user表裏面的user_name字段和user_age字段的所有數據

Select user_name,user_age from user

wps53D6.tmp

查詢user表中所有的字段數據,用 * 表示列的名稱

Select * from user

wps53D7.tmp

四、Distinct

Distinct選取所有的值的時候不會出現重複的數據

用普通的查詢,查詢所有

Select * from user

wps53E8.tmp

Select distinct user_name,user_age from user

注意:不能有user_id,因爲兩個Mary的user_id不一樣,加上就不算相同數據

wps53E9.tmp

五、Where

1:查詢user_id等於1 的數據

Select * from user where user_id = 1

wps53EA.tmp

2:查詢user_age大於等於12的數據

Select * from user where user_age >=12

wps53EB.tmp

3:查詢user_age不等於12的數據

Select * from user where user_age <> 12

wps53EC.tmp

六、ADN 和 OR

And和or在where子語句中把兩個或多個條件結合起來。如果需要兩個條件都成立就是用and如果只需要其中一個條件成立就使用or

Select * from user where user_name = 'mary' and user_age = 12

需要注意的是SQL使用單引號來環繞文本值,如果是數值則不需要引號

wps53FD.tmp

Select * from user where user_name='mary' or user_age =13

wps53FE.tmp

結合and和or使用圓括號來組成複雜的表達式

Select * from user where (user_name = 'mary' and user_age = 12) or(user_age =13)

wps53FF.tmp

七、Order by

1:對指定列進行升序排列

Select * from user order by user_name

wps5400.tmp

2:按照user_id逆序排列

Select * from user order by user_id DESC

wps5401.tmp

2:按照升序排列user_id逆序排列user_age

SELECT * FROM user order by user_id ASC,user_age DESC

wps5402.tmp

3:按照升序排列user_id逆序排列user_age

SELECT * FROM user order by user_age DESC,user_id ASC

wps5412.tmp

注意:前面的條件優先級更高!!

八、Insert

User表

wps5413.tmp

插入一行數據 user_id爲2 user_name爲tom,user_age爲12

注意:如果每一項都有插入的話就不需要在前面列出列名!!

Insert into user values(2,'tom',12)

wps5414.tmp

新插入一行數據,只要求user_name爲eva

Insert into user(user_name) values('eva')

注意:因爲ID設置爲自增,所以user_id不爲null

wps5415.tmp

九、Update

修改user_id爲6的數據user_age爲14

Update user set user_age=14 where user_id=6

wps5416.tmp

修改user_id爲1的數據user_name爲ann,user_age爲11

Update user set user_name='ann',user_age=11 where user_id=1

wps5427.tmp

十、Delete

User表中的所有數據信息如下

wps5428.tmp

刪除user_age爲12的數據

Delete from user where user_age=12

wps5429.tmp

刪除表中的所有數據

Delete from user

wps542A.tmp

第二章 SQL高級教程

一、Top

Top子句用於返回要返回的記錄的數目,但並不是所有的數據庫都支持top子句

1:SQL Server

Select top 5 * from user

2:MySQL

Select * from user limit 5

3:Oracle

Select * from user where ROWNUM <= 5

二、Like

User表的初始數據如下

wps542B.tmp

1:找出以li開頭的數據

Select * from user where user_name like 'li%'

wps543C.tmp

2:找出以ry結尾的數據

Select * from user where user_name like '%ry'

wps543D.tmp

3:找出含有a的數據

Select * from user where user_name like '%a%'

wps543E.tmp

4:找出第二個字母是a第四個字母是y的數據

Select * from user where user_name like '_a_y'

wps543F.tmp

三、通配符

在搜索數據庫中的數據的時候SQL通配符可以替代一個或多個字符。SQL通配符必須與like運算符一起使用

1: _ 替代一個字符

找出第二個字母是a第四個字母是y的數據

Select * from user where user_name like '_a_y'

wps5440.tmp

2: % 替代一個或多個字符

找出以ry結尾的數據

Select * from user where user_name like '%ry'

wps5441.tmp

3: [] 字符列中的任意一個單字符

找出以a或者l開頭的數據

Select * from user where user_name like '[al]%'

找出不是a或者l開頭的數據

Select * from user where user_name like '[!al]%'

四、In

只要數據滿足in裏面的一個條件就可以了

找到user_age是12或者13的數據

Select * from user where user_age in (12,13)

wps5451.tmp

找到user_name是Harry和Mary的數據

Select * from user where user_name IN ('mary','harry')

wps5452.tmp

五、Between

選取兩個值之間的數據

查詢年齡在12和14之間的數據

Select * from user where user_age between 12 and 14

wps5453.tmp

查詢字母在Alice和John之間的數據

Select * from user where user_name between 'alice' AND'john'

wps5454.tmp

六、Aliases

指定別名

假設我們有兩個表分別是user和Room 。我們分別指定他們爲u和r。

1:不使用別名

Select room.room_name,user.user_name,user.user_age from user ,room  Where user.user_age=12 and room.room_id = 1

wps5455.tmp

2:使用別名

使用別名的時候直接將別名跟在後面,不使用as也可以

Select r.room_name,u.user_name,u.user_age from user as u,room as r  Where u.user_age=12 and r.room_id = 1

wps5466.tmp

七、Join

數據庫中的表可以通過鍵將彼此聯繫起來,主鍵是一個列,在這個列中的每一行的值都是唯一的,在表中,每個主鍵的值都是唯一的,這樣就可以在不重複每個表中的所有數據的情況下,把表間的數據交叉捆綁在一起。

以下爲表user和表Room的數據

wps5467.tmp wps5468.tmp

1:引用兩個表

找出在Room of boy相關聯的用戶信息

Select u.user_name,u.user_age,r.room_name from user as u,room as r

Where u.room_id = r.room_id and r.room_name='room of boy'

wps5469.tmp

2:使用關鍵字join來連接兩張表

Select u.user_name,u.user_age,r.room_name

from user as u

join room as r

on u.room_id = r.room_id and r.room_name='room of boy'

wps546A.tmp

八、Inner join

Inner join 與 join 用法一致

Select u.user_name,u.user_age,r.room_name

from user as u

inner join room as r

on u.room_id = r.room_id and r.room_name='room of boy'

wps547A.tmp

九、Left join

注意:左連接以左邊的表爲主體,也就是說會列出左邊的表中的所有的數據,無論它是否滿足條件。

1:user在左邊

Select u.user_name,u.user_age,r.room_name

from user as u

Left join room as r

on u.room_id = r.room_id and r.room_name='room of boy'

wps547B.tmp

2:Room在左邊

Select u.user_name,u.user_age,r.room_name

From room as r

Left join user as u

on u.room_id = r.room_id and r.room_name='room of boy'

wps547C.tmp

十、Right join

注意:左連接以右邊的表爲主體,也就是說會列出左邊的表中的所有的數據,無論它是否滿足條件。

1:Room在右邊

Select u.user_name,u.user_age,r.room_name

from user as u

Right join room as r

on u.room_id = r.room_id and r.room_name='room of boy'

wps547D.tmp

2:user在右邊

Select u.user_name,u.user_age,r.room_name

from  room as r

Right join user as u

on u.room_id = r.room_id and r.room_name='room of boy'

wps547E.tmp

十一、Full join

1:user在左邊

Select * from user Full join room

wps548F.tmp

2:Room在左邊

Select * From room full join user

wps5490.tmp

注意:SQL錯誤碼1054表示沒有找到對應的字段名;錯誤碼1064表示用戶輸入的SQL語句有語法錯誤

十二、Union

Union操作符用於合併兩個或者多個SELECT語句的結果集

請注意,UNION內部的select語句必須擁有相同數量的列。列也必須擁有相同的數據類型。同時,每條select語句中的列的順序必須相同。

下面是Room表和color表的數據

wps5491.tmp wps5492.tmp

Select room_name from room

Union

Select color_name from color

wps5493.tmp

默認的union選取不同的值,如果想要有相同的值出現就使用union all

Select room_name from room

Union all

Select color_name from color

wps54A4.tmp

十三、Create DB

創建數據庫mysqltest

Create database mysqltest

wps54A5.tmp

十四、Create table

Create table sqltest(

Id int,

Name varchar(45),

Age int,

Salary float,

Time Date,

)

wps54A6.tmp wps54A7.tmp

十五、Constraints

SQL約束,用於限制加入表的數據的類型

常見約束:not noll、unique、primary key、foreign key、check、default

十六、Not null

Not null 約束強制列不接受NULL值。Not null 約束強制字段始終包含值,這意味着,如果不向字段添加值,就無法插入新的字段或者更新記錄

用法,在字段後面加上 not null

wps54B7.tmp

十七、Unique

Unique約束唯一標識數據庫中的每一條記錄。Primary key約束擁有自動的unique約束。需要注意的是,每個表裏面可以擁有多個unique約束,但只能有一個primary key約束

1:MySQL用法,unique(字段名)

wps54B8.tmp

2:SQL Server 、 Oracle 、 MS Access在字段後面加

wps54B9.tmp

3:命名約束使用constraint

wps54BA.tmp

4:已經創建了表之後需要添加約束

ALTER TABLE sqltest ADD UNIQUE(Age)

wps54BB.tmp

5:給已經創建了的表添加約束並命名

ALTER TABLE sqltest ADD constraint unique_name UNIQUE(Age,salary)

wps54CC.tmp

6:撤銷約束

MySQL

在沒有給約束命名的情況下(上面的age約束)直接使用字段名就可以了

ALTER TABLE sqltest DROP INDEX age

wps54DD.tmp  刪除後   wps54DE.tmp

在約束有名字的情況下,直接使用名字就可以了

ALTER table sqltest  drop index unique_name

wps54DF.tmp   刪除後  wps54E0.tmp

SQL Server 、 Oracle 、 MS Access

ALTER table 表名 drop constraint 約束名

十八、Primary key

Primary key約束唯一標識數據庫表中的每一條記錄,組件必須包含唯一的值。組件列不能包含NULL值。每個表都應該有一個主鍵,並且每一個表都只能有一個主鍵

1:在MySQL中的用法

wps54F0.tmp

2:在SQL Server 、 Oracle 和MS Access中的用法

wps54F1.tmp

3:爲已經創建成功的表創建primary key約束

Alter table sqltest add primary key(id)

wps54F2.tmp

4:爲已經創建成功的表添加主鍵約束,以及爲多個列定義主鍵約束

Alter table sqltest add constraint pk_name primary key (id,name)

wps54F3.tmp

5:在MySQL中撤銷主鍵

ALTER  TABLE sqltest DROP PRIMARY KEY

wps54F4.tmp   刪除後   wps54F5.tmp

6:在SQL Server、Oracle、MS Access中撤銷主鍵

Alter table 表名 drop constraint 主鍵名

十九、Foreign key

所謂的外鍵,即一個表的外鍵指向另一個表的主鍵

User表wps5506.tmp

Room表wps5507.tmp

在user表裏面room_id列指向Room表裏面的id列。Room表裏面的id列是主鍵,user表裏面的room_id列是外鍵。外鍵約束用於預防破壞表之間的連接動作,外鍵約束也能防止非法數據插入外鍵列,因爲他必須是他指向的那個表的值之一。

wps5508.tmp

二十、Check

Check約束用於限制列中的值的範圍。如果對單一的列定義check約束,那麼改了只允許特定的值。如果對一個表定義check約束,那麼此約束會在特定的列中對值進行限制。

wps5509.tmp

爲已經創建成功的表添加check約束

ALTER TABLE USER ADD CHECK (age>10)

二十一、Default

Default約束用於向列宗插入默認值。如果沒有規定其他值,那麼就會將默認值添加到所有的新紀錄。

用法:

wps5519.tmp

當表已經存在的時候,添加默認值

ALTER TABLE sqltest ALTER NAME SET DEFAULT 'tom'

wps551A.tmp

wps551B.tmp

撤銷默認值

wps551C.tmp

wps551D.tmp

二十二、Create index

索引,你可以在表裏面創建索引,一邊更加快速高效地查詢數據。用戶無法看見索引,他們只能被用來加速搜索、查詢。

注意:更新一個包含索引的表需要比更新一個沒有索引的表更多的時間,這是索引本身也需要更新,因此,理想的做法是僅僅在常常被搜索的列上面創建索引。

1:創建一個索引

CREATE INDEX index_name ON color (color_id )

wps552E.tmp

2:創建一個獨一無二的索引,即兩行不能擁有相同的索引值。

CREATE UNIQUE INDEX book_index ON book (book_id)

wps552F.tmp

3:如果索引不止一個列,你可以在括號中列出這些列的名稱,用逗號隔開

CREATE INDEX index_bank ON bank (bank_id,bank_name)

wps5530.tmp

二十三、Drop

通過使用DROP語句,可以刪掉索引、表和數據庫

1:刪除索引

Drop index index_name on color

wps5531.tmp

刪除之後

wps5532.tmp

wps5543.tmp

wps5544.tmp

2:刪除表

DROP TABLE colorcopy

wps5545.tmp  刪除之後   wps5546.tmp

3:清空表

TRUNCATE TABLE color

wps5547.tmp  刪除之後  wps5548.tmp

4:刪除數據庫

DROP DATABASE mysqltest

wps5549.tmp 刪除之後  wps5559.tmp

二十四、Alert

wps555A.tmp

1:添加列

Alter table user add salary float

wps555B.tmp

2:刪除列

Alter table user drop column room_id

wps555C.tmp

二十五、Increment

定義主鍵自增

wps556D.tmp

二十六、View

視圖,一種基於SQL語句的結果集可視化表。視圖包含行和列,就像一個真實的表。視圖中的字段來自一個或多個數據庫中的真實的表中的字段,我們可以向視圖添加SQL函數、where以及join語句,我們提交數據,然後這些來自某個單一的表。需要注意的是,數據庫中的結構和設計不會受到視圖的函數、where或join語句的影響

1:創建一個視圖,字段來自user表和Room表

CREATE VIEW view_test AS

SELECT user.user_name,user.user_age,room.room_name

FROM USER,room

WHERE user.user_age>10

2:查詢視圖

Select * from view_test

wps556E.tmp

3:撤銷視圖

DROP VIEW view_test

二十七、Date

wps556F.tmp

二十八、Nulls

默認的,表的列可以存放NULL值。如果表裏面的某個列是可選的,那麼我們可以在不想改列添加值的情況下插入記錄或者更新記錄,這意味着該字段以NULL值保存。注意,NULL和0是不等價的,不能進行比較。

wps5570.tmp

1:查詢NULL值

select * from user where salary is null

wps5581.tmp

2:查詢非NULL值

select * from user where salary  is not null

wps5582.tmp

二十九、數據類型

MySQL主要有三種類型:文本、數字、日期

wps5583.tmp

wps5593.tmp

wps5594.tmp

wps5595.tmp

wps5596.tmp

wps55A7.tmp

wps55A8.tmp

wps55A9.tmp

三十、服務器

wps55AA.tmp

第三章 SQL函數

一、SQL functions

在SQL當中,基本的函數類型和種類有若干種,函數的基本類型是:

合計函數(Aggregate function)和 Scalar函數

Aggregate 函數,函數操作面向一系列的值,並返回一個單一的值。

Scalar 函數,操作面向某個單一的值,並返回基於輸入值的一個單一的值。

二、Avg()

求平均年齡

Select avg(user_age) from user

wps55BA.tmp

求大於平均年齡的用戶

Select * from user where user_age>(Select avg(user_age) from user)

wps55BB.tmp

三、Count()

返回列的值的數目(不包含NULL)

注意,可以使用as來給count()取一個別名

wps55BC.tmp

Select count(user_id) from user

wps55BD.tmp

Select count(salary) from user

wps55CE.tmp

返回值不同的有多少

Select count(distinct user_name) from user

wps55CF.tmp

查詢所有列

Select count(*) from user

wps55D0.tmp

四、Max()

返回最大值,NULL不包括在計算中

wps55D1.tmp

Select max(price) as max_price from commodity

wps55E2.tmp

五、Min()

返回最小值,NULL不包括在計算中

wps55E3.tmp

Select min(salary) poor_man from user

wps55E4.tmp

六、Sum()

返回該列值的總額

wps55E5.tmp

Select sum(salary) from user

wps55F5.tmp

七、Group By

用於結合合計函數,根據一個或多個列對結果集進行分組

wps55F6.tmp

SELECT cname,SUM(price) FROM commodity GROUP BY cname

wps55F7.tmp

八、Having

在SQL中增加having子句的原因是where不能與合計函數一起使用。用法和where 一樣

SELECT cname,SUM(price) FROM commodity

GROUP BY cname

HAVING  SUM(price)>20

wps55F8.tmp

九、Ucase()

把函數字段的值轉化爲大寫

wps5609.tmp

SELECT UCASE(user_name) FROM user

wps560A.tmp

十、Lcase()

將函數字段轉化爲小寫

wps560B.tmp

Select lcase(user_name) from user

wps560C.tmp

十一、Mid()

從文本字段中提取字符

wps561D.tmp

Select mid(user_name,2,2) from user

wps561E.tmp

十二、Round()

Round函數把數值字段舍入爲指定的小數位數

wps561F.tmp

Select round(salary,2) from user

wps5620.tmp

十三、Now()

返回當前時間

SELECT NOW() FROM user

wps5621.tmp

學習完了之後我們可以進入位w3chool的‘SQL測試’進行測試

( ^_^ )/~~拜拜

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