2015/4/22
MySQL采用的是客戶/服務(wù)器體系結(jié)構(gòu)瓦糕,因此,當(dāng)你使用MySQL時款筑,你實際上是在使用兩個程序智蝠,MySQL服務(wù)器程序,指的是mysqld程序奈梳,它運(yùn)行在你存放你的數(shù)據(jù)庫的機(jī)器上杈湾,負(fù)責(zé)在網(wǎng)絡(luò)上監(jiān)聽并處理倆字客戶端的服務(wù)請求,根據(jù)這行請求去訪問數(shù)據(jù)庫的內(nèi)容攘须,再把有關(guān)信息回傳給客戶端漆撞;另一個程序是MySQL客戶端程序,它們負(fù)責(zé)連接到數(shù)據(jù)庫服務(wù)器于宙,并通過向服務(wù)器發(fā)出查詢命令來告知客戶端需要哪些數(shù)據(jù)浮驳。mysql是最常用的客戶端程序。其他的有mysqldump捞魁、mysqladmin至会,前者把數(shù)據(jù)表的內(nèi)容導(dǎo)出到一個文件里,后者用來檢查數(shù)據(jù)庫服務(wù)器的工作狀態(tài)和執(zhí)行一些數(shù)據(jù)庫管理方面的任務(wù)谱俭。也就是說MySQL和mysql是兩種不同的事物奋献,前者指一個完整的MySQL RDBMS,而后者指的是一個特定的客戶端程序旺上。
使用mysql連接數(shù)據(jù)庫服務(wù)器(WINDOWS CMD下):
cd D:/WAMP/wamp/bin/mysql/mysql5.5.20/bin
mysql -h host_name -p -u user_name
回車,輸入密碼糖埋。
或者宣吱,mysql -h host_name -pyour_pass -u user_name
或者,mysql --host=host_name --password=your_pass --user=user_name
-h,-u與其后的內(nèi)容有無空格均可瞳别,但是-p必須沒有空格征候。
如果不想輸入-u選項杭攻,可以設(shè)置環(huán)境變量(既然說是環(huán)境變量,那么疤坝,可以去控制面板->系統(tǒng)中設(shè)置):
set USER=user_name
(但是親測不好用)
如果是連接本地數(shù)據(jù)庫兆解,則可省略-h選項。
此處把我的幾個錯誤記錄下來跑揉,我剛開始用命令行連接數(shù)據(jù)庫時锅睛,切到mysql.exe所在的目錄下,沒有輸入上述連接命令历谍,直接就是mysql.exe现拒,然后回車,然后再輸入mysql -h host_name -p -u user_name
就是不行望侈。
還有印蔬,密碼必須是手動敲進(jìn)去的,復(fù)制粘貼的不行脱衙。
2015/4/23
Q1:嘗試不使用-u侥猬、-p登錄,發(fā)現(xiàn)可以連接捐韩。按理說不行啊退唠。我想是不是因為環(huán)境變量中已經(jīng)有了用戶名的原因,退出mysql奥帘,輸入SET USER=noUser
铜邮,然后不使用-u、-p登錄寨蹋,結(jié)果依然可以登錄松蒜。想不明白是為什么。
A1:可能是SET USER=noUser
沒有起作用已旧,然后存在''@localhost這個用戶秸苗。
Q:LINUX下的命令提示符為$或者#,書上說Unix為%或者$运褪,windows為C:>惊楼。是這樣么?
可以在連接的時候直接指定數(shù)據(jù)庫:
mysql -h host_name -pyour_pass -u user_name dbname
SQL語句末尾的分號表示語句的結(jié)束秸讹,也可以使用“\g”(表示go)檀咙,也可以使用“\G”(表示數(shù)值排列顯示結(jié)果)。
“\c”璃诀,退出當(dāng)前語句輸入(有時前面輸入一個引號弧可,后面輸入一個“\c”不好使,是因為MySQL將\c認(rèn)為是字符串的內(nèi)容了劣欢,退不出語句輸入棕诵,這時候?qū)⒆址Y(jié)束裁良,即輸入另一個引號即可)。
連接MySQL直接執(zhí)行文件中的SQL命令:
mysql -h host_name -pyour_pass -u user_name < my.sql
顯示當(dāng)前數(shù)據(jù)庫:
SELECT DATABASE();
進(jìn)入mysql后校套,讀入文件中的SQL語句:
source my.sql;
2015/4/26
AUTO_INCREMENT和PRIMARY KEY的關(guān)系:
MySQL要求必須給具有AUTO_INCREMENT屬性的列定義某種形式的唯一化索引价脾,若沒有,數(shù)據(jù)表的定義就不合法笛匙。PRIMARY KEY表示對列創(chuàng)建索引以加快查找速度侨把,同時,也要求該數(shù)據(jù)列里面的值都是唯一且存在的膳算,所以具有PRIMARY KEY屬性的字段可以省略NOT NULL座硕。
兩個的語句:
當(dāng)前服器所有數(shù)據(jù)庫 SELECT DATABASE();
當(dāng)前使用的數(shù)據(jù)庫 SHOW DATABASES;
SHOW TABLES;
也就是說,SHOW后面不是函數(shù)且為復(fù)數(shù)涕蜂,而 SELECT后面是函數(shù)华匾。
查看表結(jié)構(gòu):
DESCRIBE table_name;
DESC table_name;
EXPLAIN table_name;
SHOW COLUMNS FROM table_name;
SHOW FIELDS FROM table_name;
同時,這些字句還允許將輸出內(nèi)容限制為指定的數(shù)據(jù)列机隙,比如說加上LIKE字句蜘拉,或者直接指定需要查詢的列名:DESCRIBE table_name column_name
。
Q:語句SHOW FULL COLUMNS FROM table_name;
和 SHOW COLUMNS FROM table_name
有什么區(qū)別有鹿?
使用SHOW命令得到的內(nèi)容都可以使用mysqlshow客戶端得到旭旭。
mysqlshow -h host_name -u user_name -pyour_pass;
mysqlshow -h host_name -u user_name -pyour_pass database_name;
mysqlshow -h host_name -u user_name -pyour_pass database_name table_name;
“ISAM”是“indexed sequential access method”(索引化順序訪問方法)的縮寫,MyISAM引擎在這種訪問方法的基礎(chǔ)上增加了一些MySQL獨有的東西葱跋。
Q:P31中有這么一句話持寄,
InnoDB引擎通過引入“外鍵”概念而具備了保持“引用一致性”的特點。
意思是不是MyISAM引擎就沒有“外鍵”這一概念娱俺?
這樣的建表語句:
CREATE TABLE table_name ( FOREIGN KEY (column_name) REFERENCES another_table_name (column_name) ) ENGINE = InnoDB;
這樣即可定義外鍵稍味。外鍵的作用是確保被插入的列值必須與另一張表中的指定列中的值可以匹配上。出現(xiàn)在FOREIGN KEY 里的數(shù)據(jù)列荠卷,要么它本身有一個索引模庐,要么是某個多數(shù)據(jù)列索引里第一個被列出的數(shù)據(jù)列。如果不是油宜,最好使用INDEX(column_name)顯式指定一個掂碱,雖然,InnoDB存儲引擎會為出現(xiàn)在外鍵定義里面的數(shù)據(jù)列自動創(chuàng)建一個索引慎冤,但它創(chuàng)建的未必是合適的疼燥,所以,最好顯式指定一個蚁堤。
使用SET子句插入數(shù)據(jù):
INSERT INTO table_name SET column_name1 = value1,column_name2 = value2;
讀取本地文件my_sql.txt中的內(nèi)容醉者,插入數(shù)據(jù)庫:
LOAD DATA LOCAL INFILE 'my_sql.txt' INTO TABLE table_name;
如果沒有LOCAL關(guān)鍵字,即為讀取服務(wù)器上的文件。
在默認(rèn)情況下湃交,LOAD DATA 語句將假設(shè)各數(shù)據(jù)列的值以制表符分割,各數(shù)據(jù)行以換行符分隔藤巢,數(shù)據(jù)值的排列順序與各數(shù)據(jù)列在數(shù)據(jù)表里的先后順序一致搞莺。
也可以使用mysqlimport客戶端
mysqlimport -h host_name -u user_name -pyour_pass --local database_name my_sql.txt
注意這里沒有“;”,如果加上掂咒,分號會被當(dāng)做文件名的一部分
Q:不加--local參數(shù)是不是就可以訪問服務(wù)器端的文件了才沧?
獲得數(shù)據(jù)庫版本:
SELECT VERSION();
MySQL不區(qū)分?jǐn)?shù)據(jù)列的大小寫,但是卻未必不區(qū)分?jǐn)?shù)據(jù)庫和數(shù)據(jù)表名字的大小寫绍刮,這取決于服務(wù)器主機(jī)上使用的文件系統(tǒng)以及MySQL的配置情況温圆。
關(guān)于NULL值的比較:
使用普通的算術(shù)比較運(yùn)算符對NULL值進(jìn)行操作,其結(jié)果是不可預(yù)知的孩革,甚至使用普通的算術(shù)比較運(yùn)算符比較NULL和其自身岁歉,結(jié)果也是不可預(yù)料的。
比較NULL值只能使用IS NULL 或者IS NOT NULL或者<=>或者NOT <=>膝蜈,比如锅移,SELECT NOT NULL<=>NULL;
返回0。
MySQL部分算術(shù)運(yùn)算符:
DIV 整數(shù)除法
% 求余
/ 除法
MySQL部分邏輯運(yùn)算符:
XOR 邏輯異或
NOT 邏輯非
有這么一個需求饱搏,將記錄以某一個可能包含NULL值的列降序排列非剃,但是還需要讓該列為NULL的記錄在結(jié)果集的前面,可以這樣:
SELECT (*) FROM table_name ORDER BY IF(column_name <=> NULL,0,1) column_name DESC
這里使用了IF函數(shù)推沸,當(dāng)?shù)谝粋€參數(shù)為真备绽,IF()函數(shù)返回第二個參數(shù),否則返回第三個參數(shù)鬓催。
2015/5/7
Q:一個變量@val肺素,它的生存周期是多長?我試驗過深浮,在mysql客戶端压怠,設(shè)置一個變量,然后執(zhí)行別的SQL語句飞苇,該變量一直存在菌瘫,但是quit
或者exit
后,再連接數(shù)據(jù)庫布卡,該變量就不存在了雨让。這是不是就是與常連接的概念有關(guān)。
隨機(jī)取出某條數(shù)據(jù):
SELECT col_name FROM table_name ORDER BY RAND()
COUNT(*)
和COUNT(col_name)
的區(qū)別:后者只統(tǒng)計非NULL行忿等。
統(tǒng)計某列的不重復(fù)值 的數(shù)目栖忠,以前我一直是COUNT()
函數(shù)和GROUP BY col_name
一起用來實現(xiàn),還可以這樣,更簡單:COUNT(DISTINCT col_name)
2015/8/11
存儲引擎的可移植性:
從某種意義上講庵寞,任何一個MySQL服務(wù)器所管理的任何數(shù)據(jù)表都可以移植到另一臺服務(wù)器上去狸相,想用mysqldump工具把它備份出來,然后把備份文本文件放到另一臺服務(wù)器主機(jī)捐川,并通過加載備份的方法重新創(chuàng)建該數(shù)據(jù)表脓鹃。可移植性還有另一層含義古沥,即二進(jìn)制可移植性瘸右,指的是你可以直接把代表某個數(shù)據(jù)表的硬盤文件復(fù)制到另一臺機(jī)器,并把他們安裝到數(shù)據(jù)子目錄下的相應(yīng)地點岩齿,然后那臺機(jī)器上的MySQL服務(wù)器就可以使用該數(shù)據(jù)表了太颤。
一般來說,MyISAM和InnoDB的存儲格式與機(jī)器無關(guān)盹沈,他們具備二進(jìn)制可移植性龄章。
從其他數(shù)據(jù)表或查詢結(jié)果創(chuàng)建數(shù)據(jù)表:
CREATE TABLE new_table_name LIKE table_name;
INSERT INTO new_table_name SELECT...;
CREATE TABLE new_table_name SELECT ...;
前者首先復(fù)制表結(jié)構(gòu)及所有數(shù)據(jù)列的屬性,然后填充數(shù)據(jù)襟诸。后者直接將SELECT得到的數(shù)據(jù)填充至新的數(shù)據(jù)表瓦堵,但是不會復(fù)制數(shù)據(jù)列的屬性。