關(guān)于
MySql
的
SQL
語(yǔ)言
?
?
目前常用的數(shù)據(jù)庫(kù)有
Oracle
公司的
Oracle
,
Microsoft
公司的
SQL Server
,
IBM
公司的
DB2
和
MySql
公司的
MySql,
而免費(fèi)的數(shù)據(jù)庫(kù)目前只有
MySql
,當(dāng)然盜版的不算。
? SQL
(Structured Query Language)
結(jié)構(gòu)化查詢語(yǔ)言是目前一個(gè)國(guó)際上標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)專用語(yǔ)言。
不過不同的數(shù)據(jù)庫(kù)所使用的
SQL
語(yǔ)句都會(huì)稍有一些不同,但基本的標(biāo)準(zhǔn)還是會(huì)遵循
SQL
,例如:
用與
SQL Server
的叫做
PL-SQL
,用于
Oracle
的叫做
T-SQL
,它們都是
SQL
的子類,或者說是派生類。用于
MySql
的我還不知道它叫做什么
SQL
,不過個(gè)人覺得它反而最接近標(biāo)準(zhǔn)的
SQL
語(yǔ)言,不過,從另一方面來(lái)說,它對(duì)
SQL
所做的擴(kuò)展最少。
?
就我現(xiàn)在的理解
SQL
語(yǔ)言就是用來(lái)使用數(shù)據(jù)庫(kù)和操作數(shù)據(jù)用的,不包括操作數(shù)據(jù)庫(kù),那些操作數(shù)據(jù)庫(kù)的代碼應(yīng)該叫做命令,如:?jiǎn)?dòng),關(guān)閉數(shù)據(jù)庫(kù),設(shè)置字符集,設(shè)置訪問連接用戶數(shù)等,這些不屬于
SQL
語(yǔ)言,不同的數(shù)據(jù)庫(kù)都有自己的命令,這些命令是生產(chǎn)企業(yè)制定的。下面,我大概來(lái)說一下
SQL
所做的事情創(chuàng)建數(shù)據(jù)庫(kù),創(chuàng)建表,插入、修改、刪除數(shù)據(jù),
查詢數(shù)據(jù)(最主要的是這個(gè)功能,方便數(shù)據(jù)的儲(chǔ)存和查詢是人們發(fā)明數(shù)據(jù)庫(kù)的理由)。
當(dāng)然,我下面介紹的
SQL
都是用于
MySql
的。
????????????????????????????? SQL
基礎(chǔ)知識(shí)
一、
數(shù)據(jù)類型
INT
[
常用
]
整數(shù)
BIGIN
大整數(shù)
FLOAT
(
單精密
)
浮點(diǎn)數(shù)字
DOUBLE
[
常用
] (
雙精密
)
浮點(diǎn)數(shù)字
NUMERIC(M,D)
[
常用
]
未壓縮
(unpack)
的浮點(diǎn)數(shù)字,
“
未壓縮
”
意味著數(shù)字作為一個(gè)字符串被存儲(chǔ),值的每一位使用一個(gè)字符。例:
NUMERIC(16,2)
表示這個(gè)
浮點(diǎn)數(shù)字的儲(chǔ)存空間為
16
個(gè)字節(jié),精度為
2
(即小數(shù)點(diǎn)后保留
2
位數(shù)字)。
DATE
[
常用
]
日期
?
DATETIME
[
常用
]
日期和時(shí)間組合
?
CHAR(M)
一個(gè)定長(zhǎng)字符串
TIMESTAMP(M)
[
常用
]
時(shí)間戳記。以
YYYYMMDDHHMMSS
、
YYMMDDHHMMSS
、
YYYYMMDD
或
YYMMDD
格式來(lái)顯示
TIMESTAMP
值,例:
TIMESTAMP(14)
格式為YYYYMMDDHHMMSS、TIMESTAMP(8) 格式為YYYYMMDD
VARCHAR(M)
[
常用
]
可變長(zhǎng)度的字符串
?
BLOB
大對(duì)象存儲(chǔ)類型
TEXT
[
常用
]
大文本存儲(chǔ)類型,
最大長(zhǎng)度為
65535(2^16-1)
個(gè)字符
我覺得用的多的類型用
[
常用
]
標(biāo)記了一下,相關(guān)時(shí)間的那幾個(gè)各有各的優(yōu)點(diǎn),就看你的需要了。
二、
變量
declare @iAge int --
聲明變量
set @iAge = 12 --
給變量附值
print @iAge --
打印變量
select @ iAge:=
’iage’ from employe where name=’Bill’
;
將查詢到字段給變量附值
注意
:
這里,
select
語(yǔ)句中我們不得不使用
:=
句法,因?yàn)?/span>
=
是為比較保留的
三、
邏輯控制
-- IF
條件判斷
declare @i int
set @i = 12
if (@i > 10)
?????? begin???????????????????????????
????????????? print 'Dadadada!'
????????????? print 'Dadadada!'
?????? end??????????????????????
else
?????? begin
????????????? print 'XiaoXiao!'
????????????? print 'XiaoXiao!'
?????? end
?
-- While
循環(huán)控制
declare @i int;
set @i = 12;
print @i
return;
while (@i < 18)
begin
?????? print @i;
?????? set @i = @i + 1;
?????? if @i < 17
????????????? continue;
?????? if @i > 15
????????????? break;
end;
?
-- CASE
分支判斷
select au_lname, state, '
猶他州
' from authors where state = 'UT'
select au_lname, state, '
密西西比州
' from authors where state = 'MI'
select au_lname, state, '
肯塔基州
' from authors where state = 'KS'
?
select au_lname, state,
?????? case state
?????? when 'UT' then '
猶他州
'
?????? when 'MI' then '
密西西比州
'
?????? when 'KS' then '
肯塔基州
'
?????? when 'CA' then '
加利福利亞
'
?????? else state
?????? end
from authors
四、
函數(shù)
這部分的內(nèi)容很多
,
我也不是很熟這里就我所知道的列一點(diǎn)
:
--
獲取給定字符串的長(zhǎng)度
print length('abcdef')
--
大小寫轉(zhuǎn)換
print lower('ABCDEF')
print upper('abcdef')
--
去空格
print ltrim('??? abcd? dfd? df? ')
print rtrim('??? abcd? dfd? df? ')
--
求絕對(duì)值
print abs(-12)
--
冪
-- 3
的
2
次方
print power(3,2)
--
隨機(jī)數(shù)
-- 0 - 1000
之間的隨機(jī)數(shù)
print rand() * 1000
--
獲取圓周率
print pi()
--
獲取系統(tǒng)時(shí)間
print now()
--
獲取指定時(shí)間之間相隔多少年
print datediff(year, '2005-01-01', '2008-01-01')
--
字符串合并
print 'abc' + 'def'
print 'abc' + '456'
--
獲取指定時(shí)間的特定部分
print datepart(year, now())
--
獲取字符串中的一段
print SUBSTRING(
‘
abcdef
’
,1,3)
--
獲取紀(jì)錄個(gè)數(shù)
select count(*) from employe;
--
獲取指定工資的和
select sum(salary) from employe;
--
獲取年齡大于
30
歲員工的最高工資
select max(salary) from employe where iage>30;
等等
五、
注釋
? #
單行注釋
? --
單行注視
? /*
內(nèi)容
*/
多行注釋
?
SQL
常規(guī)應(yīng)用
一、
創(chuàng)建數(shù)據(jù)庫(kù)
用給定的名字創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
CREATE DATABASE db_name
刪除數(shù)據(jù)庫(kù)中給定名字的數(shù)據(jù)庫(kù)(慎重使用)
DROP DATABASE [IF EXISTS] db_name
調(diào)出要用的數(shù)據(jù)庫(kù)
USE db_name
下面是一個(gè)完整的創(chuàng)建例子,同時(shí)創(chuàng)建了一個(gè)數(shù)據(jù)庫(kù)
log
文件
--
指定數(shù)據(jù)庫(kù)名稱
-- (
注:如果數(shù)據(jù)庫(kù)名中包含空格可以使用
[]
將其標(biāo)示
)
create database [Super WC]
--
關(guān)于數(shù)據(jù)文件的定義
on
(
name = Super_WC_Data,?????????????????????? --
邏輯名
filename = 'C:\Super_WC_Data.MDF',??????????? --
物理路徑以及物理名
size = 2MB,?????????????????????????????????? --
初始大小
maxsize = 4MB,???????????????????????????? --
最大限制
filegrowth = 1MB??????????????????????????????????????????????????????????????????????????? --
增長(zhǎng)大小
)
--
關(guān)于日志文件的定義
log on
(
name = Super_WC_Log,
filename = 'C:\Super_WC_Log.LDF',
size = 3MB,
maxsize = 7MB,
filegrowth = 20%??????????????????????????????????????????????????????????????????????????? --
增長(zhǎng)比例
)
二、
創(chuàng)建表
drop table if exists auto_incr_test; --
先把以前數(shù)據(jù)庫(kù)中有可能存在的表刪除
create table auto_incr_test (
id int not null auto_increment, ?--
這里的
not null
代表這一列的值不能為空默認(rèn)是
null
name char(40),
timestamp timestamp,
primary key (id)? --
創(chuàng)建主鍵
foreign key (name) references students (no),? --
創(chuàng)建外鍵
)
/*
上面出現(xiàn)的
auto_increment
代表了
id
這個(gè)列是一個(gè)自動(dòng)增長(zhǎng)列
*/
要?jiǎng)h除這個(gè)表就用
drop table auto_incr_test;
就可以了
.
?
下面是包含約束的情況(設(shè)置約束可以增強(qiáng)數(shù)據(jù)庫(kù)的完整性,但需要事先精確的設(shè)計(jì),因?yàn)楦膭?dòng)起來(lái)實(shí)在是太麻煩了):
create table students
(
no??????? char(4) ?????not null?? auto_increment primary key,
name????? nvarchar(8) ? not null,
birthday? datetime ????????? check(datediff(year, birthday, now()) >= 18),
age?????? as datediff(year, birthday, now ()),
sex????? ? nchar(1)??????????? not null default('
女
') check(sex = '
女
' or sex = '
男
'),
phone???? char(11) ????????????? check((phone is null) or (length(phone) = 11)),
address?? nvarchar(24)
)
注意:表創(chuàng)建后修改起來(lái)比較麻煩,如果不是一定要修改的話可以刪了再創(chuàng)建,盡量設(shè)計(jì)時(shí)就把握好需求,設(shè)計(jì)完美一點(diǎn)。
三、
數(shù)據(jù)操作
(
添、刪、改、查
)
?
傳說中著名的添刪改查
添加操作
(insert)
的語(yǔ)法格式:
Insert [into]
數(shù)據(jù)表
(
字段
) values (
數(shù)據(jù)
)? -- [into]
可以省略
例:INSERT tbl_name (col1,col2) VALUES(15,
’abc’
);
?
修改操作
(update)
的語(yǔ)法格式:
Update
數(shù)據(jù)表
set
字段
=
新值
where
條件
例:UPDATE tbl_name SET col2=
?’BBB’ WHERE col2=’abc’;
刪除操作
(delete)
的語(yǔ)法格式:
Delete [from]
數(shù)據(jù)表
where
條件
? -- []
內(nèi)的可寫可不寫,最好是寫,不過懶人都不寫
例:DELETE tbl_name?
WHERE col2=’abc’
?;
?
?
查詢操作
(select)
的語(yǔ)法格式:
select
字段
from
數(shù)據(jù)表
where
條件
order by
字段
desc/asc
/*
這里的
order by
是用來(lái)指定排序依賴列,
desc
是指以降序排列(默認(rèn)的是
asc
升序)
*/
例:SELECT col1,col2 FROM tbl_name?
WHERE col2=’abc’ ORDER BY col1 DESC
;
????
注意:方便數(shù)據(jù)的儲(chǔ)存和查詢是人們發(fā)明數(shù)據(jù)庫(kù)的理由,所以查詢操作是
SQL
中的精髓之一,我上面的格式只是列出了較常用的格式,但只要是程序功能要求稍微復(fù)雜點(diǎn)的就要用到許多查詢語(yǔ)句的高級(jí)特性了,我會(huì)在后面介紹我所能了解的。
?
SQL
高級(jí)應(yīng)用
一、
高級(jí)查詢
1
.高級(jí)查詢(就是把
SQL
定義的
SELECT
語(yǔ)句的語(yǔ)法都用到了的)
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY]??
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY col_name,...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name] ]
GROUP BY
用于分組查詢
HAVING
用于聚合函數(shù)的查詢條件
LIMIT
用于限制SELECT
語(yǔ)句返回的行數(shù)
2
.多表查詢(又叫聯(lián)合查詢)
查找與多個(gè)表相關(guān)的數(shù)據(jù),例:
Select name,iage,city from students a inner join address b where a.addressid=b.id and name=
’Bill’
;
3
.子查詢(很多內(nèi)容,我不能盡舉)
有兩種類型的子查詢:“嵌套”子查詢和“相關(guān)”子查詢。
例:
--
子查詢
--
根據(jù)作者的名查找其編寫的書籍
--
先通過子查詢獲取作者編號(hào)
--
然后,將其作為查詢條件,找出相應(yīng)的書籍編號(hào)
--
最后,在利用所得到的書籍編號(hào)來(lái)得到書籍信息
select au_id, title_id from titleauthor
where au_id =
?????? (select au_id from authors where au_lname = 'Green')
?
select * from titles
where title_id in
?????? (
?????? select title_id from titleauthor
????????????? where au_id =
????????????? (select au_id from authors where au_lname = 'Green')
?????? )
二、
視圖
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
?? ?VIEW view_name [(column_list)]
??? AS select_statement
??? [WITH [CASCADED | LOCAL] CHECK OPTION]
例:
CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
三、
存儲(chǔ)過程
CREATE PROCEDURE sp_name ([proc_parameter[,...]])
??? [characteristic ...] routine_body
例:
create procedure proGetJobsByPage
@CurrentPageSize int,
@PageSize int,
@CurrentPage int
as
Declare @strSql nvarchar(400)
set @strSql = 'select * from
????????????? (select top ' + convert(nvarchar(4), @CurrentPageSize) + ' *
????????????? from (select top ' + convert(nvarchar(4),(@PageSize * @CurrentPage)) + ' * from jobs) as tt
????????????? order by job_id desc) as stt
????????????? order by job_id'
exec sp_executesql @strSql
?
四、
觸發(fā)器
CREATE TRIGGER trigger_nametrigger_timetrigger_event
ON tbl_name FOR EACH ROW trigger_stmt
例:
--
創(chuàng)建插入觸發(fā)器
create trigger emp_marins
on emp_mgr
for insert
as
declare @e char(30),@m char(30)
declare cur_mgr cursor for
?????? select emp_mgr.emp
?????? from emp_mgr,inserted
?????? where emp_mgr.emp = inserted.mgr
?
open? cur_mgr
?
fetch next from cur_mgr into @e
?
while @@fetch_status = 0
begin
?????? update emp_mgr
?????? set emp_mgr.NoOfReports = emp_mgr.NoOfReports + 1
?????? where emp_mgr.emp = @e
??????
?????? fetch next from cur_mgr into @e
end
?
close cur_mgr
?
deallocate cur_mgr
?
五、
索引(很有用,可以提高查詢語(yǔ)句的執(zhí)行效率)
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
??? [USING index_type]
??? ON tbl_name (index_col_name,...)
例:
此處展示的語(yǔ)句用于創(chuàng)建一個(gè)索引,索引使用列
name
。
CREATE INDEX part_of_name ON customer (name);
?
OK
,先些這些啦,累死了,呵呵
…
(如有錯(cuò)誤,請(qǐng)大家不吝賜教
…
)
????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????--- 冰川
?????????????????????????????????????????????????????????????????????????????????????????????2006-12-03