博學(xué)而篤志,好問而近思

          【原創(chuàng)】關(guān)于MySql的SQL語言

          關(guān)于 MySql SQL 語言

          ?

          ? 目前常用的數(shù)據(jù)庫有 Oracle 公司的 Oracle Microsoft 公司的 SQL Server IBM 公司的 DB2 MySql 公司的 MySql, 而免費(fèi)的數(shù)據(jù)庫目前只有 MySql ,當(dāng)然盜版的不算。

          ? SQL (Structured Query Language) 結(jié)構(gòu)化查詢語言是目前一個(gè)國際上標(biāo)準(zhǔn)的數(shù)據(jù)庫專用語言。

          不過不同的數(shù)據(jù)庫所使用的 SQL 語句都會(huì)稍有一些不同,但基本的標(biāo)準(zhǔn)還是會(huì)遵循 SQL ,例如:

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

          ? 就我現(xiàn)在的理解 SQL 語言就是用來使用數(shù)據(jù)庫和操作數(shù)據(jù)用的,不包括操作數(shù)據(jù)庫,那些操作數(shù)據(jù)庫的代碼應(yīng)該叫做命令,如:?jiǎn)?dòng),關(guān)閉數(shù)據(jù)庫,設(shè)置字符集,設(shè)置訪問連接用戶數(shù)等,這些不屬于 SQL 語言,不同的數(shù)據(jù)庫都有自己的命令,這些命令是生產(chǎn)企業(yè)制定的。下面,我大概來說一下 SQL 所做的事情創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表,插入、修改、刪除數(shù)據(jù),

          查詢數(shù)據(jù)(最主要的是這個(gè)功能,方便數(shù)據(jù)的儲(chǔ)存和查詢是人們發(fā)明數(shù)據(jù)庫的理由)。

          當(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 格式來顯示 TIMESTAMP 值,例: TIMESTAMP(14) 格式為YYYYMMDDHHMMSSTIMESTAMP(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à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ù)庫

          用給定的名字創(chuàng)建一個(gè)數(shù)據(jù)庫

          CREATE DATABASE db_name

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

          DROP DATABASE [IF EXISTS] db_name

          調(diào)出要用的數(shù)據(jù)庫

          USE db_name

          下面是一個(gè)完整的創(chuàng)建例子,同時(shí)創(chuàng)建了一個(gè)數(shù)據(jù)庫 log 文件

          -- 指定數(shù)據(jù)庫名稱

          -- ( 注:如果數(shù)據(jù)庫名中包含空格可以使用 [] 將其標(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ù)庫中有可能存在的表刪除

          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ù)庫的完整性,但需要事先精確的設(shè)計(jì),因?yàn)楦膭?dòng)起來實(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è)計(jì)時(shí)就把握好需求,設(shè)計(jì)完美一點(diǎn)。

          三、 數(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 是指以降序排列(默認(rèn)的是 asc 升序) */
          例:SELECT col1,col2 FROM tbl_name? WHERE col2=’abc’ ORDER BY col1 DESC ;
          ????

          注意:方便數(shù)據(jù)的儲(chǔ)存和查詢是人們發(fā)明數(shù)據(jù)庫的理由,所以查詢操作是 SQL 中的精髓之一,我上面的格式只是列出了較常用的格式,但只要是程序功能要求稍微復(fù)雜點(diǎn)的就要用到許多查詢語句的高級(jí)特性了,我會(huì)在后面介紹我所能了解的。

          ?

          SQL 高級(jí)應(yīng)用

          一、 高級(jí)查詢

          1 .高級(jí)查詢(就是把 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)合查詢)

          查找與多個(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)來得到書籍信息

          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

          ?

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

          CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

          ??? [USING index_type]

          ??? ON tbl_name (index_col_name,...)

          例:

          此處展示的語句用于創(chuàng)建一個(gè)索引,索引使用列 name

          CREATE INDEX part_of_name ON customer (name);

          ?

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

          (如有錯(cuò)誤,請(qǐng)大家不吝賜教

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

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

          評(píng)論

          # re: 【原創(chuàng)】關(guān)于MySql的SQL語言 2006-12-07 22:02 mlsx

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

          下面的鏈接是有關(guān)由數(shù)據(jù)的條目的介紹:

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

          有點(diǎn)找茬的味道,呵呵。
            回復(fù)  更多評(píng)論   

          # re: 【原創(chuàng)】關(guān)于MySql的SQL語言 2006-12-08 09:15 冰川

          呵呵,那個(gè)找茬的,哪天我也會(huì)找回去的
          來而不往,非禮也  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(14)

          隨筆檔案

          BlogJava的幫助

          朋友的博客

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          快樂工作—享受生活
          主站蜘蛛池模板: 嘉兴市| 定陶县| 新密市| 嘉黎县| 渭南市| 崇义县| 大厂| 和林格尔县| 两当县| 庆元县| 阿克陶县| 蛟河市| 贵溪市| 仁化县| 申扎县| 思南县| 堆龙德庆县| 汾阳市| 宜川县| 女性| 石泉县| 贡觉县| 天等县| 武强县| 满城县| 奈曼旗| 乌什县| 新河县| 武功县| 朝阳市| 新宾| 绿春县| 龙口市| 镇巴县| 平远县| 大厂| 镇原县| 来安县| 双桥区| 大英县| 嘉峪关市|