mac如何在命令行中進(jìn)入默認(rèn)的MySQL數(shù)據(jù)庫(kù)
-
mysql.server start開(kāi)啟數(shù)據(jù)庫(kù)服務(wù)器,因?yàn)镸ySQL是客戶-服務(wù)的數(shù)據(jù)庫(kù)操作系統(tǒng)。 -
mysql -u root使用無(wú)密碼的root用戶名登陸。
mac使用SequelPro連接本地MySQL
- host:127.0.0.1
- name:root
- port:3306(默認(rèn))
- 其他不用填
一:使用數(shù)據(jù)庫(kù)
一般來(lái)說(shuō),我們會(huì)將關(guān)鍵字大寫,表名,列名小寫。關(guān)鍵字也可以小寫。mysql語(yǔ)句不區(qū)分大小寫關(guān)鍵字。
(一) 查看當(dāng)前MySQL當(dāng)中的所有數(shù)據(jù)庫(kù)
SHOW DATABASES;
(二)使用某一個(gè)數(shù)據(jù)庫(kù)前,必須指明要使用的數(shù)據(jù)庫(kù)名字
USE databaseName;
查看當(dāng)前數(shù)據(jù)庫(kù)中的所有表
SHOW TABLES;
(三)查看當(dāng)前表中的所有列名
SHOW COLUMNS FROM tableName;
或者
DESCRIBE tableName;
二:檢索數(shù)據(jù)
(一)SELECT
- 單個(gè)列查詢
SELECT age FROM user;
- 多列查詢
SELECT name,age FROM user;
- 查詢所有列
SELECT * FROM user;
- 過(guò)濾相同的行。比如當(dāng)年齡為20的有五個(gè)人時(shí),只會(huì)返回一個(gè)20
SELECT DISTINCT age FROM user;
- 限制結(jié)果。從第四行,開(kāi)始檢索五行。因此如果僅僅是
LIMIT 4就表示從第零行,檢索4行。
SELECT age FROM user LIMIT 3,5;
(二)排序檢索數(shù)據(jù)
- 單個(gè)列排序。也可以使用非檢索的列來(lái)排序。
SELECT age FROM user ORDER BY age;
- 多個(gè)列排序。先按年齡排序,如果年齡相等,再按照姓名排序。默認(rèn)是ASC升序排列。
SELECT age,name FROM user ORDER BY age,name;
- 多列排序。先按年齡降序排列,如果年齡相等,就會(huì)再按姓名排序。
SELECT age,name FROM user ORDER BY age DESC,name;
- 尋找年齡最大的人
SELECT age FROM user ORDER BY age DESC LIMIT 1;
注意上面的LIMIT需要再ORDER BY之后,不然就變成了查詢數(shù)據(jù)庫(kù)的限制,而不是查詢數(shù)據(jù)庫(kù)結(jié)果之后的限制了。
(三)過(guò)濾數(shù)據(jù)
1: WHERE關(guān)鍵字。會(huì)返回所有滿足條件的結(jié)果。ORDER BY應(yīng)該用在WHERE之后。
SELECT age,name FROM user WHERE age=20;
- WHERE支持的操作符
| 操作符 | 說(shuō)明 |
|---|---|
| = | 等于 |
| <> | 不等于 |
| != | 不等于 |
| < | 小于 |
| > | 大于 |
| <= | 小于等于 |
| >= | 大于等于 |
| BETWEEN | 在指定的兩個(gè)值之間 |
- 使用限定引號(hào)
SELECT age,name FROM user WHERE name <> 'android';
- 范圍值。在開(kāi)始值和結(jié)束值之間還需要使用AND。
SELECT age,name FROM user WHERE age BETWEEN 18 AND 30;
- 檢查NULL
SELECT age,name FROM user WHERE name IS NULL;
上面的語(yǔ)句會(huì)返回名字為NULL的行。
- AND操作符,可以多個(gè)AND聯(lián)合使用
SELECT age,name,address FROM user WHERE address = 'beijing' AND age<=30;
上面這條語(yǔ)句表時(shí)返回地址是beijing,并且年齡小于等于30行。
- OR操作符。AND優(yōu)先級(jí)高于OR的優(yōu)先級(jí)
SELECT age,name,address FROM user WHERE age=20 OR age=25;
返回年齡是20或者25的行。
- 使用圓括號(hào)
SELECT age,name,address FROM user WHERE (age=20 OR age = 25) AND address="beijing";
2:IN操作符
SELECT age,name,address FROM user WHERE age IN (20,25,18) ORDER BY name;
返回年齡在20,25,18這三個(gè)歲數(shù)的行,并且按照名字排序。
3:NOT操作符
否定NOT后所跟的條件
SELECT age,name,address FROM user WHERE age NOT IN(50,40);
返回年齡不是50,40的所有行。
4:通配符過(guò)濾
LIKE指示后跟的搜索模式使用通配符而不是直接相等匹配。
SELECT age,name FROM user WHERE name LIKE 'xia%';
上面標(biāo)示返回所有name以xia開(kāi)頭的行。
%標(biāo)示任何字符出現(xiàn)任意次數(shù)。xia%標(biāo)示,不管xia后面跟的是啥,跟了多少個(gè)。
而%xia%,則表示只要包含著xia就會(huì)返回。%不會(huì)匹配NULL。如果這里使用了WHERE age LIKE '20'那么并不會(huì)返回年齡是20的行。但是把LIKE換成REGEXP就可以。
SELECT age,name FROM user WHERE name LIKE 'x_a';
_下劃線只匹配一個(gè)字符。不能匹配0個(gè)或多個(gè)。
5:正則表達(dá)式
使用關(guān)鍵字REGEXP
SELECT age FROM user WHERE name REGEXP 'xia|nie'
返回匹配xia或者nie的行。
SELECT age FROM user WHERE name REGEXP '[xyz]ia'
返回匹配xia或者yia或者zia的行。其中’[xyz]xia‘也可以寫'[x-z]ia';
SELECT age FROM user WHERE name REGEXP '[^xyz]ia'
返回匹配除xia或者yia或者zia的所有的行。
用“\\”加在所有特殊符號(hào)之前進(jìn)行特殊符號(hào)匹配。之所以需要兩個(gè)是因?yàn)镸ySQL解釋一個(gè),正則表達(dá)式解釋一個(gè)。


^用在集合中否定,否則表示開(kāi)始位置。
不使用數(shù)據(jù)庫(kù)測(cè)試正則表達(dá)式
SELECT 'hello' REGEXP '[0-9]'
(四)在SELECT中創(chuàng)建計(jì)算字段
- 拼接兩個(gè)列。MySql使用Concat(),其他sql或許可以使用+或者用||來(lái)拼接。
SELECT Concat(name,'(',age,')') FROM user ;
上面就回以name(age)的方式輸出。實(shí)際上Concat是將name,(,age,)一共四個(gè)部分組合到一起的。
SELECT Concat(RTrim(name),'(',age,')') FROM user ;
在上面的基礎(chǔ)上,通過(guò)函數(shù)Trim(name)去掉了name中的左右兩邊空格。
SELECT Concat(RTrim(name),'(',age,')') AS title FROM user ;
將輸出的name(age)以title字段作為列名。
SELECT name,height*weight AS volume FROM user;
將height和weight相乘,然后以別名volum作為字段輸出.
(五)使用函數(shù)
- Upper()
SELECT Upper(name) AS upName FROM user;
原有的name就會(huì)變成大寫,并以u(píng)pName字段輸出。



假如有字段birthday的存儲(chǔ)為2015-01-02 10:34:23那么我們僅僅知道她是2015-01-02那天生日,那么該怎么匹配呢?
SELECT name,birthday FROM user WHERE Date(birthday) = '2015-01-02';
因?yàn)镈ate()函數(shù)返回日期部分,不返回時(shí)間。
(六)匯總數(shù)據(jù)

SELECT AVG(age) AS avg_age FROM user where address= ‘beijing’;
返回beijing地區(qū)的年齡平均值。
SELECT AVG(DISTINCT age) AS avg_age FROM user where address= ‘beijing’;
返回beijing地區(qū)的不同年齡(當(dāng)有多個(gè)20時(shí),只取一個(gè)用來(lái)計(jì)算)平均值。
- COUNT()兩種用法。一種是COUNT(*),總行數(shù)包括NULL行,一種是COUNT(address),只對(duì)address非NULL的行數(shù)計(jì)數(shù)。
SELECT COUNT(*) AS num_count FROM user;
- SUM()不僅可以用來(lái)計(jì)算指定列值的和,還可以用來(lái)合計(jì)計(jì)算值。
(七)分組數(shù)據(jù)
SELECT address,COUNT(*) AS count_address FROM user GROUP BY address;
返回按照地址分組的,每個(gè)地址的總行數(shù)。
GROUP BY語(yǔ)句需要在WHERE語(yǔ)句之后,出現(xiàn)在ORDER BY語(yǔ)句之前。
- 過(guò)濾分組
SELECT address,COUNT(*) AS count_address FROM user GROUP BY address HAVING COUNT(*)>=2;
返回按照地址分組的,每個(gè)地址至少有兩行的每個(gè)地址的總行數(shù)。
- WHERE 與 HAVING的區(qū)別
where過(guò)濾實(shí)在分組之前,HAVING是在分組后過(guò)濾。where過(guò)濾掉行不在分組中。
SELECT address,COUNT(*) AS count_address FROM user WHERE age >20 GROUP BY address HAVING COUNT(*)>=2;
首先去掉那些年齡小于21的行
然后按照地址分組
最后顯示分組中超過(guò)兩行的


(八) 子查詢
將第一次查詢的結(jié)果,作為第二次查詢的where條件。

將用戶表中的用戶id,作為訂單表中的用戶id進(jìn)行總數(shù)查詢計(jì)算,然后顯示。

(九) 聯(lián)結(jié)表
聯(lián)結(jié)是利用SQL的SELECT能執(zhí)行的最重要的操作。
1:簡(jiǎn)單聯(lián)結(jié)/內(nèi)部聯(lián)結(jié)/等值聯(lián)結(jié)
假設(shè)供應(yīng)商表只有供應(yīng)商名稱和id,產(chǎn)品表有產(chǎn)品信息及產(chǎn)品對(duì)應(yīng)的供應(yīng)商id。那么我們想要所有供應(yīng)商對(duì)應(yīng)的他的產(chǎn)品信息表如下:
SELECT vent_name,prod_name,prod_price FROM vent,product where vent.vent_id=product.vent_id ORDER BY vent_name;
上面的語(yǔ)句也可以轉(zhuǎn)換為
SELECT vernt_name,prod_name,prod_price FROM vent INNER JOIN product ON vent.vent_id=product.vent_id;
當(dāng)需要同時(shí)查閱多個(gè)表時(shí),既可以使用子查詢,也可以使用聯(lián)結(jié)查詢
字段別名是會(huì)返回到客戶端的,但是表別名則不會(huì)
2:自聯(lián)結(jié)
相同表中多次查詢可以使用自聯(lián)結(jié)。我們?cè)贔ROM中使用表別名。假設(shè)我們要在同一個(gè)產(chǎn)品表中,查看keyboard供應(yīng)商的其它產(chǎn)品。因?yàn)檫@里要先根據(jù)keyboard查處供應(yīng)商,再根據(jù)供應(yīng)商來(lái)查產(chǎn)品表中的其它產(chǎn)品。
SELECT p1.prod_name FROM product AS p1,product AS p2 WHERE p1.vent_id=p2.vent_id AND p2.prod_name='keyboard' ;
3:自然聯(lián)結(jié)
4:外部聯(lián)結(jié)
對(duì)每個(gè)客戶下多少訂單進(jìn)行統(tǒng)計(jì),同時(shí)還要包括哪些尚未下過(guò)訂單的客戶。
SELECT custom.cust_id,order.order_num FROM custom LEFT OUTER JOIN order ON custom.cust_id=order.cust_id;
OUT JOIN ,必須使用關(guān)鍵字RIGHT 或LEFT關(guān)鍵字指定包括其所在行的表。左右是以O(shè)UT JOIN來(lái)劃分的。
(十)組合查詢
將多個(gè)SELECT語(yǔ)句的結(jié)果,合并為一個(gè)結(jié)果返回。多數(shù)情況下多個(gè)查詢語(yǔ)句組合和多個(gè)where查詢條件完成結(jié)果相同。我們可以直接用UNION關(guān)鍵字將連兩個(gè)查詢語(yǔ)句聯(lián)合起來(lái)。
SELECT name,age,address FROM user WHERE age=20 UNION SELECT name,age,address FROM user WHERE address="beijing";
使用UNION ALL不會(huì)去掉多次查詢出現(xiàn)的相同行,否則自動(dòng)去重。要想排序的話,ORDER BY語(yǔ)句出現(xiàn)在最后一條查詢語(yǔ)句后面。
(十一)全文本搜索
常用的引擎如MyISAM支持全文本搜索,但是InnoDB不支持。
創(chuàng)建索引,可以在創(chuàng)建表時(shí)創(chuàng)建,也可以在之后修改。
INDEX,FULLTEXT,UNIQUE
SELECT describe FROM user WHERE Match(describe) Against ('love');
Match()可以指定多個(gè)列。Against()指定匹配內(nèi)容。這里是在創(chuàng)建表帶時(shí)候,就指定了FULLTEXT(describe)建立了索引。
三:插入數(shù)據(jù)
(一)依賴列的順序以及列的信息來(lái)插入行
這里假定第一列為自增量用戶id,第二列住址可以為NULL,第三列姓名,第四列年齡。如果不指定列名,就要把所有列的值都給出。因?yàn)榈谝涣惺亲栽龅模虼瞬荒苤付ㄖ怠?/p>
INSERT INTO user VALUES(NULL,NULL,'xiaguangcheng',25);
(二)安全的INSERT語(yǔ)句,可以不依賴列在表中的順序指定列名,但是值必須按照指定的列名順序給出。對(duì)于省略的列,要么在表定義中有默認(rèn)值,要么允許NULL。
INSERT INTO user(name,address,age) VALUES('xiaguangcheng','beijing',25);
(三)降低更新/刪除/添加的優(yōu)先級(jí)
因?yàn)楦滤饕臅r(shí),會(huì)影響查詢語(yǔ)句,所以可以降低其優(yōu)先級(jí)
INSERT LOW_PRIORITY INTO ...
(四)插入多行
插入多行,可以將兩條插入語(yǔ)句中間用分號(hào)隔開(kāi)。也可以在列名和次序相同的情況下,使用多個(gè)VALUES(),(),();后面的括號(hào)來(lái)添加。
INSERT INTO user(name,address,age) VALUES('xiaguangcheng','beijing',25),('xiaxuele','china',20);
(五)將舊表數(shù)據(jù)導(dǎo)入新表
INSERT INTO user(name,address,age) SELECT name,address,age FROM user_old;
上面并沒(méi)有導(dǎo)入作為自增量的userid,因?yàn)橐U蟯serid是唯一的。所以導(dǎo)入新數(shù)據(jù),mysql會(huì)自動(dòng)增加。如果能夠確保舊表與新表的userid不會(huì)重復(fù),那么也可以導(dǎo)入。當(dāng)然SELECT查詢的列名和INSERT INTO插入的列名可以不一樣。
四:更新刪除數(shù)據(jù)
(一)更新指定行
UPDATE user SET address='henan' WHERE name='xiaguangcheng';
將用戶xiaguangcheng的地址更新為henan。如果沒(méi)有WHERE就會(huì)更新所有列。
UPDATE user SET address='hubei',age=20 WHERE name='xiaguangcheng';
更新多個(gè)列用逗號(hào)隔開(kāi)。當(dāng)更新多個(gè)列時(shí),如果某個(gè)更新出錯(cuò),那么這一次操作的所有更新都會(huì)取消。如果在更新出錯(cuò)時(shí),想要出錯(cuò)之前的更新也生效,就使用IGNORE
UPDATE IGNORE user...
刪除某個(gè)列的值,可以將其設(shè)置為NULL,如果允許為NULL值的話。
(二)刪除數(shù)據(jù)
- 刪除某行
DELETE FROM user WHERE name='xiaguangcheng';
刪除某列可以使用UPDATE。如果沒(méi)有WHERE就會(huì)刪除所有行。而刪除所有行,還可以使用
TRUNCATE TABLE user
上面的語(yǔ)句實(shí)際上是刪除了原來(lái)的表,重新建了一個(gè)表。
五:創(chuàng)建和操作表
CREATE TABLE user (
user_id int NOT NULL AUTO_INCREMENT,
name char(50) NOT NULL,
address char(100) NULL,
age int NOT NULL DEFAULT 10,
PRIMARY KEY(user_id)
)ENGINE=InnoDB;
數(shù)據(jù)庫(kù)中的表需要手動(dòng)刪除,因此不用擔(dān)心會(huì)覆蓋掉。下面的語(yǔ)句是先檢查是否有同名表,但不檢查結(jié)構(gòu)是否一樣。如果沒(méi)有再創(chuàng)建新表,如果有就不創(chuàng)建。
CREATE TABLE IF NOT EXISTS user (
user_id int NOT NULL AUTO_INCREMENT,
name char(50) NOT NULL,
address char(100) NULL,
age int NOT NULL,
PRIMARY KEY(user_id)
)ENGINE=InnoDB;
- 主鍵即可以是單列,也可以是多列.不能為NULL值。
PRIMARY KEY(user_id,name)
每個(gè)表只能有一個(gè)AUTO_INCREMENT列。如果該列被手動(dòng)插入了一個(gè)唯一值,那么后續(xù)的增量將開(kāi)始使用該手工插入的值。
如何獲取自動(dòng)增量的值
SELECT last_insert_id();
返回最后一個(gè)AUTO_INCREMENT值。
- 默認(rèn)值
age int NOT NULL DEFAULT 10
如果沒(méi)有指定,就會(huì)默認(rèn)為10
- ENGINE 默認(rèn)引擎,如果不顯示指定,會(huì)有默認(rèn)值。
InnoDB支持事務(wù),不支持全文本搜索。
MyISAM支持全文本搜索,不支持事務(wù)。
- 更改表
ALTER TABLE user ADD height int NOT NULL DEFAULT 160;
給user表新增一個(gè)height字段。
ALTER TABLE user DROP COLUMN height;
刪除user表中的height字段。
ALTER常用來(lái)定義外鍵。不過(guò)這個(gè)語(yǔ)句在sqlite中并不好用。
ALTER TABLE student ADD CONSTRAINT student_id FOREIGN KEY (user_id) REFERENCES user(user_id);
上面的語(yǔ)句中,student_id是約束名稱,第一個(gè)出現(xiàn)的user_id是student表中的字段,第二個(gè)user_id是user表中的字段。
所以在sqlite中定義外鍵,最好在創(chuàng)建表的時(shí)候就指定。而且需要在命令行中打開(kāi)支持開(kāi)關(guān)。
PRAGMA foreign_keys = ON;
創(chuàng)建:
CREATE TABLE album(
albumartist TEXT,
albumname TEXT,
albumcover BINARY,
PRIMARY KEY(albumartist, albumname)
);
CREATE TABLE song(
songid INTEGER,
songartist TEXT,
songalbum TEXT,
songname TEXT,
FOREIGN KEY(songartist, songalbum) REFERENCES album(albumartist, albumname)
);
復(fù)雜表結(jié)構(gòu)更改為了安全起見(jiàn),一般步驟如下:
1:用希望的所有列創(chuàng)建一個(gè)新表
2:使用INSERT SELECT 語(yǔ)句復(fù)制內(nèi)容到新表
3:檢驗(yàn)包含所需數(shù)據(jù)的新表
4:重命名舊表
5:重命名新表
6:根據(jù)需要,重新創(chuàng)建觸發(fā)器,存儲(chǔ)過(guò)程,索引,外鍵。
- 刪除表
DROP TABLE user;
- 重命名表名
RENAME TABLE user TO new_user;
六:視圖
視圖能夠簡(jiǎn)化復(fù)雜的聯(lián)結(jié)。視圖是虛擬表。
- 創(chuàng)建視圖使用CREATE VIEW
- 查看創(chuàng)建視圖的語(yǔ)句SHOW CREATE VIEW viewname
- 刪除視圖DROP VIEW viewname
- 更新視圖可以先DROP再CREATE。也可以使用CREATE OR REPLACE VIEW
CREATE VIEW virtual_user AS SELECT name,age FROM user,student WHERE user.user_id=student.user_id;
檢索20歲還是學(xué)生的用戶
SELECT name,age FROM virtual_user WHERE age=20;
再比如要顯示name(age)
CREATE VIEW temp_user AS SELECT Concat(name,'(',age,')') as temp_title FROM user;
再這個(gè)temp_user視圖上,查詢
SELECT * FROM temp_user;
視圖更新收到分組,聯(lián)結(jié),子查詢,并,聚集,DISTINCT等限制,主要用在檢索(select)上,而不用于更新(update,insert,delete);
七:使用存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程:就是為以后的使用而保存的一條或者多條有步驟的MySQL語(yǔ)句的集合。簡(jiǎn)單,安全,高性能。
創(chuàng)建存儲(chǔ)過(guò)程
CREATE PROCEDURE xyz()
BEGIN
SELECT Avg(age) AS avg_age FROM user;
END;
如果是在命令行中執(zhí)行上面這段語(yǔ)句會(huì)出錯(cuò),需要修改為
DELIMITER //
CREATE PROCEDURE xyz()
BEGIN
SELECT Avg(age) AS avg_age FROM user;
END //
DELIMITER ;
調(diào)用上面的存儲(chǔ)過(guò)程
CALL xyz();
刪除上面的存儲(chǔ)過(guò)程
DROP PROCEDURE xyz;
刪除的時(shí)候不需要括號(hào)。
上面這個(gè)例子是不使用參數(shù)的存儲(chǔ)過(guò)程,還有使用參數(shù)的存儲(chǔ)過(guò)程,略復(fù)雜。
八:使用游標(biāo)
游標(biāo)(cursor)是一個(gè)存儲(chǔ)在MySQL服務(wù)器上的數(shù)據(jù)庫(kù)查詢, 它不是一條SELECT語(yǔ)句,而是被該語(yǔ)句檢索出來(lái)的結(jié)果集。不像多數(shù)DBMS,MySQL游標(biāo)只能用于 存儲(chǔ)過(guò)程(和函數(shù))。
CREATE PROCEDURE xyz()
BEGIN
DECLARE abc CURSOR
FOR
SELECT name FROM user;
END;
DECLARE定義了一個(gè)abc的游標(biāo)。使用游標(biāo)需要
OPEN abc;
關(guān)閉游標(biāo)
CLOSE abc;
當(dāng)游標(biāo)打開(kāi)之后可以使用FETCH語(yǔ)句分別訪問(wèn)他的每一行。
九:觸發(fā)器
當(dāng)某個(gè)表發(fā)生更改時(shí)自動(dòng)處理。創(chuàng)建觸發(fā)器
- 唯一的觸發(fā)器名
- 觸發(fā)器關(guān)聯(lián)的表
- 響應(yīng)的活動(dòng)(DELETE,INSERT,UPDATE)
- 何時(shí)執(zhí)行活動(dòng)
CREATE TRIGGER newuser AFTER INSERT ON user FOR EACH ROW SELECT 'user add';
觸發(fā)器僅支持表,不支持視圖和臨時(shí)表。每個(gè)表最多支持六個(gè)觸發(fā)器,之前之后的插入,更新和刪除。所以六個(gè)。
刪除觸發(fā)器
DROP TRIGGER newuser;
例子
CREATE TRIGGER newuser AFTER INSERT ON user FOR EACH ROW SELECT NEW.user_id;
每次插入一個(gè)用戶,都會(huì)返回插入用戶的自增id。假設(shè)user_id是自增的。這里面的NEW虛擬表是系統(tǒng)維護(hù)的,不用操心。
例子
將刪除的行保存到一個(gè)存檔表中
CREATE TRIGGER deleteuser BEFORE DELETE ON user FOR EACH ROW
BEGIN
INSERT INTO archive_user(user_id,name,address,age) VALUES(OLD.user_id,OLD.name,OLD.address,OLD.age);
END;
其中archive_user是存檔表。OLD是系統(tǒng)維護(hù)的虛擬表。
當(dāng)我們使用UPDATE觸發(fā)器時(shí)
- 可以使用OLD訪問(wèn)更新之前的值,使用NEW訪問(wèn)更新之后的值。
CREATE TRIGGER updateuser BEFORE UPDATE ON user FOR EACH ROW SET NEW.name=Upper(NEW.name);
每次更新的時(shí)候,名字都是大寫。
十:事務(wù)管理
transaction 一組sql語(yǔ)句
rollback 撤銷指定sql語(yǔ)句
commit 將未存儲(chǔ)的sql語(yǔ)句結(jié)果寫入數(shù)據(jù)庫(kù)表
savepoint 事務(wù)中的臨時(shí)占位符,可以對(duì)它發(fā)布會(huì)退。
開(kāi)始事務(wù)
START TRANSACTION;
事務(wù)不能回退SELECT語(yǔ)句,也不能回退CREATE或者DROP操作。
SELECT * FROM user;
START TRANSACTION;
DELETE FROM user;
SELECT * FROM user;
ROLLBACK;
SELECT * FROM user;
1:顯示user表非空
2:開(kāi)啟事務(wù)
3:刪除user表所有行
4:顯示user表已經(jīng)為空
5:回退事務(wù)
6:顯示user表非空
事務(wù)要么被顯示提交關(guān)閉,要么被回退關(guān)閉。
START TRANSACTION;
DELETE FROM user WHERE user_id=100;
DELETE FROM student WHERE user_id=100;
COMMIT;
如果第二條delete沒(méi)有執(zhí)行成功,那么第一條也會(huì)被自動(dòng)撤銷。否則兩條都執(zhí)行成功,就提交。
- 部分回退使用savepoint。
START TRANSACTION;
DELETE FROM user WHERE user_id=100;
SAVEPOINT delete1;
DELETE FROM student WHERE user_id=100;
SAVEPOINT delete2;
DELETE FROM student1 WHERE user_id=100;
ROLLBACK TO delete1;
當(dāng)三行都正確刪除之后,回退到指定點(diǎn)delete1;那么user表就回保存完好。
十一:全球化
SHOW CHARACTER SET;
顯示可用字符集。
SHOW COLLATION;
顯示完整字符集。
SELECT * FROM user ORDER BY name COLLATE latin1_general_cs;
使用COLLATE指定一個(gè)備用的校對(duì)順序。
十二:訪問(wèn)控制
為不同的用戶,設(shè)置不同的操作權(quán)限。MySQL上的所有用戶被保存在一個(gè)名為mysql的數(shù)據(jù)庫(kù)中
use mysql;
SELECT user FROM user;
即可查看所有的用戶。
- 創(chuàng)建一個(gè)用戶,這里給了密碼,也可以不設(shè)置密碼。
CREATE USER xia IDENTIFIED BY 'xiapassword';
- 重命名一個(gè)用戶
RENAME USER xia TO xiaguangcheng;
- 刪除一個(gè)用戶
DROP USER xiaguangcheng;
- 查看用戶權(quán)限
SHOW GRANTS FOR xiaguangcheng;
權(quán)限用用戶名和主機(jī)名結(jié)合定義。
- 更改權(quán)限
GRANT SELECT ON school.* TO xia;
給用戶xia在school數(shù)據(jù)庫(kù)中所有表的SELECT查詢權(quán)限。
- 撤銷權(quán)限
REVOKE SELECT,INSERT ON school.* FROM xia;
權(quán)限包括:
整個(gè)服務(wù)器中所有數(shù)據(jù)庫(kù)
整個(gè)數(shù)據(jù)庫(kù)中所有表
整個(gè)表
指定列
指定存儲(chǔ)過(guò)程
更改用戶密碼
SET PASSWORD FOR xia=Password('abc23rdf&4');
優(yōu)化
- 優(yōu)化查詢語(yǔ)句,實(shí)驗(yàn)聯(lián)結(jié),并,子查詢等。
- 使用EXPLAIN讓mysql解釋它如何執(zhí)行一跳查詢語(yǔ)句。
- 一般來(lái)說(shuō),存儲(chǔ)過(guò)程要比一條一條執(zhí)行要快。
- 盡量不要使用通配符*
- 在導(dǎo)入數(shù)據(jù)時(shí),關(guān)閉自動(dòng)體檢。導(dǎo)入數(shù)據(jù)后,再建立索引。
- or條件太多,可以用多條select語(yǔ)句用union連接。
- fulltext替換like
MySQL數(shù)據(jù)類型




附
adb root //確保當(dāng)前打開(kāi)的模擬器是以root身份打開(kāi)的。
cd /data/user/0/packageName/databases // 進(jìn)入databases目錄就可以ls,查看dbName了。
sqlite3 dbName.db //打開(kāi)dbName.db數(shù)據(jù)庫(kù)。
.table //可以列出打開(kāi)的這個(gè)數(shù)據(jù)庫(kù)的所有表名。
pragma table_info(tableName) // 可以查看表結(jié)構(gòu)
.schema tableName //可以查看建表語(yǔ)句
select * from sqlite_master; //由于每個(gè)數(shù)據(jù)庫(kù)都有一個(gè)sqlite_master表用來(lái)保存建表信息。因此可以查看所有表的創(chuàng)建信息。
.header on // 輸出時(shí)附帶列名
.timer on //輸出時(shí)附帶cpu執(zhí)行時(shí)間
.mode column // 左對(duì)齊輸出
.quit // 退出