《MySQL必知必會》筆記 (附Sqlite基本語句)

mac如何在命令行中進(jìn)入默認(rèn)的MySQL數(shù)據(jù)庫
  • mysql.server start 開啟數(shù)據(jù)庫服務(wù)器咽笼,因?yàn)镸ySQL是客戶-服務(wù)的數(shù)據(jù)庫操作系統(tǒng)招刨。
  • mysql -u root 使用無密碼的root用戶名登陸夹供。
mac使用SequelPro連接本地MySQL
  • host:127.0.0.1
  • name:root
  • port:3306(默認(rèn))
  • 其他不用填

一:使用數(shù)據(jù)庫

一般來說灵份,我們會將關(guān)鍵字大寫,表名哮洽,列名小寫填渠。關(guān)鍵字也可以小寫。mysql語句不區(qū)分大小寫關(guān)鍵字鸟辅。

(一) 查看當(dāng)前MySQL當(dāng)中的所有數(shù)據(jù)庫
SHOW DATABASES;
(二)使用某一個數(shù)據(jù)庫前氛什,必須指明要使用的數(shù)據(jù)庫名字
USE databaseName;

查看當(dāng)前數(shù)據(jù)庫中的所有表

SHOW TABLES;
(三)查看當(dāng)前表中的所有列名
SHOW COLUMNS FROM tableName;

或者

DESCRIBE tableName;

二:檢索數(shù)據(jù)

(一)SELECT
  • 單個列查詢
SELECT age FROM user;
  • 多列查詢
SELECT name,age FROM user;
  • 查詢所有列
SELECT * FROM user;
  • 過濾相同的行。比如當(dāng)年齡為20的有五個人時匪凉,只會返回一個20
SELECT DISTINCT age FROM user;
  • 限制結(jié)果枪眉。從第四行,開始檢索五行再层。因此如果僅僅是LIMIT 4就表示從第零行贸铜,檢索4行堡纬。
SELECT age FROM user LIMIT 3,5;
(二)排序檢索數(shù)據(jù)
  • 單個列排序。也可以使用非檢索的列來排序蒿秦。
SELECT age FROM user ORDER BY age;
  • 多個列排序烤镐。先按年齡排序,如果年齡相等棍鳖,再按照姓名排序炮叶。默認(rèn)是ASC升序排列。
SELECT age,name FROM user ORDER BY age,name;
  • 多列排序渡处。先按年齡降序排列镜悉,如果年齡相等,就會再按姓名排序骂蓖。
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ù)庫的限制,而不是查詢數(shù)據(jù)庫結(jié)果之后的限制了登下。

(三)過濾數(shù)據(jù)

1: WHERE關(guān)鍵字茫孔。會返回所有滿足條件的結(jié)果。ORDER BY應(yīng)該用在WHERE之后被芳。

SELECT age,name FROM user WHERE age=20;
  • WHERE支持的操作符
操作符 說明
= 等于
<> 不等于
!= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于
BETWEEN 在指定的兩個值之間
  • 使用限定引號
SELECT age,name FROM user WHERE name <> 'android';
  • 范圍值缰贝。在開始值和結(jié)束值之間還需要使用AND。
SELECT age,name FROM user WHERE age BETWEEN 18 AND 30;
  • 檢查NULL
SELECT age,name FROM user WHERE name IS NULL;

上面的語句會返回名字為NULL的行畔濒。

  • AND操作符,可以多個AND聯(lián)合使用
SELECT age,name,address FROM user WHERE address = 'beijing' AND age<=30;

上面這條語句表時返回地址是beijing剩晴,并且年齡小于等于30行。

  • OR操作符侵状。AND優(yōu)先級高于OR的優(yōu)先級
SELECT age,name,address FROM user WHERE age=20 OR age=25;

返回年齡是20或者25的行赞弥。

  • 使用圓括號
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這三個歲數(shù)的行绽左,并且按照名字排序。

3:NOT操作符
否定NOT后所跟的條件

SELECT age,name,address FROM user WHERE age NOT IN(50,40);

返回年齡不是50艇潭,40的所有行拼窥。

4:通配符過濾
LIKE指示后跟的搜索模式使用通配符而不是直接相等匹配。

SELECT age,name FROM user WHERE name LIKE 'xia%';

上面標(biāo)示返回所有name以xia開頭的行蹋凝。

%標(biāo)示任何字符出現(xiàn)任意次數(shù)鲁纠。xia%標(biāo)示,不管xia后面跟的是啥鳍寂,跟了多少個改含。
而%xia%,則表示只要包含著xia就會返回。%不會匹配NULL迄汛。如果這里使用了WHERE age LIKE '20'那么并不會返回年齡是20的行捍壤。但是把LIKE換成REGEXP就可以刃唤。

SELECT age,name FROM user WHERE name LIKE 'x_a';

_下劃線只匹配一個字符。不能匹配0個或多個白群。

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的所有的行翰舌。

用“\\”加在所有特殊符號之前進(jìn)行特殊符號匹配痊夭。之所以需要兩個是因?yàn)镸ySQL解釋一個,正則表達(dá)式解釋一個。


^用在集合中否定上忍,否則表示開始位置。

不使用數(shù)據(jù)庫測試正則表達(dá)式

SELECT 'hello' REGEXP '[0-9]'
(四)在SELECT中創(chuàng)建計算字段
  • 拼接兩個列盯拱。MySql使用Concat()祥得,其他sql或許可以使用+或者用||來拼接。
SELECT Concat(name,'(',age,')') FROM user ;

上面就回以name(age)的方式輸出橄碾。實(shí)際上Concat是將name卵沉,(,age,)一共四個部分組合到一起的法牲。

SELECT Concat(RTrim(name),'(',age,')') FROM user ;

在上面的基礎(chǔ)上史汗,通過函數(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就會變成大寫,并以upName字段輸出悼瓮。



假如有字段birthday的存儲為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ù)據(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)有多個20時翅萤,只取一個用來計算)平均值恐疲。

  • COUNT()兩種用法。一種是COUNT(*),總行數(shù)包括NULL行套么,一種是COUNT(address)培己,只對address非NULL的行數(shù)計數(shù)。
SELECT COUNT(*) AS num_count FROM user;
  • SUM()不僅可以用來計算指定列值的和胚泌,還可以用來合計計算值省咨。
(七)分組數(shù)據(jù)
SELECT address,COUNT(*) AS count_address FROM user GROUP BY address;

返回按照地址分組的,每個地址的總行數(shù)玷室。

GROUP BY語句需要在WHERE語句之后零蓉,出現(xiàn)在ORDER BY語句之前笤受。

  • 過濾分組
SELECT address,COUNT(*) AS count_address FROM user GROUP BY address HAVING COUNT(*)>=2;

返回按照地址分組的,每個地址至少有兩行的每個地址的總行數(shù)敌蜂。

  • WHERE 與 HAVING的區(qū)別

where過濾實(shí)在分組之前箩兽,HAVING是在分組后過濾。where過濾掉行不在分組中章喉。

SELECT address,COUNT(*) AS count_address FROM user WHERE age >20 GROUP BY address HAVING COUNT(*)>=2;

首先去掉那些年齡小于21的行

然后按照地址分組

最后顯示分組中超過兩行的



(八) 子查詢

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


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


(九) 聯(lián)結(jié)表

聯(lián)結(jié)是利用SQL的SELECT能執(zhí)行的最重要的操作摊唇。
1:簡單聯(lián)結(jié)/內(nèi)部聯(lián)結(jié)/等值聯(lián)結(jié)
假設(shè)供應(yīng)商表只有供應(yīng)商名稱和id咐蝇,產(chǎn)品表有產(chǎn)品信息及產(chǎn)品對應(yīng)的供應(yīng)商id。那么我們想要所有供應(yīng)商對應(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;

上面的語句也可以轉(zhuǎn)換為

SELECT vernt_name,prod_name,prod_price FROM vent INNER JOIN product ON vent.vent_id=product.vent_id;

當(dāng)需要同時查閱多個表時巷查,既可以使用子查詢有序,也可以使用聯(lián)結(jié)查詢

字段別名是會返回到客戶端的,但是表別名則不會

2:自聯(lián)結(jié)
相同表中多次查詢可以使用自聯(lián)結(jié)岛请。我們在FROM中使用表別名笔呀。假設(shè)我們要在同一個產(chǎn)品表中,查看keyboard供應(yīng)商的其它產(chǎn)品髓需。因?yàn)檫@里要先根據(jù)keyboard查處供應(yīng)商许师,再根據(jù)供應(yīng)商來查產(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é)
對每個客戶下多少訂單進(jìn)行統(tǒng)計僚匆,同時還要包括哪些尚未下過訂單的客戶微渠。

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來劃分的咧擂。

(十)組合查詢

將多個SELECT語句的結(jié)果逞盆,合并為一個結(jié)果返回。多數(shù)情況下多個查詢語句組合和多個where查詢條件完成結(jié)果相同松申。我們可以直接用UNION關(guān)鍵字將連兩個查詢語句聯(lián)合起來云芦。

SELECT name,age,address FROM user WHERE age=20 UNION SELECT name,age,address FROM user WHERE address="beijing";

使用UNION ALL不會去掉多次查詢出現(xiàn)的相同行,否則自動去重贸桶。要想排序的話舅逸,ORDER BY語句出現(xiàn)在最后一條查詢語句后面。

(十一)全文本搜索

常用的引擎如MyISAM支持全文本搜索皇筛,但是InnoDB不支持琉历。

創(chuàng)建索引,可以在創(chuàng)建表時創(chuàng)建,也可以在之后修改旗笔。

INDEX,FULLTEXT,UNIQUE

SELECT describe FROM user WHERE Match(describe) Against ('love');

Match()可以指定多個列彪置。Against()指定匹配內(nèi)容。這里是在創(chuàng)建表帶時候蝇恶,就指定了FULLTEXT(describe)建立了索引拳魁。

三:插入數(shù)據(jù)

(一)依賴列的順序以及列的信息來插入行

這里假定第一列為自增量用戶id,第二列住址可以為NULL,第三列姓名撮弧,第四列年齡的猛。如果不指定列名,就要把所有列的值都給出想虎。因?yàn)榈谝涣惺亲栽龅模虼瞬荒苤付ㄖ怠?/p>

INSERT INTO user VALUES(NULL,NULL,'xiaguangcheng',25);
(二)安全的INSERT語句,可以不依賴列在表中的順序指定列名叛拷,但是值必須按照指定的列名順序給出舌厨。對于省略的列,要么在表定義中有默認(rèn)值忿薇,要么允許NULL裙椭。
INSERT INTO user(name,address,age) VALUES('xiaguangcheng','beijing',25);
(三)降低更新/刪除/添加的優(yōu)先級

因?yàn)楦滤饕臅r,會影響查詢語句署浩,所以可以降低其優(yōu)先級

INSERT LOW_PRIORITY INTO ...
(四)插入多行

插入多行揉燃,可以將兩條插入語句中間用分號隔開。也可以在列名和次序相同的情況下筋栋,使用多個VALUES(),(),();后面的括號來添加炊汤。

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;

上面并沒有導(dǎo)入作為自增量的userid,因?yàn)橐U蟯serid是唯一的弊攘。所以導(dǎo)入新數(shù)據(jù)抢腐,mysql會自動增加。如果能夠確保舊表與新表的userid不會重復(fù)襟交,那么也可以導(dǎo)入迈倍。當(dāng)然SELECT查詢的列名和INSERT INTO插入的列名可以不一樣。

四:更新刪除數(shù)據(jù)

(一)更新指定行
UPDATE user SET address='henan' WHERE name='xiaguangcheng';

將用戶xiaguangcheng的地址更新為henan捣域。如果沒有WHERE就會更新所有列啼染。

UPDATE user SET address='hubei',age=20 WHERE name='xiaguangcheng';

更新多個列用逗號隔開。當(dāng)更新多個列時焕梅,如果某個更新出錯迹鹅,那么這一次操作的所有更新都會取消。如果在更新出錯時贞言,想要出錯之前的更新也生效徒欣,就使用IGNORE

UPDATE IGNORE user...

刪除某個列的值,可以將其設(shè)置為NULL蜗字,如果允許為NULL值的話打肝。

(二)刪除數(shù)據(jù)
  • 刪除某行
DELETE FROM user WHERE name='xiaguangcheng';

刪除某列可以使用UPDATE脂新。如果沒有WHERE就會刪除所有行。而刪除所有行粗梭,還可以使用

TRUNCATE TABLE user

上面的語句實(shí)際上是刪除了原來的表争便,重新建了一個表。

五:創(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ù)庫中的表需要手動刪除断医,因此不用擔(dān)心會覆蓋掉滞乙。下面的語句是先檢查是否有同名表,但不檢查結(jié)構(gòu)是否一樣鉴嗤。如果沒有再創(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)
  • 每個表只能有一個AUTO_INCREMENT列。如果該列被手動插入了一個唯一值硬耍,那么后續(xù)的增量將開始使用該手工插入的值垄琐。

  • 如何獲取自動增量的值

SELECT last_insert_id();

返回最后一個AUTO_INCREMENT值。

  • 默認(rèn)值
age int NOT NULL DEFAULT 10

如果沒有指定经柴,就會默認(rèn)為10

  • ENGINE 默認(rèn)引擎狸窘,如果不顯示指定,會有默認(rèn)值坯认。

InnoDB支持事務(wù)翻擒,不支持全文本搜索。

MyISAM支持全文本搜索牛哺,不支持事務(wù)韭寸。

  • 更改表
ALTER TABLE user ADD height int NOT NULL DEFAULT 160;

給user表新增一個height字段。

ALTER TABLE user DROP COLUMN height;

刪除user表中的height字段荆隘。

ALTER常用來定義外鍵恩伺。不過這個語句在sqlite中并不好用。

ALTER TABLE student ADD CONSTRAINT student_id FOREIGN KEY (user_id) REFERENCES user(user_id);

上面的語句中椰拒,student_id是約束名稱晶渠,第一個出現(xiàn)的user_id是student表中的字段,第二個user_id是user表中的字段燃观。

所以在sqlite中定義外鍵褒脯,最好在創(chuàng)建表的時候就指定。而且需要在命令行中打開支持開關(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)更改為了安全起見番川,一般步驟如下:

1:用希望的所有列創(chuàng)建一個新表

2:使用INSERT SELECT 語句復(fù)制內(nèi)容到新表

3:檢驗(yàn)包含所需數(shù)據(jù)的新表

4:重命名舊表

5:重命名新表

6:根據(jù)需要,重新創(chuàng)建觸發(fā)器,存儲過程颁督,索引践啄,外鍵。

  • 刪除表
DROP TABLE user;
  • 重命名表名
RENAME TABLE user TO new_user;

六:視圖

視圖能夠簡化復(fù)雜的聯(lián)結(jié)沉御。視圖是虛擬表屿讽。

  • 創(chuàng)建視圖使用CREATE VIEW
  • 查看創(chuàng)建視圖的語句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;

再這個temp_user視圖上吠裆,查詢

SELECT * FROM temp_user;

視圖更新收到分組伐谈,聯(lián)結(jié),子查詢试疙,并诵棵,聚集,DISTINCT等限制祝旷,主要用在檢索(select)上履澳,而不用于更新(update,insert,delete);

七:使用存儲過程

存儲過程:就是為以后的使用而保存的一條或者多條有步驟的MySQL語句的集合。簡單缓屠,安全,高性能护侮。
創(chuàng)建存儲過程

CREATE PROCEDURE xyz() 
BEGIN 
SELECT Avg(age) AS avg_age FROM user;
END;

如果是在命令行中執(zhí)行上面這段語句會出錯敌完,需要修改為

DELIMITER //

CREATE PROCEDURE xyz()
BEGIN
SELECT Avg(age) AS avg_age FROM user;
END //

DELIMITER ;

調(diào)用上面的存儲過程

CALL xyz();

刪除上面的存儲過程

DROP PROCEDURE xyz;

刪除的時候不需要括號。
上面這個例子是不使用參數(shù)的存儲過程羊初,還有使用參數(shù)的存儲過程滨溉,略復(fù)雜。

八:使用游標(biāo)

游標(biāo)(cursor)是一個存儲在MySQL服務(wù)器上的數(shù)據(jù)庫查詢, 它不是一條SELECT語句,而是被該語句檢索出來的結(jié)果集长赞。不像多數(shù)DBMS,MySQL游標(biāo)只能用于 存儲過程(和函數(shù))晦攒。

CREATE PROCEDURE xyz()
BEGIN
DECLARE abc CURSOR
FOR
SELECT name FROM user;
END;

DECLARE定義了一個abc的游標(biāo)。使用游標(biāo)需要

OPEN abc;

關(guān)閉游標(biāo)

CLOSE abc;

當(dāng)游標(biāo)打開之后可以使用FETCH語句分別訪問他的每一行得哆。

九:觸發(fā)器

當(dāng)某個表發(fā)生更改時自動處理脯颜。創(chuàng)建觸發(fā)器

  • 唯一的觸發(fā)器名
  • 觸發(fā)器關(guān)聯(lián)的表
  • 響應(yīng)的活動(DELETE,INSERT,UPDATE)
  • 何時執(zhí)行活動
CREATE TRIGGER newuser AFTER INSERT ON user FOR EACH ROW SELECT 'user add';

觸發(fā)器僅支持表,不支持視圖和臨時表贩据。每個表最多支持六個觸發(fā)器栋操,之前之后的插入,更新和刪除饱亮。所以六個矾芙。

刪除觸發(fā)器

DROP TRIGGER newuser;

例子

CREATE TRIGGER newuser AFTER INSERT ON user FOR EACH ROW SELECT NEW.user_id;

每次插入一個用戶,都會返回插入用戶的自增id近上。假設(shè)user_id是自增的剔宪。這里面的NEW虛擬表是系統(tǒng)維護(hù)的,不用操心。

例子

將刪除的行保存到一個存檔表中

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ā)器時

  • 可以使用OLD訪問更新之前的值,使用NEW訪問更新之后的值哈街。
CREATE TRIGGER updateuser BEFORE UPDATE ON user FOR EACH ROW SET NEW.name=Upper(NEW.name);

每次更新的時候留瞳,名字都是大寫。

十:事務(wù)管理

  • transaction 一組sql語句

  • rollback 撤銷指定sql語句

  • commit 將未存儲的sql語句結(jié)果寫入數(shù)據(jù)庫表

  • savepoint 事務(wù)中的臨時占位符骚秦,可以對它發(fā)布會退她倘。

  • 開始事務(wù)

START TRANSACTION;

事務(wù)不能回退SELECT語句,也不能回退CREATE或者DROP操作作箍。

SELECT * FROM user;
START TRANSACTION;
DELETE FROM user;
SELECT * FROM user;
ROLLBACK;
SELECT * FROM user;

1:顯示user表非空

2:開啟事務(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沒有執(zhí)行成功胞得,那么第一條也會被自動撤銷荧止。否則兩條都執(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指定一個備用的校對順序猪半。

十二:訪問控制

為不同的用戶兔朦,設(shè)置不同的操作權(quán)限。MySQL上的所有用戶被保存在一個名為mysql的數(shù)據(jù)庫中

use mysql;
SELECT user FROM user;

即可查看所有的用戶磨确。

  • 創(chuàng)建一個用戶沽甥,這里給了密碼,也可以不設(shè)置密碼乏奥。
CREATE USER xia IDENTIFIED BY 'xiapassword';
  • 重命名一個用戶
RENAME USER xia TO xiaguangcheng;
  • 刪除一個用戶
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ù)庫中所有表的SELECT查詢權(quán)限。

  • 撤銷權(quán)限
REVOKE SELECT,INSERT ON school.* FROM xia;

權(quán)限包括:

  • 整個服務(wù)器中所有數(shù)據(jù)庫

  • 整個數(shù)據(jù)庫中所有表

  • 整個表

  • 指定列

  • 指定存儲過程

  • 更改用戶密碼

SET PASSWORD FOR xia=Password('abc23rdf&4');

優(yōu)化

  • 優(yōu)化查詢語句邓了,實(shí)驗(yàn)聯(lián)結(jié)盏檐,并,子查詢等驶悟。
  • 使用EXPLAIN讓mysql解釋它如何執(zhí)行一跳查詢語句胡野。
  • 一般來說,存儲過程要比一條一條執(zhí)行要快痕鳍。
  • 盡量不要使用通配符*
  • 在導(dǎo)入數(shù)據(jù)時硫豆,關(guān)閉自動體檢龙巨。導(dǎo)入數(shù)據(jù)后,再建立索引熊响。
  • or條件太多旨别,可以用多條select語句用union連接。
  • fulltext替換like

MySQL數(shù)據(jù)類型

  • 郭霖的博客汗茄。
  • 菜鳥教程秸弛。
  • 如果想在模擬器中查看App的數(shù)據(jù)庫,可以如此操作
adb root    //確保當(dāng)前打開的模擬器是以root身份打開的洪碳。
cd /data/user/0/packageName/databases   // 進(jìn)入databases目錄就可以ls递览,查看dbName了。
sqlite3 dbName.db  //打開dbName.db數(shù)據(jù)庫瞳腌。
.table  //可以列出打開的這個數(shù)據(jù)庫的所有表名绞铃。
pragma table_info(tableName)  // 可以查看表結(jié)構(gòu)  
.schema tableName  //可以查看建表語句
select * from sqlite_master;   //由于每個數(shù)據(jù)庫都有一個sqlite_master表用來保存建表信息。因此可以查看所有表的創(chuàng)建信息嫂侍。 
.header on // 輸出時附帶列名
.timer on //輸出時附帶cpu執(zhí)行時間
.mode column // 左對齊輸出
.quit // 退出
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末儿捧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挑宠,更是在濱河造成了極大的恐慌菲盾,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件各淀,死亡現(xiàn)場離奇詭異懒鉴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)揪阿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門疗我,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咆畏,“玉大人南捂,你說我怎么就攤上這事【烧遥” “怎么了溺健?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钮蛛。 經(jīng)常有香客問我鞭缭,道長,這世上最難降的妖魔是什么魏颓? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任岭辣,我火速辦了婚禮,結(jié)果婚禮上甸饱,老公的妹妹穿的比我還像新娘沦童。我一直安慰自己仑濒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布偷遗。 她就那樣靜靜地躺著墩瞳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氏豌。 梳的紋絲不亂的頭發(fā)上喉酌,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音泵喘,去河邊找鬼泪电。 笑死,一個胖子當(dāng)著我的面吹牛涣旨,可吹牛的內(nèi)容都是我干的歪架。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼霹陡,長吁一口氣:“原來是場噩夢啊……” “哼和蚪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烹棉,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤攒霹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浆洗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體催束,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年伏社,在試婚紗的時候發(fā)現(xiàn)自己被綠了抠刺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡摘昌,死狀恐怖速妖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情聪黎,我是刑警寧澤罕容,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站稿饰,受9級特大地震影響锦秒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喉镰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一旅择、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侣姆,春花似錦生真、人聲如沸脖咐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屁擅。三九已至,卻和暖如春产弹,著一層夾襖步出監(jiān)牢的瞬間派歌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工痰哨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胶果,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓斤斧,卻偏偏與公主長得像早抠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撬讽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容