MySQL學(xué)習(xí)筆記

目錄

  • MySQL簡介
  • 基本輸入查詢
  • 創(chuàng)建并使用數(shù)據(jù)庫
  • SELECT語句
  • 選擇特殊行
  • 條件
  • 通配符
  • 選擇特殊列
  • 排序
  • 內(nèi)置函數(shù)
  • 日期計算
  • 子查詢
  • 連接查詢
  • 修改和刪除
  • 刪除
  • ALTER 改寫歷史
  • 對表的內(nèi)容修改
  • 索引
  • 視圖
  • 導(dǎo)入與導(dǎo)出數(shù)據(jù)
  • 備份數(shù)據(jù)
  • 恢復(fù)
  • SQL 約束
  • 主鍵
  • 默認(rèn)約束
  • 唯一約束值
  • 外鍵約束
  • 非空約束

MySQL簡介

  1. 數(shù)據(jù)庫:保存表和其他相關(guān)SQL結(jié)果的容器
  2. 列是存儲在表中的一塊數(shù)據(jù)煎源。行是一組能夠描述某個事物的流的集合南窗。行和列構(gòu)成了表
  3. 數(shù)據(jù)庫中所有的表應(yīng)該能以某種方式相互關(guān)聯(lián)

基本輸入查詢

  1. 啟動與連接服務(wù)器
sudo service mysql start
mysql -u root
  1. 要求服務(wù)器告訴MySQL的版本號和當(dāng)前日期榜揖。
SELECT VERSION(), CURRENT_DATE;
  1. 不想執(zhí)行正在輸入過程中的一個命令仰楚,輸入\c取消它
SELECT  USER()  \c
  1. 找出服務(wù)器上當(dāng)前存在什么數(shù)據(jù)庫
SHOW DATABASES;

創(chuàng)建并使用數(shù)據(jù)庫

  1. 創(chuàng)建數(shù)據(jù)庫 gregs_list
CREATE DATABASE gregs_list;
  1. 使用剛才的數(shù)據(jù)庫
USE gregs_list;
  1. 創(chuàng)建一個表
 CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
                     species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
  • CRATE TABLE 創(chuàng)建表
  • 括號里輸入表列和列名稱
  • VARCHAR:保存以文本格式存儲的信息
  • (20):表示這段文字的長度最多只有6個字符
  1. 各種數(shù)據(jù)類型
  • CHAR / CHARACTER
  • INT / INTEGER
  • DEC, DECIMAL
  • BLOB
  • DATE
  • TIMESTAMP / DATETIME
  • VARCHAR
  1. 驗證表是按你期望的方式創(chuàng)建
DESC pet; 
  1. 展示數(shù)據(jù)庫中的所有表
SHOW TABLES;
  1. 刪除創(chuàng)建的表
DROP TABLE pet;
  1. 添加數(shù)據(jù):INSERT
INSERT INTO pet
            VALUES ('zhangyu','Diane','hamster','f','1994-03-',NULL);

INSERT 語句的三種形式

  • 改變列順序:可改變列名和數(shù)據(jù)值的順序
  • 省略列名:數(shù)據(jù)值必須有,且與列順序完全相同
  • 省略部分列
  1. SELECT語句查看表中檢索所有記錄
 SELECT*FROM my_contacts;
  1. 用一個UPDATE語句就可以修正錯誤記錄
UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';
  1. NULL:代表未定義的值
    可以把列改為不接受NULL颜曾,但一定要提供NOT NULL列的值纠拔,否則會出現(xiàn)錯誤信息
CREATE TABLE my_contacts
 (last_name VARCHAR (30) NOT null);
  1. 使用DEFAULT 填補空白

如果某些列通常有某個特定值,可把特定值指派為DEFAULT默認(rèn)值
跟在DEFAULT關(guān)鍵字后的值會在每次新增記錄時自動插入表中泛豪。
默認(rèn)值的類型必須和列類型相同

CREATE TABLE doughnut_list
( doughnut_name VARCHAR(10) NOT NULL,
doughnut_cost DEC(3,2) NOT NULL DEFAULT 1.00);

SELECT語句

SELECT 語句的基本格式為:
SELECT 要查詢的列名 FROM 表名字 WHERE 限制條件;

選擇特殊行

  1. WHERE :提供搜索的特定條件
SELECT * FROM my_contacts
 WHERE first_name = 'zhang';

* : 返回表中的所有列

  1. 單引號與不需要單引號
    數(shù)據(jù)類型中,VARCHAR, CHAR,BLOB,DATA,TIME需要單引號侦鹏。數(shù)字類的類型诡曙,DEC和INT不需要引號

  2. 當(dāng)單引號為特殊字符,需加反斜線在單引號前再加單引號

INSERT INTO my_contacts
(location)
VALUES
('Grover\'s Mill');
INSERT INTO my_contacts
(location)
VALUES
('Grover''s Mill');
  1. 只顯示特定數(shù)據(jù)
    用列名代替*
SELECT drink_name, main, second FROM easy_drinks WHERE main ='soda';
  1. AND 同時處理兩項查詢
SELECT drink_name FROM easy_drinks
 WHERE
 main = 'soda'
 AND
 amount1 = 1.5
  1. OR:返回符合條件之一的數(shù)據(jù)
SELECT field1_index, field2_index FROM test_table
WHERE field1_index = '1' OR  field2_index = '1'
  1. 使用UNION將兩個表里面的關(guān)鍵字一起使用進行搜索
SELECT field1_index, field2_index
    FROM test_table WHERE field1_index = '1'
    UNION
SELECT field1_index, field2_index
    FROM test_table WHERE field2_index = '1';
  1. 比較運算符
  • =
  • <> / !=
  • (>=)
  • <=
  • 可用于數(shù)據(jù)數(shù)據(jù)或文本數(shù)據(jù)的比較
SELECT drink_name
 FROM drink_info
 WHERE 
 drink_name >= 'L'
 AND
drink_name < 'M';
  1. 用 IS NULL 找到 NULL
    唯一直接選擇NULL 的方法是利用關(guān)鍵字IS NULL
SELECT drink_name
 FROM drink_info
 WHERE
  calories IS NULL;
  1. 選取一個范圍
  • AND
SELECT drink_name FROM drink_info
WHERE
calories >= 30
AND
calories <= 60;
  • BETWEEN
SELECT drink_name FROM drink_info
WHERE
calories BETWEEN 30 AND 60;
  1. 查找是否在多個篩選條件 IN
SELECT date_name FROM 
 black_book 
 WHERE
 rating IN('innovative', 'fabulous', 
 'delightful', 'pretty good');
  • 或者不符合特征的結(jié)果NOT IN
SELECT date_name from black_book
 WHERE NOT date_name LIKE  'A%'
AND NOT date_name LIKE 'B%';
  1. LIKE 查找部分文本字符串并返回所有符合匹配條件的行
  • 通配符%——任意數(shù)量未知字符的替身

找出以“b”開頭的名字的動物信息
找出以“fy”結(jié)尾的名字
找出包含“w”的名字

mysql> SELECT * FROM pet WHERE name LIKE 'b%';
mysql> SELECT * FROM pet WHERE name LIKE '%fy';
mysql> SELECT * FROM pet WHERE name LIKE '%w%';
SELECT * FROM pet WHERE name LIKE '_____';
  • 通配符下劃線(_)——一個未知字符的替身
SELECT first_name FROM my_contacts WHERE first_name LIKE '_im';

查詢結(jié)果例如:Kim

  1. 如果你不想看到表中的所有行略水,就需要指明你感興趣的列名稱价卤,并用逗號將列名分開。例如渊涝,如果你想要知道你的動物什么時候出生的慎璧,選擇name和birth列
SELECT name, birth FROM pet;
  1. 取出重復(fù)數(shù)據(jù),增加關(guān)鍵字DISTINCT檢索出每條唯一的輸出記錄
 SELECT DISTINCT owner FROM pet;
  1. 使用一個WHERE子句同時進行行選擇與列選擇跨释。例如胸私,要想查詢狗和貓的出生日期,使用以下查詢:
SELECT name, species, birth FROM pet
     WHERE species = 'dog' OR species = 'cat';

排序

  1. 對表pet的生日按日期排序ORDER BY
SELECT name, birth FROM pet ORDER BY birth;
  1. BINARY強制執(zhí)行區(qū)分大小寫
SELECT col_name, birth FROM pet ORDER BY BINARY col_name
  1. 默認(rèn)排序是升序鳖谈,也就是最小的值排在第一岁疼。要想以降序排序,在你正在排序的列名旁邊增加DESC(降序 )關(guān)鍵字
SELECT name, birth FROM pet ORDER BY birth DESC;
  1. 可以對多個列進行排序缆娃,并且可以按不同的方向?qū)Σ煌牧羞M行排序捷绒。

例如,按升序?qū)游锏姆N類進行排序贯要,然后按降序根據(jù)生日對各動物種類進行排序(最年輕的動物在最前面)暖侨,使用下列查詢

SELECT name, species, birth FROM pet
 -> ORDER BY species, birth DESC;

內(nèi)置函數(shù)

|函數(shù)名|COUNT|SUM|AVG|MAX|MIN|
|作用|計數(shù)|求和|求平均值|最大值|最小值|

  1. 計算表中有多少行COUNT(*)
SELECT COUNT(*) FROM pet;
  1. 你檢索了擁有寵物的人的名字。如果你想要知道每個主人有多少寵物崇渗,你也可以使用COUNT(*)函數(shù),使用GROUP BY對每個owner的所有記錄分組
SELECT owner, COUNT(*) FROM pet GROUP BY owner;
  1. 分類數(shù)量

查看每種動物的數(shù)量

查看每種性別的動物數(shù)量
按種類和性別組合分類的動物數(shù)量

SELECT species, COUNT(*) FROM pet GROUP BY species;
SELECT sex, COUNT(*) FROM pet GROUP BY sex;
SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
  1. 計算出salary的最大字逗、最小值
SELECT MAX(salary) AS max_salary,MIN(salary) FROM employee;
  1. 找出最高或最低的商品
SELECT min_price:=MIN(price),max_price:=MAX(price) FROM shop;
 SELECT * FROM shop WHERE price= min_price OR price= max_price;

日期計算

  1. 使用函數(shù)TIMESTAMPDIFF()計算當(dāng)前日期的年和出生日期之間的差也可以按照直接使用語句(YEAR(CURDATE())-YEAR(birth))計算,其中函數(shù)CURDATE()是計算當(dāng)前的日期函荣。如果當(dāng)前日期的日歷年比出生日期早,則減去一年扳肛。
 SELECT name, birth, CURDATE(),
     TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
     FROM pet;
 SELECT name, birth, CURDATE(),
     (YEAR(CURDATE())-YEAR(birth))
     - (RIGHT(CURDATE(),5)<RIGHT(birth,5)) AS age  
    FROM pet;

YEAR()提取日期的年部分
RIGHT()提取日期最右面5個字符的MM-DD(月份和日期)部分
MM-DD值的表達式部分的值一般為1或0傻挂,如果CURDATE()的年比birth的年早,則年份應(yīng)減去1
整個表達式看起來有些難懂挖息,使用age來使輸出的列標(biāo)記更有意義

  1. 如果以某個順序排列行金拒,那么會使得瀏覽結(jié)果變得更加輕松。添加ORDER BY name子句則能夠?qū)崿F(xiàn)按照名字進行排序輸出
SELECT name, birth, CURDATE(),(YEAR(CURDATE())-YEAR(birth)) - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
     AS age
     FROM pet ORDER BY name;

子查詢

  1. 處理多個表才能獲得想要的信息

想要知道名為 "Tom" 的員工所在部門做了幾個工程套腹。員工信息儲存在 employee 表中绪抛,但工程信息儲存在project 表中

SELECT of_dpt,COUNT(proj_name) AS count_project FROM project
WHERE of_dpt IN
(SELECT in_dpt FROM employee WHERE name='Tom');
  1. event表中有生產(chǎn)日期,但是為了計算年齡电禀,你需要出生日期幢码,存儲在pet表中。查詢需要兩個表
  • FROM子句連接兩個表尖飞,因為查詢需要從兩個表中提取信息
  • 當(dāng)從多個表組合(聯(lián)結(jié))信息時症副,你需要指定其中一個表中的列明以期匹配其它表的列名。這很簡單政基,因為它們都有一個name列贞铣,查詢可以通過使用WHERE子句基于name值來匹配兩個表中的記錄
  • 因為name列都存在兩個表中,因此當(dāng)引用該列時沮明,一定要指定是哪個表辕坝,把表名附在列名前即可以實現(xiàn)
SELECT pet.name,
  (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age,
  remark
  FROM pet, event
  WHERE pet.name = event.name AND event.type = 'litter';

連接查詢

在處理多個表時,子查詢只有在結(jié)果來自一個表時才有用荐健。但如果需要顯示兩個表或多個表中的數(shù)據(jù)酱畅,這時就必須使用連接 (join) 操作。

  1. 連接的基本思想是把兩個或多個表當(dāng)作一個新的表來操作江场,如下
SELECT id,name,people_num
FROM employee,department
WHERE employee.in_dpt = department.dpt_name
ORDER BY id;
  1. 另一個連接語句格式是使用 JOIN ON 語法纺酸,剛才的語句等同于:
SELECT id,name,people_num
FROM employee JOIN department
ON employee.in_dpt = department.dpt_name
ORDER BY id;
  1. 如果你想要將一個表的記錄與該表的其它記錄進行比較,可以將該表聯(lián)結(jié)到自身扛稽。

例如吁峻,為了在你的寵物之中選擇繁殖中的配偶,你可以用pet表聯(lián)結(jié)自身來進行相同種類的雄雌配對:
為表名指定別名p1和p2以便能引用它們的列并且使得每一個列的引用更直觀

SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
 FROM pet AS p1, pet AS p2
 WHERE p1.species = p2.species AND p1.sex = 'f' AND p2.sex = 'm';

修改和刪除

刪除

  1. 刪除數(shù)據(jù)庫 DROP
DROP DATABASE test_01;
  1. 創(chuàng)建新記錄并刪除舊記錄

SELECT——INSERT——DELETE在张,先用SELECT 挑選你必須移除的記錄用含,確認(rèn)記錄無誤,并沒有誤刪其他記錄帮匾,用INSERT添加新的信息啄骇,再刪除舊的信息

SELECT * FROM clown_info
WHERE
activities = 'dancing';
INSERT INTO clown_info
    VALUES
    ('CLARABELLE', 'Belmont senior', 'F,pink hair', 'dancing');
DELETE FROM clown_info
    WHERE
   activities = 'yelling, dancing' AND name = 'Clarabelle';
  1. 刪除一張表
DDROP TABLE 表名字;
  1. 刪除一列:
ALTER TABLE 表名字 DROP COLUMN 列名字;
或: ALTER TABLE 表名字 DROP 列名字;

ALTER 改寫歷史

  1. 添加一列
ALTER TABLE 表名字 ADD COLUMN 列名字 數(shù)據(jù)類型 約束;
或:
 ALTER TABLE 表名字 ADD 列名字 數(shù)據(jù)類型 約束;
  1. 如果要把增加的列插入在指定位置,則需要在語句的最后使用AFTER關(guān)鍵詞
ALTER TABLE employee ADD weight INT(4) DEFAULE 120 AFTER age;

ADD COLUMN 添加列
AFTER 列 表示新增的列被放置在 列1 的后面,
DEFAULT 120 :新增的一列weight的默認(rèn)數(shù)值都為值為120
如果想放在第一列的位置瘟斜,則使用FIRST 關(guān)鍵詞

  1. 修改表的常用命令
    • CHANGE :可同時改變現(xiàn)有列的名稱和數(shù)據(jù)類型
  • MODIFY:修改現(xiàn)有列的數(shù)據(jù)類型和位置
  • ADD:在當(dāng)前表中添加一列
  • DROP:從表中刪除某列
  • DESCRIBE 查看表的構(gòu)成
  1. 更換列名

修改數(shù)據(jù)類型可能會導(dǎo)致數(shù)據(jù)丟失缸夹,所以要慎重使用

ALTER TABLE 表名字 CHANGE 原列名 新列名 數(shù)據(jù)類型 約束;
  1. 改變列名痪寻,并標(biāo)注為主鍵
ALTER TABLE project_list
CHANGE COLUMN number proj_id INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (proj_id);

AUTO_INCREMENT自動填入遞增的整數(shù)
ADD......——使用新命令的列作為主鍵

  1. 重命名一張表,三種形式:
RENAME TABLE 原名 TO 新名字;
ALTER TABLE 原名 RENAME 新名;
ALTER TABLE 原名 RENAME TO 新名;
 ALTER TABLE projekts 
RENAME TO project_list;
  1. 只改變數(shù)據(jù)類型, 關(guān)鍵字:MODIFY
 ALTER TABLE project_list
   MODIFY COLUMN proj_desc VARCHAR(120);

project_list 要修改的列名
VARCHAR(120)新數(shù)據(jù)類型虽惭, 保證新類型不會造成舊數(shù)據(jù)被截斷橡类。

  1. 刪除一列:
ALTER TABLE 表名字 DROP COLUMN 列名字;
或: ALTER TABLE 表名字 DROP 列名字;
ALTER TABLE project_list
  DROP COLUMN start_date;
  1. 使用FIRST, LAST, BEFORE column_name, AFTER column_name, SECOND,THIRD, FOURTH等關(guān)鍵字,可調(diào)整列的順序
  2. 改變數(shù)據(jù)類型
ALTER TABLE 表名字 MODIFY 列名字 新數(shù)據(jù)類型;
  1. 將現(xiàn)有列的內(nèi)容填入新列
UPDATE my_contacts
SET state = RIGHT(location, 2);

(state, 儲存州數(shù)據(jù)的新列
RIGHT........提取location列的最后兩個字符)

對表的內(nèi)容修改

  1. 修改表中某個值
UPDATE 表名字 SET 列1=值1,列2=值2 WHERE 條件;
UPDATE doughnut_ratings
   SET
   type = 'glazed'
   WHERE type = 'plain glazed';

不加where子句芽唇,SET子句提到的表中的每行的每列都會被修改

  • 一次更改多個數(shù)值
UPDATE drink_info
  SET cost = cost + 1
 WHERE
  drink_name = 'Blue Moon'
  OR
 drink_name = 'Oh My Gosh'
 OR
  drink_name = 'Lime Fizz';
  1. 刪除一行記錄

刪除表中的一行數(shù)據(jù)顾画,也必須加上WHERE條件,否則整列的數(shù)據(jù)都會被刪除

DELETE FROM 表名字 WHERE 條件;

索引

  1. 什么是索引
    索引是一種與表有關(guān)的結(jié)構(gòu)匆笤,它的作用相當(dāng)于書的目錄研侣,可以根據(jù)目錄中的頁碼快速找到所需的內(nèi)容
    • 當(dāng)表中有大量記錄時,若要對表進行查詢炮捧,沒有索引的情況是全表搜索:將所有記錄一一取出庶诡,和查詢條件進行一一對比,然后返回滿足條件的記錄咆课。這樣做會消耗大量數(shù)據(jù)庫系統(tǒng)時間末誓,并造成大量磁盤 I/O 操作。
  • 而如果在表中已建立索引傀蚌,在索引中找到符合查詢條件的索引值基显,通過索引值就可以快速找到表中的數(shù)據(jù),可以大大加快查詢速度
  1. 對一張表中的某個列建立索引善炫,有以下兩種語句格式
ALTER TABLE 表名字 ADD INDEX 索引名 (列名);
CREATE INDEX 索引名 ON 表名字 (列名);
ALTER TABLE employee ADD INDEX idx_id (id);  #在employee表的id列上建立名為idx_id的索引
CREATE INDEX idx_name ON employee (name);   #在employee表的name列上建立名為idx_name的索引

索引的效果是加快查詢速度,當(dāng)表中數(shù)據(jù)不夠多的時候是感受不出它的效果的库继。使用命令 SHOW INDEX FROM 表名字; 查看剛才新建的索引

視圖

  1. 什么是視圖
    視圖是從一個或多個表中導(dǎo)出來的表箩艺,是一種虛擬存在的表。它就像一個窗口宪萄,通過這個窗口可以看到系統(tǒng)專門提供的數(shù)據(jù)艺谆,這樣,用戶可以不用看到整個數(shù)據(jù)庫中的數(shù)據(jù)拜英,而只關(guān)心對自己有用的數(shù)據(jù)

注意理解視圖是虛擬的表:

  • 數(shù)據(jù)庫中只存放了視圖的定義静汤,而沒有存放視圖中的數(shù)據(jù),這些數(shù)據(jù)存放在原來的表中居凶;
  • 使用視圖查詢數(shù)據(jù)時虫给,數(shù)據(jù)庫系統(tǒng)會從原來的表中取出對應(yīng)的數(shù)據(jù);
  • 視圖中的數(shù)據(jù)依賴于原來表中的數(shù)據(jù)侠碧,一旦表中數(shù)據(jù)發(fā)生改變抹估,顯示在視圖中的數(shù)據(jù)也會發(fā)生改變;
  • 在使用視圖的時候弄兜,可以把它當(dāng)作一張表药蜻。
  1. 創(chuàng)建視圖的語句格式為
CREATE VIEW 視圖名(列a,列b,列c) AS SELECT 列1,列2,列3 FROM 表名字;

現(xiàn)在我們創(chuàng)建一個簡單的視圖瓷式,名為 v_emp,包含v_name语泽,v_age贸典,v_phone三個列

CREATE VIEW v_emp(v_name, v_age,v_phone) AS SELECT name, age, phone FROM employee;

導(dǎo)入與導(dǎo)出數(shù)據(jù)

  1. 導(dǎo)入操作
    可以把一個文件里的數(shù)據(jù)保存進一張表。
  • linux系統(tǒng)
LOAD DATA INFILE '文件路徑' INTO TABLE 表名字;
  • windows 系統(tǒng)
LOAD DATA INFILE '文件路徑' INTO TABLE pet LINES 
    TERMINATED BY '\r\n';
  1. 導(dǎo)出數(shù)據(jù)
    導(dǎo)出與導(dǎo)入是相反的過程踱卵,是把數(shù)據(jù)庫某個表中的數(shù)據(jù)保存到一個文件之中
SELECT 列1廊驼,列2 INTO OUTFILE '文件路徑和文件名' FROM 表名字;

把整個employee表的數(shù)據(jù)導(dǎo)出到 /tmp 目錄下,導(dǎo)出文件命名為 out.txt 具體語句為

SELECT * INTO OUTFILE '/tmp/out.txt' FROM employee;

備份數(shù)據(jù)

  1. 數(shù)據(jù)庫中的數(shù)據(jù)或許十分重要颊埃,出于安全性考慮蔬充,在數(shù)據(jù)庫的使用中,應(yīng)該注意使用備份功能班利。

備份與導(dǎo)出的區(qū)別:導(dǎo)出的文件只是保存數(shù)據(jù)庫中的數(shù)據(jù)饥漫;而備份,則是把數(shù)據(jù)庫的結(jié)構(gòu)罗标,包括數(shù)據(jù)庸队、約束、索引闯割、視圖等全部另存為一個文件彻消。

  1. mysqldump 是 MySQL 用于備份數(shù)據(jù)庫的實用程序。它主要產(chǎn)生一個 SQL 腳本文件宙拉,其中包含從頭重新創(chuàng)建數(shù)據(jù)庫所必需的命令CREATE TABLE INSERT 等宾尚。

  2. 使用 mysqldump 備份的語句,退出msql, 在終端輸入

mysqldump -u root 數(shù)據(jù)庫名>備份文件名;   #備份整個數(shù)據(jù)庫
mysqldump -u root 數(shù)據(jù)庫名 表名字>備份文件名;  #備份整個表

備份整個數(shù)據(jù)庫 mysql_shiyan,將備份文件命名為 bak.sql,先 Ctrl+Z 退出 MySQL 控制臺谢澈,再打開終端

mysqldump -u root mysql_shiyan > bak.sql;

恢復(fù)

  1. 方法1
    把 MySQL-06.sql 文件中保存的mysql_shiyan 數(shù)據(jù)庫恢復(fù)煌贴。
source /tmp/SQL6/MySQL-06.sql
  1. 方法2
    先使用命令新建一個空的數(shù)據(jù)庫 test:
mysql -u root          #因為在上一步已經(jīng)退出了MySQL,現(xiàn)在需要重新登錄
CREATE DATABASE test;  #新建一個名為test的數(shù)據(jù)庫

再次 Ctrl+Z 退出MySQL锥忿,然后輸入語句進行恢復(fù)牛郑,把剛才備份的 bak.sql 恢復(fù)到 test 數(shù)據(jù)庫

mysql -u root test < bak.sql

輸入命令查看 test 數(shù)據(jù)庫的表,便可驗證是否恢復(fù)成功

mysql -u root          #因為在上一步已經(jīng)退出了MySQL敬鬓,現(xiàn)在需要重新登錄
use test               #連接數(shù)據(jù)庫test
SHOW TABLES;           #查看test數(shù)據(jù)庫的表

SQL 約束

約束

  1. 什么是約束
    約束是一種限制淹朋,它通過對表的行或列的數(shù)據(jù)做出限制,來確保表的數(shù)據(jù)的完整性钉答、唯一性础芍。
  2. 約束類型
約束類型: 主鍵 默認(rèn)值 唯一值 外鍵 非空
關(guān)鍵字 PRIMARY KEY DEFAULT UNIQUE FOREIGN KEY NOT NULL

主鍵

  1. 什么是主鍵
    主鍵 是用于約束表中的一行,作為這一行的唯一標(biāo)識符希痴,讓每一條記錄成為唯一的者甲,在一張表中通過主鍵就能準(zhǔn)確定位到一行,用于獨一無二地識別出每條記錄砌创。

  2. 主鍵的規(guī)則

  • 主鍵不可以為NULL
  • 插入新記錄時必須制定主鍵值
  • 主鍵必須簡潔
  • 主鍵值不可以被修改
  1. 為現(xiàn)有的表添加主鍵
    ALTER TABLE 并添加PRIMARY KEY
ALTER TABLE my_contacts
   ADD COLUMN contact_id INT NOT 
   AUTO_INCREMENT FIRST,
    ADD PRIMARY KEY (contact_id);

默認(rèn)約束

  1. 什么是默認(rèn)約束
    默認(rèn)值約束 (DEFAULT) 規(guī)定虏缸,當(dāng)有 DEFAULT 約束的列鲫懒,插入數(shù)據(jù)為空時,將使用默認(rèn)值刽辙。

  2. 規(guī)則
    DEFAULT 約束只會在使用 INSERT 語句時體現(xiàn)出來窥岩,INSERT語句中,如果被 DEFAULT 約束的位置沒有值宰缤,那么這個位置將會被 DEFAULT 的值填充

# 正常插入數(shù)據(jù)
INSERT INTO department(dpt_name,people_num) VALUES('dpt1',11);
#插入新的數(shù)據(jù)颂翼,people_num 為空,使用默認(rèn)值
INSERT INTO department(dpt_name) VALUES('dpt2');

唯一約束值

唯一約束 (UNIQUE) 比較簡單慨灭,它規(guī)定一張表中指定的一列的值必須不能有重復(fù)值朦乏,即這一列每個值都是唯一的

  1. 規(guī)則
    當(dāng) INSERT 語句新插入的數(shù)據(jù)和已有數(shù)據(jù)重復(fù)的時候,如果有 UNIQUE約束氧骤,則 INSERT 失敗
INSERT INTO employee VALUES(01,'Tom',25,3000,110110,'dpt1');
INSERT INTO employee VALUES(02,'Jack',30,3500,110110,'dpt2');

第二行插入會顯示錯誤

外鍵約束

  1. 什么是外鍵約束
    外鍵 (FOREIGN KEY) 既能確保數(shù)據(jù)完整性呻疹,也能表現(xiàn)表之間的關(guān)系。

    一個表可以有多個外鍵筹陵,每個外鍵必須 REFERENCES (參考) 另一個表的主鍵刽锤,被外鍵約束的列,取值必須在它參考的列中有對應(yīng)值

  2. 規(guī)則
    在 INSERT 時朦佩,如果被外鍵約束的值沒有在參考列中有對應(yīng)并思,比如以下命令,參考列 (department 表的 dpt_name) 中沒有dpt3语稠,則INSERT 失敗

#將 dpt3 改為 dpt2(department 表中有 dpt2)宋彼,則插入成功
INSERT INTO employee VALUES(02,'Jack',30,3500,114114,'dpt3');

非空約束

被非空約束的列,在插入值時必須非空

參考資料:
實驗樓-MySQL 基礎(chǔ)課程
《MySQL必知必會》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仙畦,一起剝皮案震驚了整個濱河市宙暇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌议泵,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桃熄,死亡現(xiàn)場離奇詭異先口,居然都是意外死亡,警方通過查閱死者的電腦和手機瞳收,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門碉京,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人螟深,你說我怎么就攤上這事谐宙。” “怎么了界弧?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵凡蜻,是天一觀的道長搭综。 經(jīng)常有香客問我,道長划栓,這世上最難降的妖魔是什么兑巾? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮忠荞,結(jié)果婚禮上蒋歌,老公的妹妹穿的比我還像新娘。我一直安慰自己委煤,他們只是感情好堂油,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碧绞,像睡著了一般府框。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上头遭,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天寓免,我揣著相機與錄音,去河邊找鬼计维。 笑死袜香,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鲫惶。 我是一名探鬼主播蜈首,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼欠母!你這毒婦竟也來了欢策?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤赏淌,失蹤者是張志新(化名)和其女友劉穎踩寇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體六水,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡俺孙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了掷贾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睛榄。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖想帅,靈堂內(nèi)的尸體忽然破棺而出场靴,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布旨剥,位于F島的核電站咧欣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泞边。R本人自食惡果不足惜该押,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阵谚。 院中可真熱鬧蚕礼,春花似錦、人聲如沸梢什。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗡午。三九已至囤躁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荔睹,已是汗流浹背狸演。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留僻他,地道東北人宵距。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像吨拗,于是被迫代替她去往敵國和親满哪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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