? 任意兩行都不具有相同的主鍵值;
? 每個(gè)行都必須具有一個(gè)主鍵值(主鍵列不允許NULL值)
在使用多列作為主鍵時(shí),上述條件必須應(yīng)用到構(gòu)成主鍵的所有列,所有列值的組合必須是唯一的(但單個(gè)列的值可以不唯一)。
幾乎所有重要的DBMS都支持SQL
創(chuàng)建索引時(shí),你需要確保該索引是應(yīng)用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
實(shí)際上,索引也是一張表,該表保存了主鍵與索引字段,并指向?qū)嶓w表的記錄。
上面都在說使用索引的好處,但過多的使用索引將會(huì)造成濫用。因此索引也會(huì)有它的缺點(diǎn):雖然索引大大提高了查詢速度,同時(shí)卻會(huì)降低更新表的速度,如對(duì)表進(jìn)行INSERT、UPDATE和DELETE。因?yàn)楦卤頃r(shí),MySQL不僅要保存數(shù)據(jù),還要保存一下索引文件。
建立索引會(huì)占用磁盤空間的索引文件。
MySQL Query Browser為一個(gè)圖形交互客戶機(jī),用來編寫和執(zhí)行MySQL命令。
MySQL Administrator(MySQL管理器)是一個(gè)圖形交互客戶機(jī),用來簡(jiǎn)化MySQL服務(wù)器的管理。http://dev.mysql.com/downloads/
必須先使用USE打開數(shù)據(jù)庫,才能讀取其中的數(shù)據(jù)。
SHOW DATABASES;返回可用數(shù)據(jù)庫的一個(gè)列表。
SHOW TABLES;返回當(dāng)前選擇的數(shù)據(jù)庫內(nèi)可用表的列表。
show columns from auth_user;它對(duì)每個(gè)字段返回一行,行中包含字段名、數(shù)據(jù)類型、是否允許NULL、鍵信息、默認(rèn)值以及其他信息
mysql> show columns from auth_user; = describe auth_user;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| password | varchar(128) | NO | | NULL | |
| last_login | datetime(6) | YES | | NULL | |
| is_superuser | tinyint(1) | NO | | NULL | |
| username | varchar(150) | NO | UNI | NULL | |
| first_name | varchar(30) | NO | | NULL | |
| last_name | varchar(150) | NO | | NULL | |
| email | varchar(254) | NO | | NULL | |
| is_staff | tinyint(1) | NO | | NULL | |
| is_active | tinyint(1) | NO | | NULL | |
| date_joined | datetime(6) | NO | | NULL | |
+--------------+--------------+------+-----+---------+----------------+
自動(dòng)增量auto_increment: 某些表列需要唯一值。
如果需要它,則必須在用CREATE語句創(chuàng)建表時(shí)把它作為表定義的組成部分。
? SHOW STATUS,用于顯示廣泛的服務(wù)器狀態(tài)信息;
| Innodb_buffer_pool_dump_status | Dumping of buffer pool not started |
| Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 200923 8:09:34 |
| Innodb_buffer_pool_resize_status | |
| Innodb_buffer_pool_pages_data | 550 |
| Innodb_buffer_pool_bytes_data | 9011200 |
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_bytes_dirty | 0 |
| Innodb_buffer_pool_pages_flushed | 42 |
| Innodb_buffer_pool_pages_free | 7642 |
| Innodb_buffer_pool_pages_misc | 0 |
| Innodb_buffer_pool_pages_total | 8192 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 0 |
| Innodb_buffer_pool_read_ahead_evicted | 0 |
| Innodb_buffer_pool_read_requests | 18126 |
| Innodb_buffer_pool_reads | 516 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 365 |
| Innodb_data_fsyncs | 7 |
| Innodb_data_pending_fsyncs | 0 |
| Innodb_data_pending_reads | 0 |
| Innodb_data_pending_writes | 0 |
| Innodb_data_read | 8851968 |
| Innodb_data_reads | 705 |
| Innodb_data_writes | 59 |
| Innodb_data_written | 722944 |
| Innodb_dblwr_pages_written | 2 |
| Innodb_dblwr_writes | 1 |
| Innodb_log_waits | 0 |
| Innodb_log_write_requests | 0 |
? SHOW CREATE DATABASE和SHOW CREATE TABLE,分別用來顯示創(chuàng)建特定數(shù)據(jù)庫或表的MySQL語句;
? SHOW GRANTS,用來顯示授予用戶(所有用戶或特定用戶)的安全權(quán)限;
? SHOW ERRORS和SHOW WARNINGS,用來顯示服務(wù)器錯(cuò)誤或警告消息。
show variables like '%wait_timeout%';
使用set global slow_query_log=1開啟了慢查詢?nèi)罩局粚?duì)當(dāng)前數(shù)據(jù)庫生效,如果MySQL重啟后則會(huì)失效。如果要永久生效,就必須修改配置文件my.cnf(其它系統(tǒng)變量也是如此)。
mysql> show variables like '%query_log%';
+------------------------------+--------------------------------------+
| Variable_name | Value |
+------------------------------+--------------------------------------+
| binlog_rows_query_log_events | OFF |
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/9610e399939d-slow.log |
+------------------------------+--------------------------------------+
set global slow_query_log=1;
mysql> show variables like '%query_log%';
+------------------------------+--------------------------------------+
| Variable_name | Value |
+------------------------------+--------------------------------------+
| binlog_rows_query_log_events | OFF |
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/9610e399939d-slow.log |
+------------------------------+--------------------------------------+
- 檢索數(shù)據(jù)
select id ,course_id,name from ss_c_lesson;展示字段
未排序數(shù)據(jù) 如果讀者自己試驗(yàn)這個(gè)查詢,可能會(huì)發(fā)現(xiàn)顯示輸出的數(shù)據(jù)順序與這里的不同。出現(xiàn)這種情況很正常。如果沒有明確排序查詢結(jié)果(下一章介紹),則返回的數(shù)據(jù)的順序沒有特殊意義。返回?cái)?shù)據(jù)的順序可能是數(shù)據(jù)被添加到表中的順序,也可能不是。只要返回相同數(shù)目的行,就是正常的。
SQL語句不區(qū)分大小寫,在處理SQL語句時(shí),其中所有空格都被忽略。
使用通配符 一般,除非你確實(shí)需要表中的每個(gè)列,否則最好別使用*通配符。雖然使用通配符可能會(huì)使你自己省事,不用明確列出所需列,但檢索不需要的列通常會(huì)降低檢索和應(yīng)用程序的性能。
關(guān)鍵字指示MySQL只返回不同的值。,如果使用DISTINCT關(guān)鍵字,它必須直接放在列名的前面。select distinct delete_state from ss_c_lesson;
如果給出SELECT DISTINCT vend_id, prod_price,除非指定的兩個(gè)列都不同,否則所有行都將被檢索出來。
| 1 | 1851 |
| 1 | 1852 |
| 0 | 1853 |
| 1 | 1853 |
| 1 | 1854 |
| 0 | 1855 |
| 1 | 1855 |
| 1 | 1856 |
| 1 | 1857 |
| 1 | 1858 |
| 1 | 1859 |
| 1 | 1860 |
| 1 | 1861 |
| 1 | 1862 |
| 1 | 1863 |
| 1 | 1864 |
| 1 | 1865 |
| 1 | 1866 |
| 0 | 1867 |
| 1 | 1867 |
| 1 | 1868 |
| 1 | 1869 |
| 1 | 1870 |
| 1 | 1871 |
| 1 | 1872 |
| 1 | 1873 |
| 1 | 1874 |
mysql> select distinct delete_state from ss_c_lesson;
+--------------+
| delete_state |
+--------------+
| 1 |
| 0 |
+--------------+
LIMIT 5, 5指示MySQL返回從行5開始的5行。第一個(gè)數(shù)為開始位置,第二個(gè)數(shù)為要檢索的行數(shù)。
行0 檢索出來的第一行為行0而不是行1。因此,LIMIT 1, 1將檢索出第二行而不是第一行。
在行數(shù)不夠時(shí) LIMIT中指定要檢索的行數(shù)為檢索的最大行數(shù)。
LIMIT 4 OFFSET 3意為從行3開始取4行,就像LIMIT 3, 4一樣。
mysql> select distinct delete_state from ss_c_lesson;
+--------------+
| delete_state |
+--------------+
| 1 |
| 0 |
+--------------+
2 行于數(shù)據(jù)集 (0.05 秒)
mysql> select distinct delete_state from ss_c_lesson limit 1,1;
+--------------+
| delete_state |
+--------------+
| 0 |
+--------------+
1 行于數(shù)據(jù)集 (0.05 秒)
mysql> select distinct delete_state from ss_c_lesson limit 1,5;
+--------------+
| delete_state |
+--------------+
| 0 |
+--------------+
1 行于數(shù)據(jù)集 (0.05 秒)
mysql> select distinct delete_state from ss_c_lesson limit 5 offset 0;
+--------------+
| delete_state |
+--------------+
| 1 |
| 0 |
+--------------+
mysql> select distinct content_faculty.team_id from shuangshi.content_faculty;
+---------+
| team_id |
+---------+
| 1 |
| 2 |
+---------+
2 行于數(shù)據(jù)集 (0.03 秒)
- 排序檢索數(shù)據(jù)
mysql> select half_size_pic_id from content_faculty order by half_size_pic_id;
+------------------+
| half_size_pic_id |
+------------------+
| 267 |
| 270 |
| 271 |
| 275 |
| 277 |
| 279 |
| 282 |
| 284 |
| 285 |
| 288 |
| 289 |
| 292 |
| 294 |
| 296 |
| 297 |
| 300 |
| 301 |
+------------------+
按多個(gè)列排序時(shí),排序完全按所規(guī)定的順序進(jìn)行。換句話說,對(duì)于上述例子中的輸出,僅在多個(gè)行具有相同的prod_price值時(shí)才對(duì)產(chǎn)品按prod_name進(jìn)行排序。如果prod_price列中所有的值都是唯一的,則不會(huì)按prod_name排序。
與DESC相反的關(guān)鍵字是ASC(ASCENDING),在升序排序時(shí)可以指定它。但實(shí)際上,ASC沒有多大用處,因?yàn)樯蚴悄J(rèn)的
為了進(jìn)行降序排序,必須指定DESC關(guān)鍵字。
-
過濾數(shù)據(jù):數(shù)據(jù)也可以在應(yīng)用層過濾,服務(wù)器不得不通過網(wǎng)絡(luò)發(fā)送多余的數(shù)據(jù),這將導(dǎo)致網(wǎng)絡(luò)帶寬的浪費(fèi)。
select name from usystem_user_info where sex = 0 order by user_id; where必須位于order by的前面select name from usystem_user_info where user_id < 19 order by name DESC;
!= 和 <>都是不等于 BETWEEN關(guān)鍵字
MySQL在執(zhí)行匹配時(shí)默認(rèn)不區(qū)分大小寫,所以fuses與Fuses匹配。
如果將值與串類型的列進(jìn)行比較,則需要限定引號(hào)。用來與數(shù)值列進(jìn)行比較的值不用引號(hào)。
校驗(yàn)空值select name from usystem_user_info where institution_id is null;
SQL(像多數(shù)語言一樣)在處理OR操作符前,優(yōu)先處理AND操作符
優(yōu)先處理and
為什么要使用IN操作符?其優(yōu)點(diǎn)具體如下。? 在使用長(zhǎng)的合法選項(xiàng)清單時(shí),IN操作符的語法更清楚且更直觀。? 在使用IN時(shí),計(jì)算的次序更容易管理(因?yàn)槭褂玫牟僮鞣伲? IN操作符一般比OR操作符清單執(zhí)行更快。? IN的最大優(yōu)點(diǎn)是可以包含其他SELECT語句,使得能夠更動(dòng)態(tài)地建立WHERE子句。第14章將對(duì)此進(jìn)行詳細(xì)介紹。
WHERE子句中的NOT操作符有且只有一個(gè)功能,那就是否定它之后所跟的任何條件。
select * from food_subsidy where id not in (1002,1003) order by name; - 通配符過濾
區(qū)分大小寫 根據(jù)MySQL的配置方式,搜索可以是區(qū)分大小寫的。如果區(qū)分大小寫,'jet%’與JetPack 1000將不匹配。
即使是WHEREprod_name LIKE '%’也不能匹配用值NULL作為產(chǎn)品名的行。
下劃線的用途與%一樣,但下劃線只匹配單個(gè)字符而不是多個(gè)字符。與%能匹配0個(gè)字符不一樣,_總是匹配一個(gè)字符,不能多也不能少,通配符搜索的處理一般要比前面討論的其他搜索所花時(shí)間更長(zhǎng)。
? 不要過度使用通配符。如果其他操作符能達(dá)到相同的目的,應(yīng)該使用其他操作符。? 在確實(shí)需要使用通配符時(shí),除非絕對(duì)有必要,否則不要把它們用在搜索模式的開始處。把通配符置于搜索模式的開始處,搜索起來是最慢的。? 仔細(xì)注意通配符的位置。如果放錯(cuò)地方,可能不會(huì)返回想要的數(shù)據(jù)。
select name from usystem_user_info where name REGEXP '蒙' ; 包含蒙的
like和REGEXP區(qū)別
mysql> select name from usystem_user_info where name REGEXP 'sakur' ;
+--------+
| name |
+--------+
| sakura |
| sakura |
+--------+
2 行于數(shù)據(jù)集 (0.02 秒)
mysql> select name from usystem_user_info where name like 'sakur' ;
空的數(shù)據(jù)集 (0.01 秒)
為區(qū)分大小寫,可使用BINARY關(guān)鍵字,如WHERE prod_name REGEXPBINARY 'JetPack .000'。
兩個(gè)以上的OR條件 可以給出兩個(gè)以上的OR條件。例如,'1000 | 2000 | 3000’將匹配1000或2000或3000。
mysql> select name from usystem_user_info where name REGEXP 'sakur|蒙' ;
+-----------+
| name |
+-----------+
| 王蒙 |
| 李蒙 |
| 蒙彩結(jié) |
| 王蒙 |
| 胡蒙 |
| sakura |
| sakura |
| 惠蒙蒙 |
+-----------+
8 行于數(shù)據(jù)集 (0.03 秒)
集合可用來定義要匹配的一個(gè)或多個(gè)字符。例如,下面的集合將匹配數(shù)字0到9:[0123456789]為簡(jiǎn)化這種類型的集合,可使用-來定義一個(gè)范圍。下面的式子功能上等同于上述數(shù)字列表:[0-9]范圍不限于完整的集合,[1-3]和[6-9]也是合法的范圍。此外,范圍不一定只是數(shù)值的,[a-z]匹配任意字母字符。
為了匹配特殊字符,必須用\為前導(dǎo)。\-表示查找-, \.表示查找.
\(sakura?[0-9]\) [[:digit:]]{3} ^[0-9\.]
LIKE和REGEXP的不同在于,LIKE匹配整個(gè)串而REGEXP匹配子串
- 創(chuàng)建計(jì)算字段
我們需要直接從數(shù)據(jù)庫中檢索出轉(zhuǎn)換、計(jì)算或格式化過的數(shù)據(jù);而不是檢索出數(shù)據(jù),然后再在客戶機(jī)應(yīng)用程序或報(bào)告程序中重新格式化。計(jì)算字段并不實(shí)際存在于數(shù)據(jù)庫表中。計(jì)算字段是運(yùn)行時(shí)在SELECT語句內(nèi)創(chuàng)建的。
Concat()
mysql> select concat (name,'(',polyv_num,')') from usystem_user_info where id < 10 order by id;
+---------------------------------+
| concat (name,'(',polyv_num,')') |
+---------------------------------+
| 胡軍() |
| 陳大千(557982) |
| 李明雪() |
| A組織員工() |
| B組織員工() |
| 唐博() |
| 邢華洋() |
| 張燕() |
+---------------------------------+
8 行于數(shù)據(jù)集 (0.01 秒)
Trim函數(shù) MySQL除了支持RTrim()(正如剛才所見,它去掉串右邊的空格),還支持LTrim()(去掉串左邊的空格)以及Trim()(去掉串左右兩邊的空格)。
mysql> select concat (name,'(',Trim(polyv_num),')') from usystem_user_info where id < 10 order by id;
+---------------------------------------+
| concat (name,'(',Trim(polyv_num),')') |
+---------------------------------------+
| 胡軍() |
| 陳大千(557982) |
| 李明雪() |
| A組織員工() |
| B組織員工() |
| 唐博() |
| 邢華洋() |
| 張燕() |
+---------------------------------------+
8 行于數(shù)據(jù)集 (0.01 秒)
AS
mysql> select concat (name,'(',Trim(polyv_num),')') as sakura from usystem_user_info where id < 10 order by id;
別名的其他用途 別名還有其他用途。常見的用途包括在實(shí)際的表列名包含不符合規(guī)定的字符(如空格)時(shí)重新命名它,在原來的名字含混或容易誤解時(shí)擴(kuò)充它,等等。
使用計(jì)算字段
mysql> select sakura from (select concat (name,'(',Trim(polyv_num),')') as sakura from usystem_user_info where id < 10 order by id)mm ;
+-------------------+
| sakura |
+-------------------+
| 胡軍() |
| 陳大千(557982) |
| 李明雪() |
| A組織員工() |
| B組織員工() |
| 唐博() |
| 邢華洋() |
| 張燕() |
+-------------------+
8 行于數(shù)據(jù)集 (0.02 秒)
計(jì)算
mysql> select id,user_id*id as all_id from usystem_user_info where id<10;
+----+--------+
| id | all_id |
+----+--------+
| 2 | 4 |
| 3 | 9 |
| 4 | 16 |
| 5 | 25 |
| 6 | 30 |
| 7 | 42 |
| 8 | 56 |
| 9 | 72 |
+----+--------+
8 行于數(shù)據(jù)集 (0.07 秒)
時(shí)間
mysql> select NOW();
+---------------------+
| NOW() |
+---------------------+
| 2020-10-22 17:57:06 |
+---------------------+
1 行于數(shù)據(jù)集 (0.02 秒)
datetime這種類型存儲(chǔ)日期及時(shí)間值,樣例表中的值全都具有時(shí)間值00:00:00
select start_time,id,name from ss_c_lesson where Year(real_start_time)=2020 and month(real_start_time)=01;
- 匯總數(shù)據(jù)
只用于單個(gè)列 AVG()只能用來確定特定數(shù)值列的平均值,而且列名必須作為函數(shù)參數(shù)給出。為了獲得多個(gè)列的平均值,必須使用多個(gè)AVG()函數(shù)。
計(jì)數(shù)
mysql> select count(*) from ss_c_lesson;
+----------+
| count(*) |
+----------+
| 48808 |
+----------+
1 行于數(shù)據(jù)集 (0.03 秒)
mysql> select count(real_start_time) from ss_c_lesson;
+------------------------+
| count(real_start_time) |
+------------------------+
| 20857 |
+------------------------+
1 行于數(shù)據(jù)集 (0.03 秒)
NULL值 如果指定列名,則指定列的值為空的行被COUNT()函數(shù)忽略,但如果COUNT()函數(shù)中用的是星號(hào)(*),則不忽略。
NULL值 AVG()函數(shù)忽略列值為NULL的行。
不重復(fù)行
mysql> select avg(distinct id) from ss_c_lesson;
+------------------+
| avg(distinct id) |
+------------------+
| 26770.8554 |
+------------------+
1 行于數(shù)據(jù)集 (0.06 秒)
聚集函數(shù)用來匯總數(shù)據(jù)。MySQL支持一系列聚集函數(shù),可以用多種方法使用它們以返回所需的結(jié)果。這些函數(shù)是高效設(shè)計(jì)的,它們返回結(jié)果一般比你在自己的客戶機(jī)應(yīng)用程序中計(jì)算要快得多。
- 分組數(shù)據(jù)
mysql> select name, count(*) as num_prods from content_special_subject group by name;
+--------+-----------+
| name | num_prods |
+--------+-----------+
| | 1 |
| kkk | 1 |
| sakura | 4 |
+--------+-----------+
3 行于數(shù)據(jù)集 (0.08 秒)
GROUP BY子句必須出現(xiàn)在WHERE子句之后,ORDER BY子句之前。如果分組列中具有NULL值,則NULL將作為一個(gè)分組返回。如果列中有多行NULL值,它們將分為一組。
with rollup關(guān)鍵字會(huì)在所有記錄的最后加上一條記錄,該記錄是上面所有記錄的總和
mysql> select name,count(*) as ccount from content_special_subject group by name having count(*)>2;
+--------+--------+
| name | ccount |
+--------+--------+
| sakura | 4 |
+--------+--------+
1 行于數(shù)據(jù)集 (0.01 秒)
mysql> select name,count(*) as ccount from content_special_subject group by name having ccount>2;
+--------+--------+
| name | ccount |
+--------+--------+
| sakura | 4 |
+--------+--------+
1 行于數(shù)據(jù)集 (0.02 秒)

- 使用子查詢
select name , course_id from ss_c_lesson where course_id in ( select id from ss_c_course where name like '%狄仁杰%');
SELECT name, course_id, ( select count(*) FROM ss_c_course WHERE ss_c_lesson.course_id = ss_c_course.id) AS sakura FROM ss_c_lesson;
子表里面查詢需要table.name 始終需要from全所有引用到的表
使用子查詢并不總是執(zhí)行這種類型的數(shù)據(jù)檢索的最有效的方法。更多的論述,請(qǐng)參閱第15章
- 聯(lián)結(jié)表
外鍵為某個(gè)表中的一列,它包含另一個(gè)表的主鍵值,定義了兩個(gè)表之間的關(guān)系。
完全限定列名 在引用的列可能出現(xiàn)二義性時(shí),必須使用完全限定列名(用一個(gè)點(diǎn)分隔的表名和列名)。
mysql> select ss_c_lesson.name , count(*) from ss_c_lesson,ss_c_course where ss_c_lesson.course_id = ss_c_course.id;
+-----------+----------+
| name | count(*) |
+-----------+----------+
| 作文課 | 5354 |
+-----------+----------+
1 行于數(shù)據(jù)集 (0.13 秒)
mysql> select ss_c_lesson.name , count(*) from ss_c_lesson inner join ss_c_course on ss_c_lesson.course_id = ss_c_course.id;
+-----------+----------+
| name | count(*) |
+-----------+----------+
| 作文課 | 5354 |
+-----------+----------+
1 行于數(shù)據(jù)集 (0.05 秒)
交叉內(nèi)聯(lián)結(jié)果一致,聯(lián)結(jié)的表越多,性能下降越厲害。
- 創(chuàng)建高級(jí)聯(lián)結(jié)join
mysql> select p.id,name from content_special_subject_pic as p , content_special_subject_component as s where s.subject_id = p.subject_id;
+----+--------+
| id | name |
+----+--------+
| 1 | sdfds |
| 2 | sakura |
| 1 | sdfds |
| 2 | sakura |
+----+--------+
4 行于數(shù)據(jù)集 (0.17 秒)
mysql> select distinct p.id,name from content_special_subject_pic as p , content_special_subject_component as s where s.subject_id = p.subject_id;
+----+--------+
| id | name |
+----+--------+
| 1 | sdfds |
| 2 | sakura |
+----+--------+
2 行于數(shù)據(jù)集 (0.08 秒)
mysql> select name ,p.url from content_special_subject_pic as p left outer join content_special_subject_component as s on p.subject_id = s.subject_id;
+--------+-----+
| name | url |
+--------+-----+
| sdfds | ddd |
| sakura | |
| sdfds | ddd |
| sakura | |
| www | |
+--------+-----+
5 行于數(shù)據(jù)集 (0.02 秒)
mysql> select * from content_special_subject_pic as p , content_special_subject_component as s where s.subject_id = p.subject_id;
+----+--------+-----+--------+--------------+------------+-------+---------------+-------+------+---------------------------------------------+--------+-----------------+
| id | name | url | pic_id | delete_state | subject_id | id(2) | subject_id(2) | order | type | coordinate | url(2) | delete_state(2) |
+----+--------+-----+--------+--------------+------------+-------+---------------+-------+------+---------------------------------------------+--------+-----------------+
| 1 | sdfds | ddd | 193 | 0 | 2 | 2 | 2 | 0 | 2 | {"top":45,"left":80,"right":96,"below":87} | | 0 |
| 1 | sdfds | ddd | 193 | 0 | 2 | 3 | 2 | 0 | 2 | {"top":45,"left":80,"weight":96,"hight":87} | rrrr | 0 |
| 2 | sakura | | 194 | 0 | 2 | 2 | 2 | 0 | 2 | {"top":45,"left":80,"right":96,"below":87} | | 0 |
| 2 | sakura | | 194 | 0 | 2 | 3 | 2 | 0 | 2 | {"top":45,"left":80,"weight":96,"hight":87} | rrrr | 0 |
+----+--------+-----+--------+--------------+------------+-------+---------------+-------+------+---------------------------------------------+--------+-----------------+
4 行于數(shù)據(jù)集 (0.09 秒)
不確定是否重復(fù)數(shù)據(jù)還是語句有問題就select*全部打印出來
使用LEFT OUTER JOIN從FROM子句的左邊表中選擇所有行,外部聯(lián)結(jié)的類型 存在兩種基本的外部聯(lián)結(jié)形式:左外部聯(lián)結(jié)和右外部聯(lián)結(jié)。它們之間的唯一差別是所關(guān)聯(lián)的表的順序不同。換句話說,左外部聯(lián)結(jié)可通過顛倒FROM或WHERE子句中表的順序轉(zhuǎn)換為右外部聯(lián)結(jié)。因此,兩種類型的外部聯(lián)結(jié)可互換使用,而究竟使用哪一種純粹是根據(jù)方便而定。
- 聯(lián)合查詢union
UNION必須由兩條或兩條以上的SELECT語句組成,語句之間用關(guān)鍵字UNION分隔(因此,如果組合4條SELECT語句,將要使用3個(gè)UNION關(guān)鍵字)
union會(huì)去重 union all不會(huì)
mysql> select * from content_special_subject_pic group by subject_id UNION select * from content_special_subject_pic where subject_id = 2;
+----+--------+-----+--------+--------------+------------+
| id | name | url | pic_id | delete_state | subject_id |
+----+--------+-----+--------+--------------+------------+
| 1 | sdfds | ddd | 193 | 0 | 2 |
| 3 | www | | 0 | 0 | 30 |
| 2 | sakura | | 194 | 0 | 2 |
+----+--------+-----+--------+--------------+------------+
3 行于數(shù)據(jù)集 (0.12 秒)
mysql> select * from content_special_subject_pic group by subject_id UNION all select * from content_special_subject_pic where subject_id = 2;
+----+--------+-----+--------+--------------+------------+
| id | name | url | pic_id | delete_state | subject_id |
+----+--------+-----+--------+--------------+------------+
| 1 | sdfds | ddd | 193 | 0 | 2 |
| 3 | www | | 0 | 0 | 30 |
| 1 | sdfds | ddd | 193 | 0 | 2 |
| 2 | sakura | | 194 | 0 | 2 |
+----+--------+-----+--------+--------------+------------+
4 行于數(shù)據(jù)集 (0.11 秒)
-
全文本搜索
兩個(gè)最常使用的引擎為MyISAM和InnoDB,前者支持全文本搜索,而后者不支持。PRI主鍵約束;UNI唯一約束;MUL可以重復(fù)。
兩個(gè)行都包含詞rabbit,但包含詞rabbit作為第3個(gè)詞的行的等級(jí)比作為第20個(gè)詞的行高。這很重要。全文本搜索的一個(gè)重要部分就是對(duì)結(jié)果排序。具有較高等級(jí)的行先返回(因?yàn)檫@些行很可能是你真正想要的行)。
全文本搜索提供了簡(jiǎn)單LIKE搜索不能提供的功能。而且,由于數(shù)據(jù)是索引的,全文本搜索還相當(dāng)快。
in boolean mode >>使用-ropes 不包含ropes
boolean操作符
僅在MyISAM數(shù)據(jù)庫引擎中支持全文本搜索
mysql> create table sakuranew (
note_id int not null auto_increment,
prod_id char(10) not null ,
note_date datetime not null,
note_text text null,
primary key(note_id),
fulltext(note_text)
)engine=myisam;
Query OK, 0 rows affected (0.08 秒)
- 插入操作
省略的列必須滿足以下某個(gè)條件。
? 該列定義為允許NULL值(無值或空值)
? 在表定義中給出默認(rèn)值,這表示如果不給出值,將使用默認(rèn)值。
如果數(shù)據(jù)檢索是最重要的(通常是這樣),則你可以通過在INSERT和INTO之間添加關(guān)鍵字LOW_PRIORITY,指示MySQL降低INSERT語句的優(yōu)先級(jí)。
其中單條INSERT語句有多組值,每組值用一對(duì)圓括號(hào)括起來,用逗號(hào)分隔。
INSERT LOW_PRIORITY INTO sakuranew (note_id,prod_id,note_date,note_text) SELECT note_id,prod_id,note_date,note_text FROM sakura;
INSERT SELECT中SELECT語句可包含WHERE子句以過濾插入的數(shù)據(jù)。
- 更刪操作
IGNORE關(guān)鍵字 如果用UPDATE語句更新多行,并且在更新這些行中的一行或多行時(shí)出現(xiàn)一個(gè)錯(cuò)誤,則整個(gè)UPDATE操作被取消(錯(cuò)誤發(fā)生前更新的所有行被恢復(fù)到它們?cè)瓉淼闹担<词故前l(fā)生錯(cuò)誤,也繼續(xù)進(jìn)行更新,可使用IGNORE關(guān)鍵字,如下所示:UPDATE IGNORE customers…
DELETE不需要列名或通配符。DELETE刪除整行而不是刪除列。為了刪除指定的列,請(qǐng)使用UPDATE語句。 update set null
刪除表的內(nèi)容而不是表 DELETE語句從表中刪除行,甚至是刪除表中所有行。但是,DELETE不刪除表本身。[插圖]更快的刪除 如果想從表中刪除所有行,不要使用DELETE。可使用TRUNCATE TABLE語句,它完成相同的工作,但速度更快(TRUNCATE實(shí)際是刪除原來的表并重新創(chuàng)建一個(gè)表,而不是逐行刪除表中的數(shù)據(jù))。DROP不保留表結(jié)構(gòu)
如果省略了WHERE子句,則UPDATE或DELETE將被應(yīng)用到表中所有的行。
where盡量使用主鍵 - 創(chuàng)建操縱表
如果你僅想在一個(gè)表不存在時(shí)創(chuàng)建它,應(yīng)該在表名后給出IF NOT EXISTS。這樣做不檢查已有表的模式是否與你打算創(chuàng)建的表模式相匹配。它只是查看表名是否存在,并且僅在表名不存在時(shí)創(chuàng)建它。
允許NULL值的列不能作為唯一標(biāo)識(shí)。表中的每個(gè)行必須具有唯一的主鍵值。如果主鍵使用單個(gè)列,則它的值必須唯一。如果使用多個(gè)列,則這些列的組合值必須唯一。
每個(gè)表只允許一個(gè)AUTO_INCREMENT列,而且它必須被索引(如,通過使它成為主鍵。你可以簡(jiǎn)單地在INSERT語句中指定一個(gè)值,只要它是唯一的(至今尚未使用過)即可,該值將被用來替代自動(dòng)生成的值。后續(xù)的增量將開始使用該手工插入的值。
如何在使用AUTO_INCREMENT列時(shí)獲得這個(gè)值呢?可使用last_insert_id()函數(shù)獲得這個(gè)值,如下所示:SELECT_last_insert_id()
默認(rèn)值用CREATE TABLE語句的列定義中的DEFAULT關(guān)鍵字指定。
但MySQL與其他DBMS不一樣,它具有多種引擎。它打包多個(gè)引擎,這些引擎都隱藏在MySQL服務(wù)器內(nèi),全都能執(zhí)行CREATE TABLE和SELECT等命令。
? InnoDB是一個(gè)可靠的事務(wù)處理引擎,它不支持全文本搜索;
? MEMORY在功能等同于MyISAM,但由于數(shù)據(jù)存儲(chǔ)在內(nèi)存(不是磁盤)中,速度很快(特別適合于臨時(shí)表);
? MyISAM是一個(gè)性能極高的引擎,它支持全文本搜索,但不支持事務(wù)處理。
RENAME TABLE所做的僅是重命名一個(gè)表。
操作列 alter table sakura drop/add
constraint 外鍵名 foreign key 外鍵字段 references 主表名(關(guān)聯(lián)字段)
保持?jǐn)?shù)據(jù)一致性,完整性,主要目的是控制存儲(chǔ)在外鍵表中的數(shù)據(jù)。 使兩張表形成關(guān)聯(lián),外鍵只能引用外表中的列的值!建立外鍵的前提: 本表的列必須與外鍵類型相同(外鍵必須是外表主鍵)。事件觸發(fā)限制: on delete和on update , 可設(shè)參數(shù)cascade(跟隨外鍵改動(dòng)), restrict(限制外表中的外鍵改動(dòng)),set Null(設(shè)空值),set Default(設(shè)默認(rèn)值),[默認(rèn)]no action
創(chuàng)建含有外鍵的表:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);
說明:把id列 設(shè)為MySQL外鍵 參照外表outTable的id列 當(dāng)外鍵的值刪除 本表中對(duì)應(yīng)的列篩除 當(dāng)外鍵的值改變 本表中對(duì)應(yīng)的列值改變。
- 視圖
在視圖創(chuàng)建之后,可以用與表基本相同的方式利用它們??梢詫?duì)視圖執(zhí)行SELECT操作,過濾和排序數(shù)據(jù),將視圖聯(lián)結(jié)到其他視圖或表,甚至能添加和更新數(shù)據(jù)(添加和更新數(shù)據(jù)存在某些限制。關(guān)于這個(gè)內(nèi)容稍后還要做進(jìn)一步的介紹)。重要的是知道視圖僅僅是用來查看存儲(chǔ)在別處的數(shù)據(jù)的一種設(shè)施。視圖本身不包含數(shù)據(jù),因此它們返回的數(shù)據(jù)是從其他表中檢索出來的。在添加或更改這些表中的數(shù)據(jù)時(shí),視圖將返回改變過的數(shù)據(jù)。[插圖]性能問題 因?yàn)橐晥D不包含數(shù)據(jù),所以每次使用視圖時(shí),都必須處理查詢執(zhí)行時(shí)所需的任一個(gè)檢索。如果你用多個(gè)聯(lián)結(jié)和過濾創(chuàng)建了復(fù)雜的視圖或者嵌套了視圖,可能會(huì)發(fā)現(xiàn)性能下降得很厲害。因此,在部署使用了大量視圖的應(yīng)用前,應(yīng)該進(jìn)行測(cè)試。
如果視圖定義中有以下操作,則不能進(jìn)行視圖的更新:? 分組(使用GROUP BY和HAVING);? 聯(lián)結(jié);? 子查詢;? 并;? 聚集函數(shù)(Min()、Count()、Sum()等);? DISTINCT;? 導(dǎo)出(計(jì)算)列。
CREATE VIEW sakuraview as SELECT note_text from sakura where note_id = 1;
mysql> select * from sakuraview;
+------------------------------------------+
| note_text |
+------------------------------------------+
| rabbit is a cute animal,do you think so? |
+------------------------------------------+
- 存儲(chǔ)過程
提高性能。因?yàn)槭褂么鎯?chǔ)過程比使用單獨(dú)的SQL語句要快;通過把處理封裝在容易使用的單元中,簡(jiǎn)化復(fù)雜的操作;由于不要求反復(fù)建立一系列處理步驟,這保證了數(shù)據(jù)的完整性;如果表名、列名或業(yè)務(wù)邏輯(或別的內(nèi)容)有變化,只需要更改存儲(chǔ)過程的代碼
DELIMITER //告訴命令行實(shí)用程序使用//作為新的語句結(jié)束分隔符,可以看到標(biāo)志存儲(chǔ)過程結(jié)束的END定義為END//而不是END;。這樣,存儲(chǔ)過程體內(nèi)的;仍然保持不動(dòng),并且正確地傳遞給數(shù)據(jù)庫引擎。最后,為恢復(fù)為原來的語句分隔符,可使用DELIMITER ;。除\符號(hào)外,任何字符都可以用作語句分隔符
mysql> CREATE PROCEDURE sakura()
BEGIN
SELECT max(note_id) as maxsakura
from sakura;
END;
Query OK, 0 rows affected (0.01 秒)
mysql> call sakura();
+-----------+
| maxsakura |
+-----------+
| 3 |
+-----------+
1 行于數(shù)據(jù)集 (0.01 秒)
Query OK, 0 rows affected (0.02 秒)
mysql> drop procedure sakura;
Query OK, 0 rows affected (0.09 秒)
這條語句刪除剛創(chuàng)建的存儲(chǔ)過程。請(qǐng)注意沒有使用后面的(),只給出存儲(chǔ)過程名
decimal(8,2) 整數(shù)和小數(shù)加起來一共8位,保留兩位小數(shù)
存儲(chǔ)過程的結(jié)束標(biāo)點(diǎn)一定要修改
delimiter ??
CREATE PROCEDURE sakura(
OUT pl DECIMAL(8,2),
OUT pa DECIMAL(8,1),
OUT ph DECIMAL(8,3))
BEGIN
SELECT MIN(note_id) INTO pl FROM sakura;
SELECT MAX(note_id) INTO pa FROM sakura;
SELECT AVG(note_id) INTO ph FROM sakura;
END??
delimiter ;
所有MySQL變量都必須以@開始
mysql> select @pa;
+------+
| @pa |
+------+
| 3.0 |
+------+
1 行于數(shù)據(jù)集 (0.01 秒)
mysql> select @pa1;
+------+
| @pa1 |
+------+
| NULL |
+------+
1 行于數(shù)據(jù)集 (0.02 秒)
mysql> CALL sakura234(@pl1,@pa1,@ph1);
Query OK, 1 rows affected (0.01 秒)
mysql> select @pa1;
+------+
| @pa1 |
+------+
| 3.0 |
+------+
1 行于數(shù)據(jù)集 (0.02 秒)
調(diào)用call之后才能使用變量
傳入值到存儲(chǔ)過程
delimiter ??
CREATE PROCEDURE sakura(
IN pronum CHAR,
OUT ototal DECIMAL(8,2))
BEGIN
SELECT SUM(note_id*note_id) FROM sakura WHERE prod_id = pronum INTO ototal;
END??
delimiter ;
mysql> call sakura(33,@total123);
Query OK, 1 rows affected (0.02 秒)
mysql> select @total1123;
觸發(fā)器僅create update delete 只支持表不支持view或臨時(shí)表 一個(gè)表最多六個(gè)觸發(fā)器
- 事務(wù)
事務(wù)(transaction)指一組SQL語句;
? 回退(rollback)指撤銷指定SQL語句的過程;
? 提交(commit)指將未存儲(chǔ)的SQL語句結(jié)果寫入數(shù)據(jù)庫表;
? 保留點(diǎn)(savepoint)指事務(wù)處理中設(shè)置的臨時(shí)占位符(place-holder),你可以對(duì)它發(fā)布回退(與回退整個(gè)事務(wù)處理不同)。事務(wù)處理(transaction processing)可以用來維護(hù)數(shù)據(jù)庫的完整性,它保證成批的MySQL操作要么完全執(zhí)行,要么完全不執(zhí)行。ROLLBACK和COMMIT
START TRANSACTION;ROLLBACK
事務(wù)處理用來管理INSERT、UPDATE和DELETE語句。你不能回退SELECT語句。(這樣做也沒有什么意義。)你不能回退CREATE或DROP操作。事務(wù)處理塊中可以使用這兩條語句,但如果你執(zhí)行回退,它們不會(huì)被撤銷。
一般的MySQL語句都是直接針對(duì)數(shù)據(jù)庫表執(zhí)行和編寫的。這就是所謂的隱含提交(implicit commit),即提交(寫或保存)操作是自動(dòng)進(jìn)行的。
但是,在事務(wù)處理塊中,提交不會(huì)隱含地進(jìn)行。為進(jìn)行明確的提交,使用COMMIT語句 - 安全
不應(yīng)該在日常的MySQL操作中使用root
在創(chuàng)建用戶賬號(hào)后,必須接著分配訪問權(quán)限。新創(chuàng)建的用戶賬號(hào)沒有訪問權(quán)限。它們能登錄MySQL,但不能看到數(shù)據(jù),不能執(zhí)行任何數(shù)據(jù)庫操作
grant/revoke select on ss_c_lesson.* from sakura;
show grants for sakura;
set password = password('n3w 'P@$$w0rd")
19. 維護(hù)
? 使用命令行實(shí)用程序mysqldump轉(zhuǎn)儲(chǔ)所有數(shù)據(jù)庫內(nèi)容到某個(gè)外部文件。在進(jìn)行常規(guī)備份前這個(gè)實(shí)用程序應(yīng)該正常運(yùn)行,以便能正確地備份轉(zhuǎn)儲(chǔ)文件。? 可用命令行實(shí)用程序mysqlhotcopy從一個(gè)數(shù)據(jù)庫復(fù)制所有數(shù)據(jù)(并非所有數(shù)據(jù)庫引擎都支持這個(gè)實(shí)用程序)。? 可以使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE轉(zhuǎn)儲(chǔ)所有數(shù)據(jù)到某個(gè)外部文件。這兩條語句都接受將要?jiǎng)?chuàng)建的系統(tǒng)文件名,此系統(tǒng)文件必須不存在,否則會(huì)出錯(cuò)。數(shù)據(jù)可以用RESTORE TABLE來復(fù)原。首先刷新未寫數(shù)據(jù) 為了保證所有數(shù)據(jù)被寫到磁盤(包括索引數(shù)據(jù)),可能需要在進(jìn)行備份前使用FLUSH TABLES語句。
檢查表鍵是否正常
mysql> analyze table ss_c_lesson;
+-----------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------------------+---------+----------+----------+
| shuangshi.ss_c_lesson | analyze | status | OK |
+-----------------------+---------+----------+----------+
如果從一個(gè)表中刪除大量數(shù)據(jù),應(yīng)該使用OPTIMIZE TABLE來收回所用的空間,從而優(yōu)化表的性能。
20.性能
硬件/專用服務(wù)器/一段時(shí)間需要調(diào)整內(nèi)存分配、緩沖區(qū)大小等/它經(jīng)常同時(shí)執(zhí)行多個(gè)任務(wù)。如果這些任務(wù)中的某一個(gè)執(zhí)行緩慢,則所有請(qǐng)求都會(huì)執(zhí)行緩慢。如果你遇到顯著的性能不良,可使用SHOWPROCESSLIST顯示所有活動(dòng)進(jìn)程(以及它們的線程ID和執(zhí)行時(shí)間)/ select編寫方式/ explain解釋如何運(yùn)行select/存儲(chǔ)過程執(zhí)行得比一條一條地執(zhí)行其中的各條MySQL語句快/總是使用正確的數(shù)據(jù)類型/不使用select*/最好是使用FULLTEXT而不是LIKE/索引可根據(jù)需要添加和刪除/你的SELECT語句中有一系列復(fù)雜的OR條件嗎?通過使用多條SELECT語句和連接它們的UNION語句,你能看到極大的性能改進(jìn)/在導(dǎo)入數(shù)據(jù)時(shí),應(yīng)該關(guān)閉自動(dòng)提交/有的操作(包括INSERT)支持一個(gè)可選的DELAYED關(guān)鍵字,如果使用它,將把控制立即返回給調(diào)用程序,并且一旦有可能就實(shí)際執(zhí)行該操作
mysql> explain select user from user;
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | user | index | NULL | PRIMARY | 228 | NULL | 8 | Using index |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
1 行于數(shù)據(jù)集 (0.04 秒)
21. 數(shù)據(jù)類型
串?dāng)?shù)據(jù)類型:CHAR屬于定長(zhǎng)串類型/TEXT屬于變長(zhǎng)串類型(MySQL處理定長(zhǎng)列遠(yuǎn)比處理變長(zhǎng)列快得多。此外,MySQL不允許對(duì)變長(zhǎng)列(或一個(gè)列的可變部分)進(jìn)行索引。這也會(huì)極大地影響性能。)

數(shù)值數(shù)據(jù)類型:有數(shù)值數(shù)據(jù)類型(除BIT和BOOLEAN外)都可以有符號(hào)或無符號(hào);但如果你知道自己不需要存儲(chǔ)負(fù)值,可以使用UNSIGNED關(guān)鍵字,這樣做將允許你存儲(chǔ)兩倍大小的值。存儲(chǔ)貨幣數(shù)據(jù)類型 MySQL中沒有專門存儲(chǔ)貨幣的數(shù)據(jù)類型,一般情況下使用DECIMAL(8, 2)。

日期類型:

二進(jìn)制類型:

查看表大小
use information_schema;
select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from TABLES where table_schema='tengyue_shuangshi';
select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from TABLES;
查看連接數(shù)
mysql> show status like 'Threads%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 12 |
| Threads_connected | 15 |
| Threads_created | 51696 |
| Threads_running | 1 |
+-------------------+-------+
mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 1000 |
+-----------------+-------+
1 行于數(shù)據(jù)集 (0.03 秒)
mysql> show global status like '%max_used_connections%';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 1001 |
+----------------------+-------+
1 行于數(shù)據(jù)集 (0.31 秒)
+1為管理員賬號(hào)

