302班

          java突擊隊
          posts - 151, comments - 74, trackbacks - 0, articles - 14
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          SQL語句技巧總匯

          Posted on 2007-06-26 00:38 停留的風 閱讀(512) 評論(0)  編輯  收藏 所屬分類: 快速前進的Java
          為了大家更容易理解我舉出的SQL語句,本文假定已經建立了一個學生成績管理數據庫,全文均以學生成績的管理為例來描述。

            1.在查詢結果中顯示列名:

            a.用as關鍵字:select name as '姓名' from students order by age

            b.直接表示:select name '姓名' from students order by age

            2.精確查找:

            a.用in限定范圍:select * from students where native in ('湖南', '四川')

            b.between...and:select * from students where age between 20 and 30

            c.“=”:select * from students where name = '李山'

            d.like:select * from students where name like '李%' (注意查詢條件中有“%”,則說明是部分匹配,而且還有先后信息在里面,即查找以“李”開頭的匹配項。所以若查詢有“李”的所有對象,應該命令:'%李%';若是第二個字為李,則應為'_李%'或'_李'或'_李_'。)

            e.[]匹配檢查符:select * from courses where cno like '[AC]%' (表示或的關系,與"in(...)"類似,而且"[]"可以表示范圍,如:select * from courses where cno like '[A-C]%')

            3.對于時間類型變量的處理

            a.smalldatetime:直接按照字符串處理的方式進行處理,例如:
          select * from students where birth > = '1980-1-1' and birth <= '1980-12-31'

            4.集函數

            a.count()求和,如:select count(*) from students (求學生總人數)

            b.avg(列)求平均,如:select avg(mark) from grades where cno=’B2’

            c.max(列)和min(列),求最大與最小

            5.分組group

            常用于統計時,如分組查總數:
          select gender,count(sno)
          from students
          group by gender
          (查看男女學生各有多少)

            注意:從哪種角度分組就從哪列"group by"

            對于多重分組,只需將分組規則羅列。比如查詢各屆各專業的男女同學人數 ,那么分組規則有:屆別(grade)、專業(mno)和性別(gender),所以有"group by grade, mno, gender"

          select grade, mno, gender, count(*)
          from students
          group by grade, mno, gender

            通常group還和having聯用,比如查詢1門課以上不及格的學生,則按學號(sno)分類有:

          select sno,count(*) from grades
          where mark<60
          group by sno
          having count(*)>1

            6.UNION聯合

            合并查詢結果,如:

          SELECT * FROM students
          WHERE name like ‘張%’
          UNION [ALL]
          SELECT * FROM students
          WHERE name like ‘李%’

          7.多表查詢

           

            a.內連接

          select g.sno,s.name,c.coursename
          from grades g JOIN students s ON g.sno=s.sno
          JOIN courses c ON g.cno=c.cno
          (注意可以引用別名)
          b.外連接
          b1.左連接
          select courses.cno,max(coursename),count(sno)
          from courses LEFT JOIN grades ON courses.cno=grades.cno
          group by courses.cno

            左連接特點:顯示全部左邊表中的所有項目,即使其中有些項中的數據未填寫完全。

            左外連接返回那些存在于左表而右表中卻沒有的行,再加上內連接的行。

            b2.右連接

            與左連接類似

            b3.全連接

          select sno,name,major
          from students FULL JOIN majors ON students.mno=majors.mno

            兩邊表中的內容全部顯示

            c.自身連接

          select c1.cno,c1.coursename,c1.pno,c2.coursename
          from courses c1,courses c2 where c1.pno=c2.cno

            采用別名解決問題。

            d.交叉連接

          select lastname+firstname from lastname CROSS JOIN firstanme

            相當于做笛卡兒積

            8.嵌套查詢

            a.用關鍵字IN,如查詢李山的同鄉:

          select * from students
          where native in (select native from students where name=’ 李山’)

            b.使用關鍵字EXIST,比如,下面兩句是等價的:

          select * from students
          where sno in (select sno from grades where cno=’B2’)

          select * from students where exists
          (select * from grades where
          grades.sno=students.sno AND cno=’B2’)

            9.關于排序order

            a.對于排序order,有兩種方法:asc升序和desc降序

            b.對于排序order,可以按照查詢條件中的某項排列,而且這項可用數字表示,如:

          select sno,count(*) ,avg(mark) from grades
          group by sno
          having avg(mark)>85
          order by 3

            10.其他

            a.對于有空格的識別名稱,應該用"[]"括住。

            b.對于某列中沒有數據的特定查詢可以用null判斷,如select sno,courseno from grades where mark IS NULL

            c.注意區分在嵌套查詢中使用的any與all的區別,any相當于邏輯運算“||”而all則相當于邏輯運算“&&”

            d.注意在做否定意義的查詢是小心進入陷阱:

            如,沒有選修‘B2’課程的學生 :

          select students.*
          from students, grades
          where students.sno=grades.sno
          AND grades.cno <> ’B2’

            上面的查詢方式是錯誤的,正確方式見下方:

          select * from students
          where not exists (select * from grades
          where grades.sno=students.sno AND cno='B2')

            11.關于有難度多重嵌套查詢的解決思想:

            如,選修了全部課程的學生:

          select *
          from students
          where not exists ( select *
          from courses
          where NOT EXISTS
          (select *
          from grades
          where sno=students.sno
          AND cno=courses.cno))

            最外一重:從學生表中選,排除那些有課沒選的。用not exist。由于討論對象是課程,所以第二重查詢從course表中找,排除那些選了課的即可。

          主站蜘蛛池模板: 康乐县| 原平市| 甘肃省| 耒阳市| 嘉峪关市| 兴化市| 永福县| 文登市| 漯河市| 沙洋县| 庆安县| 哈尔滨市| 辛集市| 武山县| 开平市| 驻马店市| 新民市| 广南县| 阿拉善左旗| 会昌县| 卢湾区| 天全县| 克东县| 安龙县| 唐海县| 唐河县| 六枝特区| 新巴尔虎右旗| 长沙市| 仁寿县| 榕江县| 财经| 松阳县| 华容县| 湄潭县| 富民县| 习水县| 夏邑县| 应城市| 大安市| 长治市|