1. 程式人生 > >sql語句_自連線_外連線_左連線_子查詢_排序_分組

sql語句_自連線_外連線_左連線_子查詢_排序_分組

資料庫
sql語句
分為DDL,DCL,DLL
1),DDL,data define language: 新建一個數據庫
ceate建立 alter修改 drop刪
這三條語句,在下面幾個元件中,都可以用得到
資料庫分為下面幾個元件
a,資料庫,database
#如果之前已經存在,刪除它
drop DATABASE if exists 資料庫名;
建立一個數據庫
create database 資料庫名字;
#進入資料庫
use 資料庫名;

        b,表   table
                    create table 表名(
                        設定變數,和約束
                        一般變數分的型別分為
                            int     數字
                            varchar 字串型別 必須是一個介於 1 和 8,000 之間的數值
                            char    指定字元的長度 char(8),你輸入的字元小於8時,
                                它會再後面補空值。當你輸入   的字元大於指定的數時,
                                它會擷取超出的字元
                            datetime 日期加時間
                            date    日期
                            TEXT    text儲存可變長度的非Unicode資料
                            tinyint
                    六大約束    
                        主鍵約束  primamy key
                                一個表只有一個主鍵,且不能空值
                        唯一約束   unique
                            表示,一行資料中不能有相同的列值,一個表可以定義多個unique的約束
                        檢查約束    check   
                            輸入一列或多列的值的範圍,通過邏輯表示式來判斷資料的有效性
                        外來鍵約束   foreign key (ID) references 表名(ID)
                            連線主表與從表,主表中的一個列,與另一個表中的資料相連線,
                            主
                        非空約束 not null
                        預設約束   default 
                    #字元編碼的更改
                    )DEFAULT CHARSET=utf8 
        c,檢視 view
                    是一個是虛表,只能是本使用者自身可以使用,基於sql的查詢建立
                    建立view:
        create view lishi as 
                select sname from student,(select ...from) sd WHERE sname like "lishi";
        d,儲存過程,(procedure)
                一般用於供外部程式呼叫,相當於一個把資料封裝的概念,能夠起到對資料的保護安全的作用
                    能提交處理效率
                    自定義:
                沒有返回值,out代表結果輸出,out可以有多個也就是說在引數
                in代表
                create procedure pro ([引數[in|out] 資料型別])
                    create procedure sp_search(in p_name varchar(10)
                    begin
                    set @varibale1 = concat('%',p_name,'%');
                    if p_name is null  or p_name='' then
                        select * from t_user;------------------------查詢所有
                        else
                    select *from t_user where user_name like @varibale1;-----按條件查詢
                        end if;
                    end;    
        呼叫方法:   call sp_search('李'); 可以接收整個結果,也可以在引數中接收


            e,觸發器 

            f,索引 index使用索引的前提是資料量龐大的表
                建立索引的優點是,可以提高查詢效率,
                當更新基本表時,自己自動修改索引
                缺點是:當基本表,不斷地在更新,刪除,增加資料時,會提高維護索引的時間
                建立新的索引:
                        create index 索引名 on 表名()

            g,函式
                主要是用於對資料欄位的處理,要有返回值,這是跟儲存過程的區別
                        呼叫方法是,直接select已經寫好的函式
                create view lsview AS 
                    select sid,CONCAT(sname,'xxx') sname,sage+10 from student where sname like 'lishi';
                concat(a,b)字串的連線       sage+10 +10也是一個簡單函式
                avg     平均值
                sum     求和
                max     最大
                min     最小
                自定義函式:CREATE function funadd(age int,stand int)

                    returns VARCHAR(20)
                    BEGIN

                    if age >= stand then--------------------這裡寫各種T-SQL語句
                    return 'old';
                end;
                []代表可以有可無 可以不帶前提條件
        呼叫方法    select 函式名 from..表名

        Transcat-Sql語句  
            變數的宣告  控制語句 分支 迴圈
                case  when可以直接在select語句
        %百分號,放兩邊%100%  結果表示模糊包含
                放左邊%100    結果表示以100開頭
                放右邊100%   結果表示以100結束
        _下劃線,有幾個下劃線,表示結果後面可以跟幾個字元       


2),DML,data manage language: 對資料本身的操作語句
            增insert 刪delete 改updata  查select 

            insert into 表名(列名) values('要加入的值');
            insert into classes (cname) values('數學');

            delete from 表名 條件 id為7的;
            delete from zsy where id=7;
            刪除可以是沒有條件的,不用where,可以直接刪除整個表

            update 表名 set 要改的列名裡面的外語  where 表裡面名字為 英語,
            update classes set cname='外語' where cname='英語';#

            select [distinct] 欄位1 as 別名, 函式(),欄位1+欄位2 ...
            from 表 (基本表,子查詢,檢視)  表別名  ( left |inner join ) 表2 on 表1.欄位 = 表2.欄位2...
            where  欄位 ( 關係 (any | all) | between ..and | like | in | )  
            and | or  條件2 
            order by 列1,列2 (asc | desc)
            group by 列1,列2
            having 分組以後條件


            select 查表-----------------------
                單表查詢----
                    select * from 表名;
                        查表裡面所有資料
                    select name,id from student where id=12;
                        查表裡面所有id為12的資料,結果要顯示名字和id;
                    select * from student where sname like '%lishi%';
                        模糊查詢,student裡面sname帶有lishi的全都顯示到結果
                    select sum(sage) from student;#求總數  
                    select avg(sage) from student;#平均值

                    select *from student order by sdate asc;
                        #按sdate查詢出整個表的結果,然後進行升序  預設結果為升序排列
                    select *from student order by sdate desc;#
                        #按sdate查詢出整個表的結果,然後進行降序 

                    select scid,avg(sage) avg from student group by scid;
                    #先按scid分組,再進行取其年齡平均數,把scid和sage顯示到結果裡面
                    select sid,sname from student 
                        where (sname like '李四%' and sid=2) or sid=9 order by sdate desc;    

                    從student 查詢 id和name  條件是  名字裡面有包含  李四的和id為2的,
                        或者id為9的,以date的形式降序排列

-----------------多表查詢--------------------
                外連線------------
                    select cname,sname from student,classes;
                        查詢兩個表,兩個表之間用逗號隔開
                    select scid,sname,cname from student,classes where scid=cid;    
                        查詢兩個表,條件是第一個表的id=第二個表的id;
                還有取別名,如果取了別名的話,一定要使用別名  

                左連線 left join用來查詢左側表的全部記錄及右測表的連線欄位完全相同於左側表的記錄
                    select cname,count(scid) sum from classes 
                                left join student on student.scid=classes.cid group by cname;
                    查詢calsses 和student裡面的名字和所有id的,如果是左id=右id的話,把左邊名字都列出來,
                    右邊如果條件吻合的話也列出來,排序cname分幾個小組

        Group By語句從英文的字面意義上理解就是“根據(by)一定的規則進行分組(Group)”。
                    它的作用是通過一定的規則將一個數據集劃分成若干個小的區域


--------------------自連線  樹形結構,存到二維表中 自己先複製一份,
                    select sname,cname from category c1,category c2 where c1.pid=c2.cid;

    -----------------------子查詢--------------
                    概念就是把查詢出來的結果,做為一張表來用,所以有時候select查詢語句會寫的很長

                any跟all的區別
                    any: 大於的話,就是比最小值要大,大於的話,就是比最小值要小
                    all:  取出最大值 跟前者比較