<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

    關(guān)于 MySql SQL 語(yǔ)言

    ?

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

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

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

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

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

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

    當(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 格式來(lái)顯示 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ǔ)句中我們不得不使用 := 句法,因?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ù)庫(kù)

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

    CREATE DATABASE db_name

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

    DROP DATABASE [IF EXISTS] db_name

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

    USE db_name

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

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

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

    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ù)庫(kù)的完整性,但需要事先精確的設(shè)計(jì),因?yàn)楦膭?dòng)起來(lái)實(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)建后修改起來(lái)比較麻煩,如果不是一定要修改的話可以刪了再創(chuàng)建,盡量設(shè)計(jì)時(shí)就把握好需求,設(shè)計(jì)完美一點(diǎn)。

    三、 數(shù)據(jù)操作 ( 添、刪、改、查 ) ? 傳說中著名的添刪改查

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

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

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

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

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

    Delete [from] 數(shù)據(jù)表 where 條件 ? -- [] 內(nèi)的可寫可不寫,最好是寫,不過懶人都不寫
    例:DELETE tbl_name? WHERE col2=’abc’ ?;
    ?

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

    select 字段 from 數(shù)據(jù)表 where 條件 order by 字段 desc/asc

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

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

    ?

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

    一、 高級(jí)查詢

    1 .高級(jí)查詢(就是把 SQL 定義的 SELECT 語(yǔ)句的語(yǔ)法都用到了的)
    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語(yǔ)句返回的行數(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)來(lái)得到書籍信息

    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

    ?

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

    CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

    ??? [USING index_type]

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

    例:

    此處展示的語(yǔ)句用于創(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 冰川 閱讀(1308) 評(píng)論(2)  編輯  收藏

    評(píng)論

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

    "而免費(fèi)的數(shù)據(jù)庫(kù)目前只有 MySql "
    其實(shí)開源或者免費(fèi)的數(shù)據(jù)庫(kù)還有很多,比如和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語(yǔ)言 2006-12-08 09:15 冰川

    呵呵,那個(gè)找茬的,哪天我也會(huì)找回去的
    來(lái)而不往,非禮也  回復(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)論排行榜

    快樂工作—享受生活
    主站蜘蛛池模板: 亚洲男人第一无码aⅴ网站| 亚洲色WWW成人永久网址| 亚洲区小说区图片区QVOD| 亚洲色成人网一二三区| 日韩国产精品亚洲а∨天堂免| 国产成人免费AV在线播放| 久久电影网午夜鲁丝片免费| 在线精品亚洲一区二区三区| 亚洲一卡2卡3卡4卡国产网站| 一级毛片免费播放男男| 无码人妻精品中文字幕免费东京热| 亚洲v国产v天堂a无码久久| 337p日本欧洲亚洲大胆艺术| 日韩在线观看免费| 国产精品久久久久久久久免费| 久久国产成人亚洲精品影院| 亚洲永久在线观看| 国产高清不卡免费视频| 免费中文字幕一级毛片| 亚洲国产精品乱码在线观看97| 亚洲视频在线免费| 在线A级毛片无码免费真人| 亚洲一本综合久久| 一区二区三区在线免费| 成人最新午夜免费视频| 亚洲国产精品久久久天堂| 国产亚洲视频在线播放大全| 韩国免费一级成人毛片| 亚洲AV本道一区二区三区四区| 四虎影视免费永久在线观看| 亚洲精品在线视频观看| 成人无码区免费A∨直播| 国产免费69成人精品视频| youjizz亚洲| 老汉精品免费AV在线播放| 国产亚洲午夜高清国产拍精品 | 97公开免费视频| 久久久久亚洲精品无码网址| 99亚洲精品卡2卡三卡4卡2卡| 男女免费观看在线爽爽爽视频 | 69xx免费观看视频|