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:去重(整個重複)默認的。
聯合查詢意義:
- 查詢同一張表,但是需求不同: 如查詢學生信息, 男生身高升序, 女生身高降序.
- 多表查詢: 多張表的結構是完全一樣的,保存的數據(結構)也是一樣的.
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更新
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 字段名 數據類型(大小);