MySQL 基本操做

MySQL 基本操做

MySQL5.7設置初始密碼

在centos6.5安裝教程不贅述。安裝後第一次登陸MySQL時,須要從新設置密碼。MySQL 5.7 在初始安裝後會生成隨機初始密碼,並在/etc/my.cnf配置文件中找到[mysqld]下的log.err配置的目錄/var/log/mysqld.log 中有記錄,能夠經過 cat 命令查看,找 password 關鍵字。html

# cat /var/log/mysqld.log | grep password
2017-10-20T07:58:04.065507Z 1 [Note] A temporary password is generated for root@localhost: boEsPgrCf1.X

找到密碼後,在本機以初始密碼登陸,經過ALTER USER命令修改 root 用戶的密碼, 而後退出登陸,從新以root用戶和剛設置的密碼進行登陸便可。mysql

#若是不設置初始密碼則不容許操做
mysql> SHOW DATABASES;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

#MySQL改變了密碼的強度,須要知足要求才能夠經過密碼設置
mysql> alter user 'root'@'localhost' identified by 'fefjay.2017';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

#正確的密碼設置
mysql>  ALTER USER 'root'@'localhost' IDENTIFIED BY  'FEFJay@2017';
Query OK, 0 rows affected (0.00 sec)

查看MySQL官方文檔,是這樣解釋的:linux

MySQL's validate_password plugin is installed by default. This will require that passwords contain at least one upper case letter, one lower case letter, one digit, and one special character, and that the total password length is at least 8 characters.

大概意思就是MySQL5.7之後默認安裝密碼校驗器,新設置的密碼必須知足這樣的條件:包含至少一個大寫字母、至少一個小寫字母、至少一個數字、至少一個特殊字符(好比「@」、「_」之類的)、且總長度至少爲8。
因此設置相應強度的密碼纔會經過校驗,其實也能夠經過禁用密碼校驗插件實現登陸MySQL服務,而後能夠進行更改密碼、查詢等操做,具體網上有不少不錯的方法,此處再也不贅述。git

基本操做

1.建庫/刪庫

數據庫對名稱是大小寫敏感的。正則表達式

#建立數據庫
CREATE DATABAE 庫名;

#刪庫
DROP DATABASE 庫名;

2. 插入insert

2.1 僅插入一行

INSERT INTO 表名(列名1,列名2,列名3) VALUES(行1值1, 行1值2, 行1值3);

2.2 插入多行,好比三行

INSERT INTO 表名(列名1,列名2,列名3)
VALUES(行1值1,行1值2,行1值3),
(行2值1,行2值2,行2值3),
(行3值1,行3值2,行3值3);

3.更新update和刪除delete

更新和刪除操做必定要注意添加WHERE限制條件,不然很危險!!!
更新和刪除操做只是對錶的內容更改,並不會改變表的結構。sql

  • 更新
UPDATE 表名字 SET 列1=值1,列2=值2 WHERE 條件;
  • 刪除
    這是刪除內容,並不會釋放存儲空間。
DELETE FROM 表名字 WHERE 條件;

4.查詢select

4.1 簡單查詢

SELECT 列1,列2,列3 FROM 表名 WHERE 限制條件;

4.2 子查詢

最終結果只來自一個表的狀況。條件裏嵌套有查詢,根據須要可多層嵌套。經過比較符鏈接。shell

SELECT ... FROM 表名 WHERE department IN (SELECT department FROM ...)

4.3 鏈接查詢

最終結果來自多個表的狀況,有某些列做爲鏈接字段。數據庫

  • 內鏈接
    獲得兩個表的公共集合,如下三個 查詢語句都等價
方式一:SELECT ... FROM 表a,表b WHERE a.某列名 = b.某列名;
方式二:SELECT ... FROM 表a (INNER) JOIN 表b ON a.某列名 = b.某列名;
方式三:SELECT ... FROM 表a CROSS JOIN 表b WHERE a.某列名 = b.某列名;

特殊的內鏈接-自鏈接,本身和本身做爲兩個表處理。windows

SELECT ... FROM 表a AS A,表a AS B WHERE A.某列名 = B.某列名的計算操做;
  • 左鏈接
    結果集是左表的所有內容,若是右表的某行和左表不匹配,則右表的相關列內容爲空值NULL。
SELECT ... FROM 表a LEFT (OUTER) JOIN 表b ON a.某列名 = b.某列名;
  • 右鏈接
    結果集是右表的所有內容,若是左表的某行和右表不匹配,則左表的相關列內容爲空值NULL。
SELECT ... FROM 表a RIGHT (OUTER)  JOIN 表b ON a.某列名 = b.某列名;
  • 完整外部鏈接/全鏈接
    返回兩個表的全部行,即返回左、右鏈接的和。若一個表的行在另外一個表不匹配時則顯示爲空值NULL。
SELECT ... FROM 表a FULL (OUTER)  JOIN 表b ON a.某列名 = b.某列名;
  • 交叉鏈接
    笛卡爾鏈接,返回左表每一行和右表每一行相互組合的結果,可藉助笛卡爾積n*m理解。條件限制只能使用WHERE不能用ON。
SELECT ... FROM 表a CROSS JOIN 表b WHERE a.某列名 = b.某列名;

若是沒有WHERE語句,那麼交叉鏈接和沒有限制的內鏈接等價,都是獲得兩個表的笛卡爾積。
SELECT ... FROM 表a CROSS JOIN 表b;結果集等同於 SELECT ... FROM 表a,表b;centos

參考:
http://www.cnblogs.com/youzhangjin/archive/2009/05/22/1486982.html
http://www.cnblogs.com/Ewin/archive/2009/10/05/1578322.html

5 操做表

對錶格的操做,能夠理解爲更改表的屬性或者結構。

5.1 建表

表的名字是大小寫敏感的。

CREATE TABLE 表名(
`列名1` INT(長度) UNSIGNED DEFAULT NOT NULL AUTO_INCREMENT,
`列名2` 數據類型(長度) DEFAULT 默認值,
`列名3` 數據類型(長度) DEFAULT NULL,
 PRIMARY KEY(列名)
)ENGINE=InnoDB default-charset=utf8;

添加主鍵也能夠在括號裏的最後一行加上CONSTRAINT 主鍵名 PRIMARY KRY(列名)
主鍵也能夠是多列的複合主鍵CONSTRAINT 主鍵名 PRIMARY KEY(列1,列2,列3)

查看錶的結構

#方式一:使用關鍵字`DESCRIBE`
DESCRIBE 表名;

#方式二:查看建表語句
SHOW CREATE TABLE 表名;

5.2 重命名錶格

對一張已經創建的表重命名

方式一:RENAME TABLE 原名 TO 新名;
方式二:ALTER TABLE 原名 RENAME 新名;
方式三:ALTER TABLE 原名 RENAME TO 新名;

5.3 刪除表

DROP TABLE 表名字;

5.4 表增長一列

如下兩種方式是等效的

方式一:ALTER TABLE 表名字 ADD 列名 數據類型 約束;
方式二:ALTER TABLE 表名字 ADD COLUMN 列名 數據類型 約束;

若是沒有指定添加的新列的位置,那麼就會默認添加在表的最後一列,若是須要指定在第一列則用關鍵字FIRST,若是須要在某列後則用關鍵字AFTER 某列名

  • 新增列放在第一列
ALTER TABLE 表名字 ADD 列名 數據類型 約束 FIRST;
  • 新增列放在列A以後
ALTER TABLE 表名字 ADD 列名 數據類型 約束 AFTER A;

5.5 表刪除一列

方式一:ALTER TABLE 表名字 DROP 列名;
方式二:ALTER TABLE 表名字 DROP COLUMN 列名;

5.6 重命名錶的一列/修改該列的名字

本質上是修改一個列的屬性,用了關鍵字CHANGE

ALTER TABLE 表名字 CHANGE 原列名 新列名 新列的數據類型 約束;

注意到若是新列名和原列名相同的話,就能夠修改這個列的數據類型約束了。
可是修改數據類型可能會致使數據丟失!!

5.7 修改表一列的數據類型

方式一:ALTER TABLE 表名字 CHANGE 原列名 原列名 新數據類型 約束;
方式二:ALTER TABLE 表名字 MODIFY 列名字 新數據類型;

注意,修改數據類型可能會致使數據丟失!!

6.索引

數據庫默認使用全表掃描,當一張表數據量較少的時候檢索速度也會很快,當數據量很大的時候(好比達到百萬級)若是使用全表掃描就會很慢。這個時候就須要添加索引提升查詢速度,每每會有很大的改善。添加索引時會在磁盤上建立索引文件,而且寫入索引信息,因此建立索引會增長插入速度消耗一部分存儲空間

執行查詢語句時,數據庫會自動判斷是否有可用的索引,若是沒有才會進行全表掃描。

  • 建立單列索引的命令:
方式一:ALTER TABLE 表名字 ADD INDEX 索引名 (列名);
方式二:CREATE INDEX 索引名 ON 表名字 (列名);
  • 建立多列索引的命令:
    多列索引必須符合最左匹配原則
方式一:ALTER TABLE 表名字 ADD INDEX 索引名 (列名1,列名2,列名3);
方式二:CREATE INDEX 索引名 ON 表名字 (列名1,列名2,列名3);
  • 查詢一張表的索引命令:
SHOW INDEX FROM 表名字;

6.視圖

視圖是一張虛擬表,基於數據庫中已有的一張表或者多張表的真實數據組織而成,是一張邏輯表而不是實際存在的物理表,數據庫中存放的是視圖的定義。查詢的時候能夠把視圖當作一張普通的表操做。

  • 建立視圖命令:
CREATE VIEW 視圖名(視圖列1,視圖列2,視圖列3) AS SELECT 列1,列2,列3 FROM 表;

能夠看到視圖中用到關鍵字AS,並且在AS後面是一個查詢語句,因此這個查詢語句能夠是子查詢和鏈接查詢,視圖依賴的數據能夠是多個表的數據。

  • 查看視圖表的數據命令(和查詢普通表同樣,只不過把表名字換成了視圖名字):
SELECT * FROM 視圖名;
  • 刪除視圖(和刪除表操做同樣):
DROP VIEW 視圖名;

7.導入和導出

  • 導入
    導入本地文件數據到數據庫中的某張表去。須要注意指定文本中行、列數據的分隔符,默認使用製表符Tab做爲列分隔符、使用換行符(windows是「\r\n」,OS X是「\r」,Linux是「\n」)做爲行分隔符。
#使用默認的分隔符
LOAD DATA INFILE '文件路徑' INTO TABLE 表名;

注意導入的文件路徑須要加上單引號。若是須要指定分隔符,則爲:

LOAD DATA INFILE '文件路徑' 
INTO TABLE 表名 
FIELDS TERMINATED BY '列分隔符'
LINES TERMINATED BY '換行符';
  • 導出
    導出操做和導入相反,是把數據庫的數據導出到本地文件中去。須要設置MySQL服務器容許導出權限。
SELECT 列1,列2,列3 INTO OUTFILE '文件路徑' FROM 表名;

注意導出文件路徑須要加上單引號。一樣,上面是使用默認的分隔符導出數據,若是想要設定分隔符,則能夠在上面的命令後添加分隔操做。

SELECT 列1,列2,列3 
INTO OUTFILE '文件路徑' 
FROM 表名
FIELDS TERMINATED BY '列分隔符'
[OPTIONALLY] ENCLOSED BY '指定把字段包括起來的字符(若用了OPTIONALLY則只會包括CHAR和VARCHAR類型)'
ESCAPED BY '指定當須要轉義時用什麼做爲轉義字符(一般爲\\)'
LINES TERMINATED BY '換行符';

對於用LOAD DATA INFILE或SELECT ...INTO OUTFILE執行的文本文件導入或導出操做,NULL用序列\N表示。

8.數據備份和恢復

  • 導出和備份的區別
    導出僅僅是導出須要的數據,而備份則是把數據庫的結構,包括表結構、全部數據、索引、視圖等所有另存爲一個文件。

  • 備份
    數據備份使用關鍵詞mysqldump,mysqldump是一個備份程序,產生一個備份腳本文件*.sql。

備份命令不須要在MySQL服務裏面敲命令,須要退出MySQL的命令行操做界面,在系統命令行操做界面進行。

#備份整個數據庫
mysqldump -u 用戶名 數據庫名 > 備份文件路徑;

#備份某個數據表
mysqldump -u 用戶名 數據庫名 表名 > 備份文件路徑;
  • 恢復
    方式一是在MySQL命令行操做,使用關鍵詞source。會從新建立須要的庫和表。
    source命令直接執行sql腳本文件。
source 備份文件路徑;

方式二先在數據庫建一個空庫,而後在系統命令行操做恢復命令。使用Linux輸入符號「<」完成恢復。

mysql -u 用戶名 < 備份文件路徑;

不交互執行SQL

在shell腳本執行SQL語句,不須要登陸MySQL服務執行操做。

mysql -h主機IP地址 -u 登陸用戶名 -p '密碼' -S mysql.sock的路徑 -e "SQL命令;" >> 保存本地文件路徑

若是沒有-h參數,則表示是訪問本地的MySQL服務。舉例:

mysql -uroot -p'fefjay@2017' -S /tmp/mysql.sock -e "show databases;" >> /home/a.txt 
echo "show databases;" | mysql -uroot -p'fefjay@2017' -S /tmp/mysql.sock > /home/a.txt

上述命令都是先要登陸MySQL服務,而後執行命令,獲得結果,至於把結果是導出到本地的文件a.txt,或者結合管道符|和grep的操做,看具體的業務須要了。可是這裏須要寫出登陸的密碼,不安全,須要找到一種更加安全的能夠寫到腳本中的方法。
參考 http://oldboy.blog.51cto.com/2561410/632608/

約束

序號 約束類型 關鍵字 說明 添加方式
1 主鍵 PRIMARY KRY 該行數據的惟一標識,非空,一般爲自增加的int CONSTRAINT 主鍵名 PRIMARY KEY(列名)
2 外鍵 FOREIGE KRY 做爲外鍵的列一定是其餘表的主鍵,不然插入失敗。體現數據完整性和表之間的關係 CONSTRAINT 外鍵名 FOREIGEN KEY(外鍵列) REFERENCE 外鍵做爲主鍵所在的表名T(T的主鍵名)
3 設置默認值 DEFAULT 當插入數據爲空時,自動設置爲默認值 在列後面直接設置「DEFAULT 值」
4 非空 NOT NULL 被插入的列不容許空 在列後面直接設置「NOT NULL」
5 惟一 UNIQE 指定表的這一列數據不能有重複,即每一個值都是惟一的。不然插入失敗 UNIQUE(列)

查詢條件

用在WHERE以後,條件:使用「=」、「<」、「>」、「<=」、「=>」組成的不等式。
MySQL中0或者NULL表示條件爲假,其餘值都表示條件爲真。

序號 關鍵字 說明 使用方式舉例
1 AND 邏輯與,遵循與短路(第一個條件爲假則直接判斷最終結果是假,不會再去執行判斷後面的條件) 條件1 AND 條件2
2 OR 邏輯或,遵循或短路(第一個條件爲真則直接判斷最終結果是真,不會再去執行判斷後面的條件) 條件1 OR 條件2
3 IN 在某範圍內,能夠是字符串也能夠是數字。若是是連續數值,能夠用「BETWEEN...AND...」代替。 IN (值1,值2,值3)
4 NOT IN 不在某範圍內,能夠是字符串也能夠是數字 NOT IN (值1,值2,值3)
5 LIKE 模糊匹配,大小寫不敏感,使用BINARY對大小寫敏感。常與「_」(表明一個字符)和「%」(表明任意個>=0字符)搭配。與「NOT LIKE」相反 「LIKE 'fef_'」或「LIKE 'jay$'」
6 RLIKE或REGEXP 擴展正則表達式,使用BINARY可對大小寫敏感。與「NOT RLIKE」或「NOT RREGEXP」相反 找長度爲5的串「RLIKE '^.{5}&'」或「RLIKE '%jay%'」
7 ORDER BY 對查詢結果集排序,默認是大小寫不敏感,若是要大小寫敏感則用關鍵詞BINARY。升序用ASC(默認,ascending縮寫),降序用DESC(descending縮寫) 「ORDER BY 列名 DESC」 或 「ORDER BY 列名」 或「ORDER BY BINARY 列名」(大小寫敏感)
8 GROUP BY 分組,根據某一列進行分組 GROUP BY 列名
9 AS AS進行重命名,能夠對結果的值列重命名。也用於視圖指定數據集 SELECT SUM(money) AS 標識名 FROM salary;

簡單的計算函數

序號 函數名 做用 使用
1 COUNT 統計行數 COUNT(1)
2 SUM 求和,僅適用於定義爲數值的列 SUM(列名)
3 AVG 求均值,僅適用於定義爲數值的列 AVG(列名)
4 MAX 求最大值,適用於定義爲數值、字符串、日期、時間類型的列 MAX(列名)
5 MIN 求最小值,用於定義爲數值、字符串、日期、時間類型的列 MIN(列名)

待探討

COUNT(*)、COUNT(1)、COUNT(0)、COUNT(列名)的區別函數

索引及最左匹配原則

數據類型

相關文章
相關標籤/搜索