|
目前常用的數(shù)據(jù)庫有 Oracle 公司的 Oracle , Microsoft 公司的 SQL Server , IBM 公司的 DB2 和 MySql 公司的 MySql, 而免費的數(shù)據(jù)庫目前只有 MySql ,當然盜版的不算。 SQL (Structured Query Language) 結(jié)構(gòu)化查詢語言是目前一個國際上標準的數(shù)據(jù)庫專用語言。 不過不同的數(shù)據(jù)庫所使用的 SQL 語句都會稍有一些不同,但基本的標準還是會遵循 SQL ,例如: 用與 SQL Server 的叫做 T-SQL,用于 Oracle 的叫做PL-SQL ,它們都是 SQL 的子類,或者說是派生類。用于 MySql 的我還不知道它叫做什么 SQL ,不過個人覺得它反而最接近標準的 SQL 語言,不過,從另一方面來說,它對 SQL 所做的擴展最少。 就我現(xiàn)在的理解 SQL 語言就是用來使用數(shù)據(jù)庫和操作數(shù)據(jù)用的,不包括操作數(shù)據(jù)庫,那些操作數(shù)據(jù)庫的代碼應(yīng)該叫做命令,如:啟動,關(guān)閉數(shù)據(jù)庫,設(shè)置字SQL 語言,不同的數(shù)據(jù)庫都有自己符集,設(shè)置訪問連接用戶數(shù)等,這些不屬于的命令,這些命令是生產(chǎn)企業(yè)制定的。下面,我大概來說一下 SQL 所做的事情創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表,插入、修改、刪除數(shù)據(jù), 查詢數(shù)據(jù)(最主要的是這個功能,方便數(shù)據(jù)的儲存和查詢是人們發(fā)明數(shù)據(jù)庫的理由)。 當然,我下面介紹的 SQL 都是用于 MySql 的。 SQL 基礎(chǔ)知識 一、 數(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) 個字符 我覺得用的多的類型用 [ 常用 ] 標記了一下,相關(guān)時間的那幾個各有各的優(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') -- 大小寫轉(zhuǎn)換 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ī)應(yīng)用 一、 創(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] -- 關(guān)于數(shù)據(jù)文件的定義 on ( name = Super_WC_Data, -- 邏輯名 filename = 'C:Super_WC_Data.MDF', -- 物理路徑以及物理名 size = 2MB, -- 初始大小 maxsize = 4MB, -- 最大限制 filegrowth = 1MB -- 增長大小 ) -- 關(guān)于日志文件的定義 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è)置約束可以增強數(shù)據(jù)庫的完整性,但需要事先精確的設(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)建后修改起來比較麻煩,如果不是一定要修改的話可以刪了再創(chuàng)建, 盡量設(shè)計時就把握好需求,設(shè)計完美一點。 三、 數(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 中的精髓之一,我上面的格式只是列出了較常用的格式,但只要是程序功能要求稍微復(fù)雜點的就要用到許多查詢語句的高級特性了,我會在后面介紹我所能了解的。 SQL 高級應(yīng)用 一、 高級查詢 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)合查詢) 查找與多個表相關(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ù)作者的名查找其編寫的書籍 -- 先通過子查詢獲取作者編號 -- 然后,將其作為查詢條件,找出相應(yīng)的書籍編號 -- 最后,在利用所得到的書籍編號來得到書籍信息 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_nameproc_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);
信息發(fā)布:廣州名易軟件有限公司 http://m.jetlc.com
|