目前常用的數(shù)據(jù)庫有 Oracle 公司的 Oracle , Microsoft 公司的 SQL Server , IBM 公司的 DB2 和 MySql 公司的 MySql, 而免費的數(shù)據(jù)庫目前只有 MySql ,當然盜版的不算。
SQL (Structured Query Language) 結構化查詢語言是目前一個國際上標準的數(shù)據(jù)庫專用語言。
不過不同的數(shù)據(jù)庫所使用的 SQL 語句都會稍有一些不同,但基本的標準還是會遵循 SQL ,例如:
用與 SQL Server 的叫做 PL-SQL ,用于 Oracle 的叫做 T-SQL ,它們都是 SQL 的子類,或者說是派生類。用于 MySql 的我還不知道它叫做什么 SQL ,不過個人覺得它反而最接近標準的 SQL 語言,不過,從另一方面來說,它對 SQL 所做的擴展最少。
就我現(xiàn)在的理解 SQL 語言就是用來使用數(shù)據(jù)庫和操作數(shù)據(jù)用的,不包括操作數(shù)據(jù)庫,那些操作數(shù)據(jù)庫的代碼應該叫做命令,如:啟動,關閉數(shù)據(jù)庫,設置字符集,設置訪問連接用戶數(shù)等,這些不屬于 SQL 語言,不同的數(shù)據(jù)庫都有自己的命令,這些命令是生產(chǎn)企業(yè)制定的。下面,我大概來說一下 SQL 所做的事情創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表,插入、修改、刪除數(shù)據(jù),
查詢數(shù)據(jù)(最主要的是這個功能,方便數(shù)據(jù)的儲存和查詢是人們發(fā)明數(shù)據(jù)庫的理由)。
當然,我下面介紹的 SQL 都是用于 MySql 的。
SQL 基礎知識
一、 數(shù)據(jù)類型
INT
[ 常用 ] 整數(shù) BIGIN
大整數(shù) FLOAT
( 單精密 ) 浮點數(shù)字 DOUBLE
[ 常用 ] ( 雙精密 ) 浮點數(shù)字
NUMERIC(M,D)
[ 常用 ] 未壓縮 (unpack) 的浮點數(shù)字, “ 未壓縮 ” 意味著數(shù)字作為一個字符串被存儲,值的每一位使用一個字符。例: NUMERIC(16,2)
表示這個
浮點數(shù)字的儲存空間為 16 個字節(jié),精度為 2 (即小數(shù)點后保留 2 位數(shù)字)。
DATE
[ 常用 ]
日期 DATETIME
[ 常用 ] 日期和時間組合 CHAR(M)
一個定長字符串
TIMESTAMP(M)
[ 常用 ]
時間戳記。以 YYYYMMDDHHMMSS
、 YYMMDDHHMMSS
、 YYYYMMDD
或 YYMMDD
格式來顯示 TIMESTAMP
值,例: TIMESTAMP(14)
格式為YYYYMMDDHHMMSS、TIMESTAMP(8) 格式為YYYYMMDD
VARCHAR(M)
[ 常用 ] 可變長度的字符串 BLOB
大對象存儲類型
TEXT
[ 常用 ]
大文本存儲類型,
最大長度為 65535(2^16-1) 個字符
我覺得用的多的類型用
[ 常用 ] 標記了一下,相關時間的那幾個各有各的優(yōu)點,就看你的需要了。
二、 變量
declare @iAge int -- 聲明變量
set @iAge = 12 -- 給變量附值
print @iAge -- 打印變量
select @ iAge:= ’iage’ from employe where name=’Bill’ ; 將查詢到字段給變量附值
注意 : 這里, select 語句中我們不得不使用 :=
句法,因為 =
是為比較保留的
三、 邏輯控制
-- 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)容很多 , 我也不是很熟這里就我所知道的列一點 :
-- 獲取給定字符串的長度
print length('abcdef')
-- 大小寫轉換
print lower('ABCDEF')
print upper('abcdef')
-- 去空格
print ltrim(' abcd dfd df ')
print rtrim(' abcd dfd df ')
-- 求絕對值
print abs(-12)
-- 冪
-- 3 的 2 次方
print power(3,2)
-- 隨機數(shù)
-- 0 - 1000 之間的隨機數(shù)
print rand() * 1000
-- 獲取圓周率
print pi()
-- 獲取系統(tǒng)時間
print now()
-- 獲取指定時間之間相隔多少年
print datediff(year, '2005-01-01', '2008-01-01')
-- 字符串合并
print 'abc' + 'def'
print 'abc' + '456'
-- 獲取指定時間的特定部分
print datepart(year, now())
-- 獲取字符串中的一段
print SUBSTRING(
‘
abcdef ’ ,1,3)
-- 獲取紀錄個數(shù)
select count(*) from employe;
-- 獲取指定工資的和
select sum(salary) from employe;
-- 獲取年齡大于 30 歲員工的最高工資
select max(salary) from employe where iage>30;
等等
五、 注釋
# 單行注釋 -- 單行注視 /* 內(nèi)容 */ 多行注釋
SQL 常規(guī)應用
一、 創(chuàng)建數(shù)據(jù)庫
用給定的名字創(chuàng)建一個數(shù)據(jù)庫
CREATE DATABASE db_name
刪除數(shù)據(jù)庫中給定名字的數(shù)據(jù)庫(慎重使用)
DROP DATABASE [IF EXISTS] db_name
調(diào)出要用的數(shù)據(jù)庫
USE db_name
下面是一個完整的創(chuàng)建例子,同時創(chuàng)建了一個數(shù)據(jù)庫 log 文件
-- 指定數(shù)據(jù)庫名稱
-- ( 注:如果數(shù)據(jù)庫名中包含空格可以使用 [] 將其標示 )
create database [Super WC]
-- 關于數(shù)據(jù)文件的定義
on
(
name = Super_WC_Data, -- 邏輯名
filename = 'C:\Super_WC_Data.MDF', -- 物理路徑以及物理名
size = 2MB, -- 初始大小
maxsize = 4MB, -- 最大限制
filegrowth = 1MB -- 增長大小
)
-- 關于日志文件的定義
log on
(
name = Super_WC_Log,
filename = 'C:\Super_WC_Log.LDF',
size = 3MB,
maxsize = 7MB,
filegrowth = 20% -- 增長比例
)
二、 創(chuàng)建表
drop table if exists auto_incr_test; -- 先把以前數(shù)據(jù)庫中有可能存在的表刪除
create table auto_incr_test (
id int not null auto_increment, -- 這里的 not null 代表這一列的值不能為空默認是 null
name char(40),
timestamp timestamp,
primary key (id) -- 創(chuàng)建主鍵
foreign key (name) references students (no), -- 創(chuàng)建外鍵
)
/* 上面出現(xiàn)的 auto_increment 代表了 id 這個列是一個自動增長列 */
要刪除這個表就用 drop table auto_incr_test; 就可以了 .
下面是包含約束的情況(設置約束可以增強數(shù)據(jù)庫的完整性,但需要事先精確的設計,因為改動起來實在是太麻煩了):
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)建后修改起來比較麻煩,如果不是一定要修改的話可以刪了再創(chuàng)建,盡量設計時就把握好需求,設計完美一點。
三、 數(shù)據(jù)操作 ( 添、刪、改、查 ) ß 傳說中著名的添刪改查
添加操作 (insert) 的語法格式:
Insert [into] 數(shù)據(jù)表 ( 字段 ) values ( 數(shù)據(jù) ) -- [into] 可以省略
例:INSERT tbl_name (col1,col2) VALUES(15, ’abc’ );
修改操作 (update) 的語法格式:
Update 數(shù)據(jù)表 set 字段 = 新值 where 條件
例:UPDATE tbl_name SET col2= ’BBB’ WHERE col2=’abc’;
刪除操作 (delete) 的語法格式:
Delete [from] 數(shù)據(jù)表 where 條件 -- [] 內(nèi)的可寫可不寫,最好是寫,不過懶人都不寫
例:DELETE tbl_name WHERE col2=’abc’ ;
查詢操作 (select) 的語法格式:
select 字段 from 數(shù)據(jù)表 where 條件 order by 字段 desc/asc
/* 這里的 order by 是用來指定排序依賴列, desc 是指以降序排列(默認的是 asc 升序) */
例:SELECT col1,col2 FROM tbl_name WHERE col2=’abc’ ORDER BY col1 DESC ;
注意:方便數(shù)據(jù)的儲存和查詢是人們發(fā)明數(shù)據(jù)庫的理由,所以查詢操作是 SQL 中的精髓之一,我上面的格式只是列出了較常用的格式,但只要是程序功能要求稍微復雜點的就要用到許多查詢語句的高級特性了,我會在后面介紹我所能了解的。
SQL 高級應用
一、 高級查詢
1 .高級查詢(就是把 SQL 定義的 SELECT 語句的語法都用到了的)
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
語句返回的行數(shù)
2 .多表查詢(又叫聯(liá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)容,我不能盡舉)
有兩種類型的子查詢:“嵌套”子查詢和“相關”子查詢。
例:
-- 子查詢
-- 根據(jù)作者的名查找其編寫的書籍
-- 先通過子查詢獲取作者編號
-- 然后,將其作為查詢條件,找出相應的書籍編號
-- 最后,在利用所得到的書籍編號來得到書籍信息
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;
三、 存儲過程
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
五、 索引(很有用,可以提高查詢語句的執(zhí)行效率)
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING index_type]
ON tbl_name (index_col_name,...)
例:
此處展示的語句用于創(chuàng)建一個索引,索引使用列 name 。
CREATE INDEX part_of_name ON customer (name);
OK ,先些這些啦,累死了,呵呵 …
(如有錯誤,請大家不吝賜教 … )
posted on 2007-08-13 15:41
冬天出走的豬 閱讀(267)
評論(0) 編輯 收藏 所屬分類:
Database