* 以下內容是我在學習SQL(http://www.w3school.com.cn/sql/index.asp)的時候的學習筆記
* 學習時使用的數據庫軟件是MySQL數據庫可視化工具SQLyogEnt
* 如果大家有發現什么不對的地方請告訴我。謝啦!!☆⌒(*^-゜)v
* 在這里需要注意的是,和SqlServer相比MySQL不支持事務處理,沒有視圖,沒有存儲過程和觸發器,沒有數據庫端的用戶自定義函數,不能完全使用標准的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表里面的數據如下
查詢user表里面的user_name字段和user_age字段的所有數據
Select user_name,user_age from user
查詢user表中所有的字段數據,用 * 表示列的名稱
Select * from user
四、Distinct
Distinct選取所有的值的時候不會出現重復的數據
用普通的查詢,查詢所有
Select * from user
Select distinct user_name,user_age from user
注意:不能有user_id,因為兩個Mary的user_id不一樣,加上就不算相同數據
五、Where
1:查詢user_id等於1 的數據
Select * from user where user_id = 1
2:查詢user_age大於等於12的數據
Select * from user where user_age >=12
3:查詢user_age不等於12的數據
Select * from user where user_age <> 12
六、ADN 和 OR
And和or在where子語句中把兩個或多個條件結合起來。如果需要兩個條件都成立就是用and如果只需要其中一個條件成立就使用or
Select * from user where user_name = 'mary' and user_age = 12
需要注意的是SQL使用單引號來環繞文本值,如果是數值則不需要引號
Select * from user where user_name='mary' or user_age =13
結合and和or使用圓括號來組成復雜的表達式
Select * from user where (user_name = 'mary' and user_age = 12) or(user_age =13)
七、Order by
1:對指定列進行升序排列
Select * from user order by user_name
2:按照user_id逆序排列
Select * from user order by user_id DESC
2:按照升序排列user_id逆序排列user_age
SELECT * FROM user order by user_id ASC,user_age DESC
3:按照升序排列user_id逆序排列user_age
SELECT * FROM user order by user_age DESC,user_id ASC
注意:前面的條件優先級更高!!
八、Insert
User表
插入一行數據 user_id為2 user_name為tom,user_age為12
注意:如果每一項都有插入的話就不需要在前面列出列名!!
Insert into user values(2,'tom',12)
新插入一行數據,只要求user_name為eva
Insert into user(user_name) values('eva')
注意:因為ID設置為自增,所以user_id不為null
九、Update
修改user_id為6的數據user_age為14
Update user set user_age=14 where user_id=6
修改user_id為1的數據user_name為ann,user_age為11
Update user set user_name='ann',user_age=11 where user_id=1
十、Delete
User表中的所有數據信息如下
刪除user_age為12的數據
Delete from user where user_age=12
刪除表中的所有數據
Delete from user
第二章 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表的初始數據如下
1:找出以li開頭的數據
Select * from user where user_name like 'li%'
2:找出以ry結尾的數據
Select * from user where user_name like '%ry'
3:找出含有a的數據
Select * from user where user_name like '%a%'
4:找出第二個字母是a第四個字母是y的數據
Select * from user where user_name like '_a_y'
三、通配符
在搜索數據庫中的數據的時候SQL通配符可以替代一個或多個字符。SQL通配符必須與like運算符一起使用
1: _ 替代一個字符
找出第二個字母是a第四個字母是y的數據
Select * from user where user_name like '_a_y'
2: % 替代一個或多個字符
找出以ry結尾的數據
Select * from user where user_name like '%ry'
3: [] 字符列中的任意一個單字符(在SQL Server里面有作用,在MySQL里面不會報錯但找不到值)
找出以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)
找到user_name是Harry和Mary的數據
Select * from user where user_name IN ('mary','harry')
五、Between
選取兩個值之間的數據
查詢年齡在12和14之間的數據
Select * from user where user_age between 12 and 14
查詢字母在Alice和John之間的數據
Select * from user where user_name between 'alice' AND'john'
六、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
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
七、Join
數據庫中的表可以通過鍵將彼此聯系起來,主鍵是一個列,在這個列中的每一行的值都是唯一的,在表中,每個主鍵的值都是唯一的,這樣就可以在不重復每個表中的所有數據的情況下,把表間的數據交叉捆綁在一起。
以下為表user和表Room的數據
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'
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'
八、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'
九、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'
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'
十、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'
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'
十一、Full join
1:user在左邊
Select * from user Full join room
2:Room在左邊
Select * From room full join user
注意:SQL錯誤碼1054表示沒有找到對應的字段名;錯誤碼1064表示用戶輸入的SQL語句有語法錯誤
十二、Union
Union操作符用於合並兩個或者多個SELECT語句的結果集
請注意,UNION內部的select語句必須擁有相同數量的列。列也必須擁有相同的數據類型。同時,每條select語句中的列的順序必須相同。
下面是Room表和color表的數據
Select room_name from room
Union
Select color_name from color
默認的union選取不同的值,如果想要有相同的值出現就使用union all
Select room_name from room
Union all
Select color_name from color
十三、Create DB
創建數據庫mysqltest
Create database mysqltest
十四、Create table
Create table sqltest(
Id int,
Name varchar(45),
Age int,
Salary float,
Time Date,
)
十五、Constraints
SQL約束,用於限制加入表的數據的類型
常見約束:not null、unique、primary key、foreign key、check、default
十六、Not null
Not null 約束,強制列不接受NULL值。Not null 約束強制字段始終包含值,這意味着,如果不向字段添加值,就無法插入新的字段或者更新記錄
用法,在字段后面加上 not null
十七、Unique
Unique約束,唯一標識數據庫中的每一條記錄。Primary key約束擁有自動的unique約束。需要注意的是,每個表里面可以擁有多個unique約束,但只能有一個primary key約束
1:MySQL用法,unique(字段名)
2:SQL Server 、 Oracle 、 MS Access在字段后面加
3:命名約束使用constraint
4:已經創建了表之后需要添加約束
ALTER TABLE sqltest ADD UNIQUE(Age)
5:給已經創建了的表添加約束並命名
ALTER TABLE sqltest ADD constraint unique_name UNIQUE(Age,salary)
6:撤銷約束
MySQL
在沒有給約束命名的情況下(上面的age約束)直接使用字段名就可以了
ALTER TABLE sqltest DROP INDEX age
刪除后
在約束有名字的情況下,直接使用名字就可以了
ALTER table sqltest drop index unique_name
刪除后
SQL Server 、 Oracle 、 MS Access
ALTER table 表名 drop constraint 約束名
十八、Primary key
Primary key約束唯一標識數據庫表中的每一條記錄,組件必須包含唯一的值。組件列不能包含NULL值。每個表都應該有一個主鍵,並且每一個表都只能有一個主鍵
1:在MySQL中的用法
2:在SQL Server 、 Oracle 和MS Access中的用法
3:為已經創建成功的表創建primary key約束
Alter table sqltest add primary key(id)
4:為已經創建成功的表添加主鍵約束,以及為多個列定義主鍵約束
Alter table sqltest add constraint pk_name primary key (id,name)
5:在MySQL中撤銷主鍵
ALTER TABLE sqltest DROP PRIMARY KEY
刪除后
6:在SQL Server、Oracle、MS Access中撤銷主鍵
Alter table 表名 drop constraint 主鍵名
十九、Foreign key
所謂的外鍵,即一個表的外鍵指向另一個表的主鍵
User表
Room表
在user表里面room_id列指向Room表里面的id列。Room表里面的id列是主鍵,user表里面的room_id列是外鍵。外鍵約束用於預防破壞表之間的連接動作,外鍵約束也能防止非法數據插入外鍵列,因為他必須是他指向的那個表的值之一。
二十、Check
Check約束用於限制列中的值的范圍。如果對單一的列定義check約束,那么改了只允許特定的值。如果對一個表定義check約束,那么此約束會在特定的列中對值進行限制。
為已經創建成功的表添加check約束
ALTER TABLE USER ADD CHECK (age>10)
二十一、Default
Default約束用於向列中插入默認值。如果沒有規定其他值,那么就會將默認值添加到所有的新紀錄。
用法:
當表已經存在的時候,添加默認值
ALTER TABLE sqltest ALTER NAME SET DEFAULT 'tom'
撤銷默認值
二十二、Create index
索引,你可以在表里面創建索引,一邊更加快速高效地查詢數據。用戶無法看見索引,他們只能被用來加速搜索、查詢。
注意:更新一個包含索引的表需要比更新一個沒有索引的表更多的時間,這是索引本身也需要更新,因此,理想的做法是僅僅在常常被搜索的列上面創建索引。
1:創建一個索引
CREATE INDEX index_name ON color (color_id )
2:創建一個獨一無二的索引,即兩行不能擁有相同的索引值。
CREATE UNIQUE INDEX book_index ON book (book_id)
3:如果索引不止一個列,你可以在括號中列出這些列的名稱,用逗號隔開
CREATE INDEX index_bank ON bank (bank_id,bank_name)
二十三、Drop
通過使用DROP語句,可以刪掉索引、表和數據庫
1:刪除索引
Drop index index_name on color
刪除之后
2:刪除表
DROP TABLE colorcopy
刪除之后
3:清空表
TRUNCATE TABLE color
刪除之后
4:刪除數據庫
DROP DATABASE mysqltest
刪除之后
二十四、Alert
1:添加列
Alter table user add salary float
2:刪除列
Alter table user drop column room_id
二十五、Increment
定義主鍵自增
二十六、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
3:撤銷視圖
DROP VIEW view_test
二十七、Date
二十八、Nulls
默認的,表的列可以存放NULL值。如果表里面的某個列是可選的,那么我們可以在不想該列添加值的情況下插入記錄或者更新記錄,這意味着該字段以NULL值保存。注意,NULL和0是不等價的,不能進行比較。
1:查詢NULL值
select * from user where salary is null
2:查詢非NULL值
select * from user where salary is not null
二十九、數據類型
MySQL主要有三種類型:文本、數字、日期
三十、服務器
第三章 SQL函數
一、SQL functions
在SQL當中,基本的函數類型和種類有若干種,函數的基本類型是:
合計函數(Aggregate function)和 Scalar函數
Aggregate 函數,函數操作面向一系列的值,並返回一個單一的值。
Scalar 函數,操作面向某個單一的值,並返回基於輸入值的一個單一的值。
二、Avg()
求平均年齡
Select avg(user_age) from user
求大於平均年齡的用戶
Select * from user where user_age>(Select avg(user_age) from user)
三、Count()
返回列的值的數目(不包含NULL)
注意,可以使用as來給count()取一個別名
Select count(user_id) from user
Select count(salary) from user
返回值不同的有多少
Select count(distinct user_name) from user
查詢所有列
Select count(*) from user
四、Max()
返回最大值,NULL不包括在計算中
Select max(price) as max_price from commodity
五、Min()
返回最小值,NULL不包括在計算中
Select min(salary) poor_man from user
六、Sum()
返回該列值的總額
Select sum(salary) from user
七、Group By
用於結合合計函數,根據一個或多個列對結果集進行分組
SELECT cname,SUM(price) FROM commodity GROUP BY cname
八、Having
在SQL中增加having子句的原因是where不能與合計函數一起使用。用法和where 一樣
SELECT cname,SUM(price) FROM commodity
GROUP BY cname
HAVING SUM(price)>20
九、Ucase()
把函數字段的值轉化為大寫
SELECT UCASE(user_name) FROM user
十、Lcase()
將函數字段轉化為小寫
Select lcase(user_name) from user
十一、Mid()
從文本字段中提取字符
Select mid(user_name,2,2) from user
十二、Round()
Round函數把數值字段舍入為指定的小數位數
Select round(salary,2) from user
十三、Now()
返回當前時間
SELECT NOW() FROM user
學習完了之后我們可以進入位w3chool的‘SQL測試’進行測試
http://www.w3school.com.cn/sql/sql_quiz.asp
( ^_^ )/~~拜拜