MySQL自學筆記5

2021-12-30 12:40:24 字數 3493 閱讀 2001

使用mysql 5.5以及mysql自帶命令客戶端

union:聯合,其作用是將2次或者多次查詢結果合併起來

* 要求:兩次的查詢的列數一致。推薦是查詢的每一列相對應的列型別也是一樣的

* 查詢可以來自多張表,但是如果多次sql語句取出來的列名如果不一樣的話,此時以第乙個sql的列名為準

* 不同sql語句中取出來的行如果完全相同的話(即該行的每乙個列的值都一樣),此時將相同的行合併(即去重複)。如果不想要合併的話,可以使用關鍵字all來指定,即使用union all

* 如果句子中有用到order by、limit,那就應該將不同sql語句放在括號( )裡面。推薦將order by、limit放到左右子句之後,這樣子對最終的合併結果進行排序。

*在子句中 order by配合limit使用才有意義!

集合的乘積是笛卡爾積,就是兩個集合的完全組合。

例1:a集合有m個不同的元素,b集合有n個不同的元素。那麼a集合與b集合的乘積,即a*b,有m*n個元素。

例2:表a有3行,表b有6行,則表相乘有 3*6 = 18 行

左連線典型的語法:

select col1, col2, col3,... from

table1 left join table2 on table1 cola = table2 colb

where ...右連線典型的語法

select col1, col2, col3,... from

table1 right join table2 on table1 cola = table2 colb

where ...內連線典型的語法

select col1, col2, col3,... from

table1 inner join table2 on table1 cola = table2 colb

where ...左右連線中以左表為準,向右表去匹配資料,如果沒有找到匹配的,用null補齊 左右連線可以相互轉化,可以把右連線轉化為左連線來使用。推薦使用左連線,相容性好一點

可以如下理解:

a表在b表的左邊:tablea left join tableb b表在a表的右邊:tableb right join tablea

內連線:表示左右表中都有的資料,即不要左右表中含有null的那一部分。可以這樣子理解:內連線就是左右連線的交集

注意一點:mysql目前沒有外連線這一說法,也不能直接求得左右連線的並集。可以使用union來實現檢視:由查詢結果形成的一張虛擬表

當乙個查詢結果出現非常頻繁時,並且拿該查詢結果進行子查詢出現的非常頻繁,此時可以將乙個查詢結果儲存為一張虛擬的表,來供其他查詢用。

1. 可以簡化查詢

2. 可以進行許可權的控制。比如說將表的許可權封閉,但是開發相應的檢視許可權,檢視中只開放部分的資料

3. 大資料分表。比如當一張表的行數超過100萬行,就會變慢,此時一種有效的方法就是將一張表拆開為多張表來儲存。例如分為t1、t2、t3、t4,然後

mysql

create view tablenew as select from t1

union select from t2

union select from t3

union select from t4;

* 分表的操作比較多,通常可以使用取模來進行!

建立:create view viewname as select語句 刪除:drop view 修改:alter view as select語句檢視是表的查詢結果,當表的資料變化時,會影響檢視的結果 檢視改變也會影響表的資料,但是檢視不總是能夠修改的。

檢視中資料和表中資料一一對應時,而且還有注意如果是將資料插入(insert操作)檢視中,該資料必須包含表中沒有預設值的列的資料,這樣子才可以檢視有三種algorithm:merge、temptable、undefined

* merge:當引用檢視時,引用檢視的語句與定義檢視的語句合併。即意味著檢視在這裡只是乙個語句規則,當查詢檢視時,把查詢檢視的語句和建立時的語句等合併、分析,形成乙個sql語句。

* 比如:

mysql

create altorethm = merge view g1 as select goods_id, cat_id, goods_name, shop_price from goods order by cat_id asc, shop_price desc;

mysql

select * from g1 group by cat_id;

* 最終執行的語句:

mysql

select goods_id, cat_id, goods_name, shop_price from goods group by cat_id order by cat_id asc, shop_price desc;

* temptable:根據建立語句瞬間建立一張臨時表,然後查詢檢視的語句從該臨時表中進行查詢

* 如上面merge中的例子,,將altorethm = merge改為altorethm = temptable最終執行時就是瞬間建立一張名為g1的臨時表,然後從中進行查詢

undefined:表示未定義,altorethm = undefined,表示自動讓系統選擇一種檢視的algorithmmysql字符集設定靈活,可以設定:

1. 伺服器預設字符集

2. 資料庫預設字符集

3. 表預設字符集

4. 列缺省字符集

* 如果某一級沒有指定字符集,則繼承上一級的字符集

例如宣告表字符集為utf8:

create table tablename(

列宣告)charset utf8;上述例子中,儲存在表中的資料最終採用的字符集為utf8;

客戶端、轉換器、伺服器三種間的編碼情況:

告訴伺服器,傳送給伺服器的資料編碼:set character_set_client = gbk/utf8; 告訴轉換器,轉換為什麼型別的編碼:set character_set_connection = gbk/utf8; 查詢結果採用的編碼:set character_set_result = gbk/utf8; 如果三種都為一樣的字符集n,則可以寫為set names n;,set names gbk; 出現亂碼情況:client宣告與實事不符、results與客戶端頁面不相符 出現資料丟失情況:connection使用的字符集比伺服器使用的字符集小時,會出現資料丟失校對集指的是字符集的排序規律。一種字符集可以有乙個或者多個排序規則。

以utf8為例,預設是使用utf8_general_ci規則進行,但是也可以宣告為安裝其他規則,比如:utf8_bin

* 例如宣告校對集為utf8_bin:

mysql

create table tablename(

列宣告) charset utf8 collate utf8_bin;

# 注意,這裡面宣告的校對集必須是合法的校對集

* 檢視校對集:show collection;

* 檢視字符集:show character set;

* 檢視utf8下有那些校對集:show collection like 'utf8%';

lua 自學筆記5

12 所有的關係操作符的運算結果都是true或false 注意 2 15 true 2 15 false 這是按順序比較,它會先比較 2 和 1 13 邏輯操作符 and or not 都將false和nil視為假 1 and or都是短路求值 print 4 and 5 5 and如果第乙個運算元...

QT自學筆記(5)

前言 這一節我們學習下繼續運用訊號與槽機制的應用,也就是核取方塊的應用。就是可以勾選的框,我們在裝軟體時就經常遇到,就是問你是否同意這個協議 在qt中核取方塊的英文是checkbox。1.statechanged int 這個是signal函式,即打勾或不打勾的狀態發生改變的訊號 2.ischeck...

HTML5自學筆記

內容區 content 元素中的所有子元素和文字內容都在內容區中排列。內容區的大小由width和height兩個屬性設定。邊框 border 邊框屬於盒子的邊緣,邊框裡面屬於盒子的內容,邊框外面屬於盒子的外部。要設定邊框,需要至少設定三個樣式 邊框的大小會影響盒子的大小。盒子大小 content大小...