
很久沒有寫sql語句了,今天當(dāng)需要講數(shù)據(jù)庫的時候(是的,就是那樣~),發(fā)現(xiàn)已經(jīng)手生了,深夜看文檔后寫下了這篇文章。
這篇文章主要是針對有一定數(shù)據(jù)庫基礎(chǔ)知識的盆友。是的,就像走兩步是檢驗?zāi)_一樣,作為了解數(shù)據(jù)庫的我們,得:寫兩句。當(dāng)然,如果是對數(shù)據(jù)庫知之甚少的伙伴,按照本文的示例也能初步感受sql語句的魅力(就那么幾句)。數(shù)據(jù)庫版本尤其是商用版本夠多,但是基本sql語句都是大同小異,本文主要是針對MySql。
開發(fā)過程中,個人非常熱衷官方文檔。能用看文檔解決的問題,都不是大問題,如果有問題,那就再看一遍!
所以,不得不第一個提起的就是:
>mysql --help
Step 1, connecting&disconnecting
當(dāng)我們需要數(shù)據(jù)庫服務(wù)的時候,首先得通過既有賬號和密碼連接到數(shù)據(jù)庫。
>mysql -h host -u user -p
Enter password:
-h:what host(不填則為連接本機(jī)上的MySQL), -u:user name, -p:password to use,輸入密碼后就可以對數(shù)據(jù)庫進(jìn)行各種溫柔的交流了。
當(dāng)我們不再需要操作數(shù)據(jù)庫的時候,作為一個有始有終的人,這個時候一定不能原諒自己忘了斷開連接。
mysql>?QUIT(or \q)
如果使用的是Unix,也可通過 Control+D 斷開數(shù)據(jù)庫連接。
Step 2,寫兩句
第一步我們已經(jīng)成功與數(shù)據(jù)庫建立連接,下面就開始本文的重點啦,嗯,寫上兩句。
2.1 首先,得有數(shù)據(jù)庫
查看當(dāng)前server上已經(jīng)存在數(shù)據(jù)庫,[關(guān)鍵詞?SHOW]:
mysql>SHOW DATABASES;
特別注意:當(dāng)前用戶是否擁有SHOW_DDATABASES 權(quán)限。
如果沒有既有的數(shù)據(jù)庫,則需要創(chuàng)建數(shù)據(jù)庫(庫名:test),[關(guān)鍵詞?CREATE]:
mysql> CREATE DATABASE test;
注意:Unix環(huán)境下是區(qū)分大小寫的,所以,建表的時候表名避免大小寫混寫,數(shù)據(jù)庫命名也是如此!
訪問數(shù)據(jù)庫(本地存在該數(shù)據(jù)庫,本文測試數(shù)據(jù)庫名均為test),[關(guān)鍵詞?USE]:
mysql> USE test
2.2 其次,得有表
基于步驟2.1已經(jīng)訪問到特定數(shù)據(jù)庫后,產(chǎn)看當(dāng)前數(shù)據(jù)庫所有表,[關(guān)鍵詞 SHOW TABLES]:
mysql> SHOW TABLES;
如果沒有需要的表的時候,則創(chuàng)建一張新的表(表名 user),[關(guān)鍵詞 CREATE TABLE]:
mysql> CREATE TABLE user (name VARCHAR(20), sex CHAR(1), birth DATE);
表名:user,每個user都有name,sex以及birth三個屬性值。VARCHAR長度可以為1-65535,為“節(jié)能減排”,對某些屬性設(shè)置特定長度可以有效的減小資源占用,如name設(shè)置長度為20。當(dāng)后期有變更的時候,可以使用ALTER TABLE對已有表添加、修改或刪除列。
mysql> create table users (id int(4) primary key not null auto_increment,name varchar(20) not null default '', gender char(1) not null default 'm',address varchar(20), tel varchar(20));
表名:users,每個user都有一個自增的主鍵id,name,gender,address以及tel三個屬性值。
當(dāng)成功創(chuàng)建表需要查看創(chuàng)建表語句檢驗是否符合設(shè)計預(yù)期,或者忘記表中列的屬性定義的時候,可以查看表各列及其屬性,[關(guān)鍵詞 DESCRIBE 或 DESC]:
mysql> DESCRIBE user;
2.3 填充數(shù)據(jù)
將本地文件按順序填充到數(shù)據(jù)庫:
mysql> LOAD DATA LOCAL INFILE '/path/users.txt' INTO TABLE user;
若文件是在Windows上創(chuàng)建,則需要將上述語句改成:
mysql> LOAD DATA LOCAL INFILE '/path/users.txt' INTO TABLE user LINES TERMINATED BY '\r\n\';
在OS X系統(tǒng)上,對應(yīng)修改成 LINES TERMINATED BY '\r'。
插入數(shù)據(jù),[關(guān)鍵詞 INSERT]:
mysql> INSERT INTO user VALUES ('John', 'f', '1999-01-01');
當(dāng)插入值缺失的時候,用NULL代替。
2.4 操作表
·1 最簡單的方式,獲取表中所有數(shù)據(jù) [關(guān)鍵詞SELECT]
mysql> SELECT * FROM user;
·2 獲取特定行
mysql> SELECT * FROM user WHERE name = 'Tommy';
mysql> SELECT * FROM user WHERE birth >= '2000-01-01';
mysql> SELECT * FROM user WHERE name = 'Tommy' OR name = 'Tom';
mysql> SELECT * FROM user WHERE (sex = 'm' AND birth >= '2000-01-01') OR (sex = 'f' AND birth >= '2005-01-01');
·3 獲取特定列
mysql> SELECT name, birth FROM user;
mysql> SELECT DISTINCT birth FROM user; ?
DISTINCT:相同結(jié)果只輸出一次。
·4 排序,[關(guān)鍵詞 ORDER BY,默認(rèn)排序為升序,降序則添加關(guān)鍵詞 DESC]
mysql> SELECT name, birth FROM user ORDER BY birth;
mysql> SELECT name, birth FROM user ORDER BY birth DESC;
mysql>SELECT?name, birth?FROM?user?ORDER BY sex,?birth?DESC;
關(guān)鍵詞DESC只對緊鄰產(chǎn)生影響(birth)。
·5 修改一條數(shù)據(jù)的值,[關(guān)鍵詞 UPDATE]
mysql> UPDATE user SET birth = '2000-01-01' WHERE name = 'Tommy';
·6 ALTER
(1)修改表名:
mysql> ALTER TABLE user RENAME TO db_user;
(2)增加主鍵:
mysql> ALTER TABLE user ADD id int(5) unsigned NOT NULL AUTO_INCREMENT , ADD PRIMARY KEY(id);
(3)修改id為自增,并設(shè)置為主鍵:
mysql> ALTER TABLE user MODIFY id INT AUTO_INCREMENT PRIMARY KEY;
(4)增加字段:
mysql> ALTER TABLE user ADD (address varchar(20));
(5)修改字段默認(rèn)值:
mysql> ALTER TABLE user ALTER COLUMN gender set default 0;
(6)在某個自斷后增加字段:
mysql> ALTER TABLE user ADD COLUMN email VARCHAR(20) NOT NULL DEFAULT ''AFTER tel;
(7)修改原字段名稱及類型,修改字段名時必須重新制定字段類型:
mysql> ALTER TABLE user CHANGE project project_new varchar(20) NOT NULL DEFAULT '';
(8)刪除字段:
mysql> ALTER TABLE db_teacher DROP address;
(9)修改一個字段類型:
mysql> ALTER TABLE db_teacher MODIFY gender INT(1) UNSIGNED DEFAULT 0;
·7 NULL
NULL虐我千百遍,還得待她如初戀~
官方文檔對于NULL的定義是:a missing unknown value。
對于值的NULL判斷,[關(guān)鍵詞 IS NULL,IS NOT NULL]:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
1不為NULL,故上述結(jié)果分別是0,1。
注意:將一個值與NULL進(jìn)行比較運算(=, <, <>),結(jié)果均為NULL。
·8 統(tǒng)計數(shù)據(jù)條數(shù) [關(guān)鍵方法 COUNT(*)]
mysql> SELECT COUNT(*) FROM user; ? ? 注:統(tǒng)計用戶數(shù)
mysql> SELECT sex, COUNT(*) FROM user GROUP BY sex; ? ?注:統(tǒng)計male,female (如果有NULL則還有NULL)人數(shù)
·9 Pattern Matching
MySQL提供了正則表達(dá)式相關(guān)的模式匹配方法。
(1),"_":匹配一個字符,“%”:匹配任意字符數(shù)(包括0);
(2),不區(qū)分大小寫;
mysql> SELECT * FROM user WHERE name LIKE 'a%'; ? 注:名字以a開頭
mysql> SELECT * FROM user WHERE name LIKE '%s'; ? ?注:名字以s結(jié)束
mysql> SELECT * FROM user WHERE name NOT LIKE '%b%';? ? 注:名字不包含b
mysql> SELECT * FROM user WHERE name LIKE? '___'; ? ? ?注:名字長度為5個字符
·10 多表查詢
為準(zhǔn)確記錄用戶一些重大事件,目前僅只有一張user表已經(jīng)無法滿足我們的需求了,新增一張event表,分別記錄用戶名,日期,事件類型以及備注。
mysql> CREATE TABLE event (name VARCHAR(20), date DATE, type VARCHAR(15), describe VARCHAR(255));
將數(shù)據(jù)導(dǎo)入或插入表中。
event表中記錄用戶一條type為marry的結(jié)婚事件,現(xiàn)在需要查詢各用戶的結(jié)婚年齡:
mysql> SELECT user.name, TIMESTAMPDIFF(YEAR,birth, date) AS age, desc FROM user INNER JOIN event ON user.name = event.name WHERE event.type = 'marry';
有時候也用當(dāng)前表join表本身用于計算。
mysql> SELECT u1.name, u1.sex FROM user AS u1 INNER JOIN user AS u2 ON u1.birth = u2.birth AND u1.sex = 'f' AND u2.sex = 'm';
·11 日期計算
日期計算在數(shù)據(jù)庫使用中非常普遍。MySQL也提供了日期相關(guān)的計算方法。
計算年齡,[方法 TIMESTAMPDIFF()]
mysql> SELECT name, birth, CURDATE(), ?TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM user;
mysql>?SELECT?name, birth,?CURDATE(), ?TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS?age?FROM user ORDER BY age;
mysql> SELECT name, birth, CURDATE(), TIMESTAMPDIFF(YEAR,birth, CURDATE()) AS age FROM user WHERE birth IS NOT NULL ORDER BY age;
上述sql語句執(zhí)行結(jié)果是:輸出會增加顯示當(dāng)前時間(CURDATE()),年齡age(TIMESTAMPDIFF(YEAR,birth,CURDATE()))。
mysql> SELECT name, birth, MONTH(birth) FROM user;
獲取特定日期的月份使用 MONTH(),相似方法還有YEAR(),MONTH(),DAYOFMONTH()等,查看MySQL更過日期、時間計算方法。
好了,本次關(guān)于找回MySQL曾經(jīng)內(nèi)容就到這了,后續(xù)會寫深入MySQL相關(guān)內(nèi)容。
文中若有疏漏及錯誤,煩請斧正,謝謝。
在中秋假期的最后一天祝各位看官中秋快樂~
附:官方文檔地址 MySQL 5.6 Reference Manual