博學而篤志,好問而近思

          【原創】關于MySql的SQL語言

          關于 MySql SQL 語言

          ?

          ? 目前常用的數據庫有 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 ,先些這些啦,累死了,呵呵

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

          ????????????????????????????????????????
          ?????????????????????????????????????????????????????????????????????????????????????????????--- 冰川
          ?????????????????????????????????????????????????????????????????????????????????????????????2006-12-03

          posted on 2006-12-03 21:08 冰川 閱讀(1310) 評論(2)  編輯  收藏

          評論

          # re: 【原創】關于MySql的SQL語言 2006-12-07 22:02 mlsx

          "而免費的數據庫目前只有 MySql "
          其實開源或者免費的數據庫還有很多,比如和MySQL齊名的PostgreSQL(http://www.postgresql.org/),BDB等。

          下面的鏈接是有關由數據的條目的介紹:

          http://www.faqs.org/faqs/databases/free-databases/

          有點找茬的味道,呵呵。
            回復  更多評論   

          # re: 【原創】關于MySql的SQL語言 2006-12-08 09:15 冰川

          呵呵,那個找茬的,哪天我也會找回去的
          來而不往,非禮也  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導航

          統計

          常用鏈接

          留言簿(14)

          隨筆檔案

          BlogJava的幫助

          朋友的博客

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          快樂工作—享受生活
          主站蜘蛛池模板: 珲春市| 台东县| 泽库县| 昭通市| 尼玛县| 延川县| 马山县| 苍山县| 彭泽县| 庆安县| 外汇| 永宁县| 普安县| 吉水县| 盐城市| 来凤县| 绵竹市| 原阳县| 静海县| 阿勒泰市| 巴东县| 苗栗市| 遂平县| 保亭| 黑龙江省| 饶平县| 黔东| 沈阳市| 姜堰市| 海宁市| 泰顺县| 宁化县| 巴东县| 东莞市| 菏泽市| 伊春市| 桦川县| 阿克| 独山县| 进贤县| 登封市|