Mysql學習筆記

MySql關聯查詢

1、交叉連接(笛卡爾積)–cross join

語法:select * from t1 cross join t2 [on][where];

用法:如果t1和t2都有10條數據,則查詢結果爲10*10=100條數據。

2、內連接–inner join

語法:select * from t1 (inner) join t2 [on];

用法:inner可以省略,不加on時用法和交叉連接一樣,加on過後對數據進行篩選。內連接是取左連接和右連接的交集。

內部有聯繫,使用內連接
    格式: [inner] join  ----inner可省
    結果:
        從左表中取出每一條記錄,去右表中與所有的記錄進行匹配;
        匹配必須是某個條件是左表中與右表中相同,纔會保留結果,否則不保留;
    基本語法:
        左表 [inner] join 右表 
            on 左表.字段 = 右表.字段;

        注意事項:
            1、on 表示連接條件;條件字段代表相同的業務含義
                (如 stu.cid 和 cla.id) 
                學生stu表中的班級cid  和 班級cla表中的id


            2、內連接可以沒有連接條件,沒有on之後的內容,
                這時候系統會保留所有結果(笛卡爾集)


            3、內連接可以使用where 代替 on
                通常不用where,因爲where沒有on效率高
                on指匹配到第一條成功的就結束,其他不匹配; 
                若沒有,不進行匹配
                而where會一直匹配,進行判斷    


            4、通常使用字段別名 表別名
                在查詢數據的時候,不同表有同名字段, 
                這時候需要加上表名才能區分,
                而若表名太長,使用表別名
                若不想使用默認的字段名 可以通過[as] 設置字段別名

3、外連接–left/right join on

語法:select * from t1 left/right join t2 [on][where];

用法:左連接以左表爲基準,on對右表進行篩選,沒有數據與之匹配時用null填充。同理,右連接以右表爲基準,on對左邊的表進行篩選,不滿足條件用null填充。where中的條件對所有表進行篩選。

4、自連接查詢

語法:select a.name,b.name from t1 a left join t1 b on a.id=b.id;

用法:參考文章

5、聯合查詢–union

語法:

1、select * from t1 union select * from t2;

2、select * from t1 union all select * from t2;

用法:將多次查詢(多條select語句), 在記錄上進行拼接(字段不會增加),聯合查詢只要求字段一樣,跟數據類型無關。union all:保留所有(不管重複),union:去重(整個重複)默認的。

聯合查詢意義:

  1. 查詢同一張表,但是需求不同: 如查詢學生信息, 男生身高升序, 女生身高降序.
  2. 多表查詢: 多張表的結構是完全一樣的,保存的數據(結構)也是一樣的.

order by在聯合查詢中的使用:

語法:

(select * from t1 where sex=‘男’ order by age limit 99)
union (select * from t1 where sex=‘女’ order by age desc limit 99);

用法:在聯合查詢中: order by不能直接使用,需要對查詢語句使用括號才行;另外,要order by生效: 必須搭配limit: limit使用限定的最大數即可.

6、子查詢

兩篇很詳細的文章:

MySQL裏面的子查詢

重點這篇:mysql的查詢、子查詢及連接查詢

Mysql更新

1、update set

1、update set與where搭配使用,變更某些記錄:
update + 表名 + set + 變更後的信息 + where子句;

例:update t1 set name='cdn',age='19' where id=5;

注意:如果變更信息後面沒有加where子句指定其變更的內容,
那麼update set語句就會把同字段中的所有信息全部更新,修改。
2、limit在update中的使用
mysql的update語句只支持更新前多少行,不支持從某行到另一行。

例:
(1) update t1 set name='cdn',age='20' order by id limit 10;
這條語句沒有問題,按id的升序更新前10條數據中的name和age。

(2) update t1 set name='cdn',age='20' order by id desc limit 10,10;
這條語句有問題,不能這樣寫,該語句的作用是按id的降序更新從第10條開始10條數據中的name和age。

(3) update t1 set name='cdn',age='20' where id in(select id from (select * from t1 order by id desc limit 10,10)as t);
這條語句是正確的,採用子查詢的方式,能實現更新表中根據id降序排序的第10條到第20條數據的name和age的內容。

2、alter

1、alter語句也具有修改的功能。而且alter的功能遠遠要比update set多,它不僅僅可以修改記錄,還可以修改表名和字段屬性。

2、修改表名
alter table+舊錶名+rename to 新表名;
例:alter table t1 rename to t2;
將t1表的名字改爲t2.

3、修改字段名及屬性
alter table + 表名 + change +原字段名+新字段名+TYPE(字符長度);
例:alter table t1 change id uid int(10);
將t1表中的id字段改名爲uid字段,類型爲int,長度爲10.

4、修改字段屬性
alter table + 表名 + change +原字段名+原字段名+TYPE(字符長度);
例:alter table t1 change id id varchar(10);
將t1表中的id字段改爲varchar類型.

5、將字段改爲表的主鍵
alter table t1 change id id int primary key;

Mysql動態創建表

<update id="createGroupTable" parameterType="String">
        create table ${tableName}(
        message_id int(32) not null,
        sender_id int(32) not null,
        g_message varchar(10000) default null,
        g_time date not null,
        week_message varchar(10000) default null,
        read_user varchar(1024) default null,
        PRIMARY KEY (message_id)//主鍵
        )ENGINE=InnoDB DEFAULT CHARSET=utf8//utf8編碼
    </update>

Mysql表字段的增刪改

增:alter table 表名 add 字段名 數據類型(大小);
刪:alter table 表名 drop 字段名;
改:alter table 表名 modify 字段名 數據類型(大小);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章