隨筆 - 4  文章 - 10  trackbacks - 0
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           目前常用的數據庫有 Oracle 公司的 Oracle Microsoft 公司的 SQL Server IBM 公司的 DB2 MySql 公司的 MySql, 而免費的數據庫目前只有 MySql ,當然盜版的不算。

            SQL (Structured Query Language) 結構化查詢語言是目前一個國際上標準的數據庫專用語言。

          不過不同的數據庫所使用的 SQL 語句都會稍有一些不同,但基本的標準還是會遵循 SQL ,例如:

          用與 SQL Server 的叫做 PL-SQL ,用于 Oracle 的叫做 T-SQL ,它們都是 SQL 的子類,或者說是派生類。用于 MySql 的我還不知道它叫做什么 SQL ,不過個人覺得它反而最接近標準的 SQL 語言,不過,從另一方面來說,它對 SQL 所做的擴展最少。

            就我現在的理解 SQL 語言就是用來使用數據庫和操作數據用的,不包括操作數據庫,那些操作數據庫的代碼應該叫做命令,如:啟動,關閉數據庫,設置字符集,設置訪問連接用戶數等,這些不屬于 SQL 語言,不同的數據庫都有自己的命令,這些命令是生產企業制定的。下面,我大概來說一下 SQL 所做的事情創建數據庫,創建表,插入、修改、刪除數據,

          查詢數據(最主要的是這個功能,方便數據的儲存和查詢是人們發明數據庫的理由)。

          當然,我下面介紹的 SQL 都是用于 MySql 的。

                                        SQL 基礎知識

          一、 數據類型

          INT [ 常用 ] 整數 BIGIN 大整數 FLOAT ( 單精密 ) 浮點數字 DOUBLE [ 常用 ] ( 雙精密 ) 浮點數字

          NUMERIC(M,D) [ 常用 ] 未壓縮 (unpack) 的浮點數字, 未壓縮 意味著數字作為一個字符串被存儲,值的每一位使用一個字符。例: NUMERIC(16,2) 表示這個 浮點數字的儲存空間為 16 個字節,精度為 2 (即小數點后保留 2 位數字)。

          DATE [ 常用 ] 日期   DATETIME [ 常用 ] 日期和時間組合   CHAR(M) 一個定長字符串

          TIMESTAMP(M) [ 常用 ] 時間戳記。以 YYYYMMDDHHMMSS YYMMDDHHMMSS YYYYMMDD YYMMDD 格式來顯示 TIMESTAMP 值,例: TIMESTAMP(14) 格式為YYYYMMDDHHMMSSTIMESTAMP(8) 格式為YYYYMMDD

          VARCHAR(M) [ 常用 ] 可變長度的字符串   BLOB 大對象存儲類型

          TEXT [ 常用 ] 大文本存儲類型, 最大長度為 65535(2^16-1) 個字符

          我覺得用的多的類型用 [ 常用 ] 標記了一下,相關時間的那幾個各有各的優點,就看你的需要了。

          二、 變量

          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 循環控制

          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

          四、 函數

          這部分的內容很多 , 我也不是很熟這里就我所知道的列一點 :

          -- 獲取給定字符串的長度

          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)

          -- 隨機數

          -- 0 - 1000 之間的隨機數

          print rand() * 1000

          -- 獲取圓周率

          print pi()

          -- 獲取系統時間

          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)

          -- 獲取紀錄個數

          select count(*) from employe;

          -- 獲取指定工資的和

          select sum(salary) from employe;

          -- 獲取年齡大于 30 歲員工的最高工資

          select max(salary) from employe where iage>30;

          等等

          五、 注釋

            # 單行注釋   -- 單行注視   /* 內容 */ 多行注釋

           

          SQL 常規應用

          一、 創建數據庫

          用給定的名字創建一個數據庫

          CREATE DATABASE db_name

          刪除數據庫中給定名字的數據庫(慎重使用)

          DROP DATABASE [IF EXISTS] db_name

          調出要用的數據庫

          USE db_name

          下面是一個完整的創建例子,同時創建了一個數據庫 log 文件

          -- 指定數據庫名稱

          -- ( 注:如果數據庫名中包含空格可以使用 [] 將其標示 )

          create database [Super WC]

          -- 關于數據文件的定義

          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%                                                                            -- 增長比例

          )

          二、 創建表

          drop table if exists auto_incr_test; -- 先把以前數據庫中有可能存在的表刪除

          create table auto_incr_test (

          id int not null auto_increment,  -- 這里的 not null 代表這一列的值不能為空默認是 null

          name char(40),

          timestamp timestamp,

          primary key (id)  -- 創建主鍵

          foreign key (name) references students (no),  -- 創建外鍵

          )

          /* 上面出現的 auto_increment 代表了 id 這個列是一個自動增長列 */

          要刪除這個表就用 drop table auto_incr_test; 就可以了 .

           

          下面是包含約束的情況(設置約束可以增強數據庫的完整性,但需要事先精確的設計,因為改動起來實在是太麻煩了):

          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)

          )

          注意:表創建后修改起來比較麻煩,如果不是一定要修改的話可以刪了再創建,盡量設計時就把握好需求,設計完美一點。

          三、 數據操作 ( 添、刪、改、查 ) ß 傳說中著名的添刪改查

          添加操作 (insert) 的語法格式:

          Insert [into] 數據表 ( 字段 ) values ( 數據 )  -- [into] 可以省略
          例:INSERT tbl_name (col1,col2) VALUES(15, ’abc’ );
           

          修改操作 (update) 的語法格式:

          Update 數據表 set 字段 = 新值 where 條件
          例:UPDATE tbl_name SET col2=  ’BBB’ WHERE col2=’abc’;

          刪除操作 (delete) 的語法格式:

          Delete [from] 數據表 where 條件   -- [] 內的可寫可不寫,最好是寫,不過懶人都不寫
          例:DELETE tbl_name  WHERE col2=’abc’  ;
           

            查詢操作 (select) 的語法格式:

          select 字段 from 數據表 where 條件 order by 字段 desc/asc

          /* 這里的 order by 是用來指定排序依賴列, desc 是指以降序排列(默認的是 asc 升序) */
          例:SELECT col1,col2 FROM tbl_name  WHERE col2=’abc’ ORDER BY col1 DESC ;
              

          注意:方便數據的儲存和查詢是人們發明數據庫的理由,所以查詢操作是 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 用于聚合函數的查詢條件
          LIMIT 用于限制SELECT語句返回的行數

          2 .多表查詢(又叫聯合查詢)

          查找與多個表相關的數據,例:

          Select name,iage,city from students a inner join address b where a.addressid=b.id and name= ’Bill’ ;

          3 .子查詢(很多內容,我不能盡舉)

          有兩種類型的子查詢:“嵌套”子查詢和“相關”子查詢。

          例:

          -- 子查詢

          -- 根據作者的名查找其編寫的書籍

          -- 先通過子查詢獲取作者編號

          -- 然后,將其作為查詢條件,找出相應的書籍編號

          -- 最后,在利用所得到的書籍編號來得到書籍信息

          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

           

          四、 觸發器

          CREATE TRIGGER trigger_nametrigger_timetrigger_event

          ON tbl_name FOR EACH ROW trigger_stmt

          例:

          -- 創建插入觸發器

          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

           

          五、 索引(很有用,可以提高查詢語句的執行效率)

          CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

              [USING index_type]

              ON tbl_name (index_col_name,...)

          例:

          此處展示的語句用于創建一個索引,索引使用列 name

          CREATE INDEX part_of_name ON customer (name);

           

          OK ,先些這些啦,累死了,呵呵

          (如有錯誤,請大家不吝賜教

          posted on 2007-08-13 15:41 冬天出走的豬 閱讀(269) 評論(0)  編輯  收藏 所屬分類: Database
          主站蜘蛛池模板: 静安区| 当雄县| 田林县| 化隆| 新郑市| 双辽市| 凤城市| 兴安盟| 禹州市| 江华| 定襄县| 镇平县| 永州市| 马边| 嵩明县| 台东市| 曲水县| 宁南县| 嘉鱼县| 瓦房店市| 吉安县| 平泉县| 合山市| 辽中县| 叶城县| 吉首市| 密云县| 新竹县| 新宁县| 绥德县| 义乌市| 略阳县| 泊头市| 安阳市| 天水市| 甘孜县| 历史| 肥乡县| 阳曲县| 仙居县| 磐安县|