mysql -h hostname -P hostport -u username -p
mysql
-h 指定但願鏈接的主機,能夠用來鏈接遠程主機上的MySQL,若是忽略默認登陸本機數據庫web
-P 指定所鏈接主機開放的MySQL端口,若是忽略此項默認使用3306端口登陸sql
-u 指定鏈接數據庫時使用的用戶名稱,若是忽略此項默認使用你的本機用戶名數據庫
-p 告訴服務器會使用密碼來鏈接數據庫,若是忽略此項使用無密碼登陸安全
使用密碼登入時,會出現如下響應服務器
Enter password:
輸入密碼後成功登陸會獲得如下響應ide
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.12 MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
每一個程序都須要數據庫,能夠在MySQL命令提示符下輸入:post
mysql> create database dbname;
建立成功後,能夠獲得如下響應:性能
Query OK, 1 row affected (0.00 sec)
一個MySQL可能有許多用戶,並且不一樣的用戶有不一樣的權限。加密
最少權限原則:一個用戶(或者一個進程)應該擁有可以執行分配給他的任務的最低級別的權限
GRANT
和REVOKE
分別用來授予和取消MySQL用戶的權限
權限分爲四個級別:
全局
數據庫
表
列
MySQL權限有3個基本類型:
適用於通常用戶的權限
適用於賦予管理員的權限
幾個特定的權限
用戶的權限
從系統的安全性方面考慮,適於常規用戶的權限大多數是相對無害的。
權限 | 應用於 | 描述 |
---|---|---|
SELECT | 表,列 | 容許用戶從表中選擇行 |
INSERT | 表,列 | 容許用戶在表中插入行 |
DELETE | 表,列 | 容許用戶修改現存表中的行 |
INDEX | 表 | 容許用戶刪除現存表的行 |
ALTER | 表 | 容許用戶修改現存表的結構 |
CREATE | 數據庫,表 | 容許用戶建立新的數據庫或表 |
DROP | 數據庫,表 | 容許用戶刪除數據庫或表 |
管理員權限
這些權限均可以授予非管理員用戶,可是必須很是當心
FILE權限有些不一樣,對普通用戶很是有用,能夠將數據從文件載入數據庫,不然必須把數據輸入數據庫,很是浪費時間。
可是必須注意,可能會載入其餘用戶數據庫和潛在的密碼文件,授予權限時必須很是當心,或者管理員載入數據
權限 | 應用於 |
---|---|
CREATE TEMPORARY TABLES | 容許管理員建立臨時表 |
FILE | 容許數據從文件讀入表,或從表讀入文件 |
LOCK TABLES | 容許使用LOCK TABLES語句 |
PROCESS | 容許管理員查看屬於全部用戶的服務器進程 |
REPLICATION CLIENT | 容許在複製主機和從機上使用SHOW STATUS |
REPLICATION SLAVE | 容許複製從服務器鏈接到主服務器 |
SHOW DATABASES | 容許使用SHOW DATABASES查看全部數據庫列表 |
SHUTDOWN | 容許管理員關閉MySQL服務器 |
SUPER | 容許管理員關閉屬於任何用戶的線程 |
特別的權限
權限 | 應用於 |
---|---|
ALL | 授予用戶和管理員表的全部權限 |
USAGE | 不授予權限。這將建立一個用戶並容許他登陸,可是不容許進行任何操做,一般在之後授予更多的權限 |
GRANT
命令用來建立用戶並賦予權限,常見形式是
GRANT privileges [columns] ON item TO username [IDENTIFIED BY 'password'] [REQUIRE ssl_options] [WITH [GRANT OPTION | limit_options]]
佔位符columns是可選的,能夠用於對每一個列指定權限,也可使用單列的名稱或者逗號分開的一組列的名稱
佔位符item是新權限所應用於的數據庫或表。若是沒有使用在任何特定數據庫,可使用*
賦予全局權限。
更常見的是,以dbname.*
的形式指定數據庫中全部表,以dbname.tablename
的形式指定單個表,或者
經過指定tablename來指定特定的列。這些分別表示其餘3個能夠利用的權限:數據庫、表、列。
若是在輸入命令的時候正在使用一個數據庫,tablename自己被解釋爲當前數據庫的一個表
username應該是用戶登陸數據庫的用戶名。用戶名能夠包含一個主機名,能夠用來區分如fred@localhost、fred@someip.com。這樣能夠區分來自不一樣域的相同用戶名的用戶。
password應該是用戶登陸數據庫的密碼
REQUIRE子句容許指定用戶是否必須經過加密套接字鏈接,或者指定其餘SSL選項。更多的參考MySQL手冊
WITH GRANT OPTION選項,若是指定,表示容許指定的用戶向別人授予本身擁有的權限。
還能夠指定以下所示的WITH選項:
MAX_QUERIES_PER_HOUR n
: 用戶每小時執行的查詢數量上限
MAX_UPDATES_PER_HOUR n
: 用戶每小時執行的更新數量上限
MAX_CONNECTIONS_PER_HOUR n
: 用戶每小時鏈接的數量
與GRANT
相反的命令是REVOKE
,用來從一個用戶收回權限,語法與GRANT相似
REVOKE privileges [(columns)] ON item FROM username
若是已經給出WITH GRANT OPTION子句,能夠用下面方式撤銷(以及其餘全部權限)
REVOKE ALL PRIVILEGES, GRANT FROM username
管理員的建立和撤銷
建立一個管理員,能夠輸入以下所示命令:
命令授予了一個用戶名zhao,密碼爲secret的用戶使用全部數據庫的全部權限,並容許他向其餘人授予這些權限
grant all on * to zhao identified by 'secret' with grant option;
若是不但願用戶在系統中存在,能夠按照如下方式撤銷:
revoke all privileges, grant from zhao
建立基本用戶和授予權限
建立一個沒有任何權限的普通用戶zhao:
grant USAGE on test.* to zhao identified by 'secret';
在跟用戶zhao溝通以後,授予一些適當的權限:
grant select, insert, update, delete, index, alter, create, drop on test.* from zhao;
若是咱們認爲zhao的權限太高,能夠按照下面方式減小一些權限
revoke alter, create, drop on test.* from zhao;
後來,當這個用戶不須要使用數據庫時,按照下面方式撤銷全部權限
revoke all on test.* from zhao;
在上面權限的介紹中插入一些關於建立用戶時的權限基本知識,也瞭解一個數據庫用戶是如何建立的。
在許多web應用中,用戶只須要SELECT,INSERT,DELETE,UPDATE的權限。所以能夠按照以下方式設定權限:
grant select, insert, delete, update on test.* to lily indetified by 'secret';
若是開始使用MySQL,登陸以後,要作的第一件事就是指定要使用的數據庫。能夠輸入如下命令完成:
use dbname
也能夠在登陸時候指定數據庫而避免選擇數據庫,以下所示
mysql -D dbname -h hostname -u username -p
例子:
咱們使用一個名爲books的數據庫:use books;
輸入命令後,MySQL應該給出以下所示的響應:Database changed
若是開始工做前沒有選擇數據庫,MySQL會給出以下所示錯誤信息:ERROR 1046 (3D000): No database selected
建立數據庫以後,就是建立實際的表。建立表的命令是CREATE TABLE
,常見形式以下:create table tablename(columns)
假如咱們要建立一個訂單的表單,orders(customerid, name, address, amount, date)
建立orders表,數據類型後面再詳細說明,這裏的比較簡單:
create table orders ( customerid int unsigned not null auto_increment primary key, name char(50) not null, address char(100) not null, amount float(6, 2), date date not null );
not null的意思是表中全部行此屬性必須有一個值。若是沒有指定,該列能夠是(NULL)
auto_increment 是一個特殊的MySQL特性,能夠在整數列中使用。意思是再插入行的時候,若是該字段爲空,
那麼MySQL自動產生一個惟一標示符。該值比本列中現存的最大值更大。在每一個列中只能有這樣一個值。
指定auto_increment的列必須是索引列
primary key,這個只用於單列主鍵。若是須要多列合併爲主鍵須要使用primary key(prop1, prop2)
整數類型後面unsigned意思是這一列只能是0或者一個正數
建立一個表的時候,須要肯定列的數據類型。根據orders表分析一下。
customerid:主鍵,數據類型是一個正數,而且是無符號的,自動增加
name:char類型,而且分配50個字符的空間,也可使用varchar類型,雖然varchar能夠根據須要分配空間,可是char數據速度更快
amount:float類型,指定了顯示寬度和小數點後位數
date:date類型,日期
更多的的類型能夠查看MySQL手冊
登陸到MySQL而且使用數據庫以後,輸入show tables;
能夠查看全部表。
MySQL將顯示數據庫中全部的表單:
+-----------------+ | Tables_in_blog | +-----------------+ | migrations | | password_resets | | posts | | users | +-----------------+
也可使用show databases;
來查看數據庫列表:
+--------------------+ | Database | +--------------------+ | information_schema | | blog | | books | | dbname | | homestead | | mysql | | performance_schema | | sys | | test | +--------------------+
若是沒有show databases權限,將只能看到權限範圍內的數據庫
要查看某個表的詳細信息,可使用describe命令:describe table_name;
或者desc table_name
MySQL將顯示你建立表時提供的信息,提供一個例子,個人博客數據庫posts表單的設計:
+--------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | slug | varchar(255) | NO | | NULL | | | title | varchar(255) | NO | | NULL | | | content | text | NO | | NULL | | | published_at | timestamp | NO | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +--------------+------------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec)
設計主鍵時將在這些列上面建立索引。
MySQL新用戶可能面臨一個常見的問題,數據庫性能低下。但這個問題常常在數據庫上沒有建立任何索引的狀況下發生。
要開始建立索引,可使用自動建立的索引。若是發現須要對一個不是主鍵的列運行許多查詢,能夠在該列上添加索引來改善性能
建立索引的語法是create index
:
create [UNIQUE | FULLTEXT] INDEX index_name ON table_name (index_column_name [(length) [ASC | DESC], ...])
FULLTEXT索引用來索引文本字段,length字段容許指定該字段的前length個字符被索引,ASC|DESC能夠指定索引的排序爲升序或降序
在MySQL中有5種類型的標識符: Database
,Table
,Column
,index
和Alias
類型 | 最大長度 | 是否區分大小寫 | 容許的字符 |
---|---|---|---|
Database | 64 | 與操做系統相同 | 操做系統目錄名容許出現的字符,不包含 "","/","." |
Table | 64 | 與操做系統相同 | 操做系統目錄名容許出現的字符,不包含 "/","." |
Column | 64 | 否 | 任何字符 |
index | 64 | 否 | 任何字符 |
Alias | 255 | 否 | 任何字符 |
MySQL中3種基本的列數據類型:數字、日期和時間、字符串。
數字類型分爲:整型和浮點型
對於浮點型,能夠指定小數點後數字的位數。能夠指定爲最大值30或者最大顯示長度-2
對於整型,能夠指定爲無符號型
對於全部數字類型,能夠指定zerofill屬性。當顯示zerofill字段中的值時,空餘部分用前導0來補充。若是將一個字段指定爲zerofill,將自動成爲unsigned數據類型
整數數據類型
類型 | 取值範圍 | 存儲空間(單位:字節) | 描述 |
---|---|---|---|
tinyint | -127~128或0~255 | 1 | 很是小的整數 |
bit | -127~128或0~255 | 1 | tinyint同義詞 |
Bool | -127~128或0~255 | 1 | tinyint同義詞 |
smallint | -32768~32767或0~65535 | 2 | 小型整數 |
mediumint | -8388608~8388607或0~16777215 | 3 | 中型整數 |
int(Integer) | -2^31~2^32-1或0~2^32-1 | 4 | 通常整數 |
bigint | -2^63~2^63-1或0~2^64-1 | 8 | 大型整數 |
浮點數據類型
類型 | 取值範圍 | 存儲空間(單位:字節) | 描述 |
---|---|---|---|
float(精度) | 取決於精度 | 可變 | 可用於指定單精度和雙精度浮點數 |
float[(M, D)] | (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 4 | 單精度浮點數,至關於float(4),指定寬度和小數 |
double[(M, D)] | (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 8 | 雙精度浮點數,至關於float(8),指定寬度和小數 |
double | 同上 | 8 | double[(M, D)] 同義 |
precision[(M, D)] | 同上 | 8 | double[(M, D)] 同義 |
real[(M, D)] | 同上 | 8 | double[(M, D)] 同義 |
decimal[(M[, D])] | 可變 | M+2 | 浮點數,以char存儲,範圍取決於寬度M |
numeric[(M, D)] | 同上 | M+2 | decimal的同義詞 |
dec[(M, D)] | 同上 | M+2 | decimal的同義詞 |
fixed[(M, D)] | 同上 | M+2 | decimal的同義詞 |
MySQL支持多種日期和時間類型,使用這些類型,能夠以字符串或數字格式輸入數據。若是不手動設置,特定行的timestamp列將被設置爲最近修改改行的日期和時間
日期和時間數據類型
類型 | 取值範圍 | 描述 |
---|---|---|
date | 1000-01-01~9999-12-31 | 一個日期,以yyyy-mm-dd格式 |
time | -838:59:59~838:59:59 | 一個時間,以hh:mm:ss形式顯示 |
datetime | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 日期和時間,以yyyy-mm-dd hh:mm:ss格式顯示 |
timestamp[(M)] | 1970-01-01 00:00:00~2037年某個時間(取決於UNIX限制) | 時間標籤,在處理報告中有意義。顯示格式取決於M的值 |
year | 70-69(1970~2069) / 1901~2155 | 年份。能夠指定2位數字或4位數字的格式 |
timestamp顯示類型
指定類型 | 顯示 | 指定類型 | 顯示 |
---|---|---|---|
timestamp | YYYYMMDDHHMMSS | timestamp(8) | YYYYMMDD |
timestamp(14) | YYYYMMDDHHMMSS | timestamp(6) | YYMMDD |
timestamp(12) | YYMMDDHHMMSS | timestamp(4) | YYMM |
timestamp(10) | YYMMDDHHMM | timestamp(2) | YY |
字符串類型爲3類:普通字符串,text和blob類型,特殊類型
普通字符串,即小段文本,包括char類型和varchar類型。能夠指定每種類型寬度。不管數據大小是多少,char類型的列都會用空格填補空白,
可是varchar列寬隨數據大小變化。MySQL獲取char和varchar數據的時候,將會過濾多餘的空格。這兩種類型都有速度與存儲空間的問題。
text和blob類型。這些類型大小可變,他們分別適用於長文本或二進制數據。blob全稱爲大二進制對象,支持任何數據,例如圖像或聲音數據
兩種特殊類型,set和enum。set類型用來指定列中的值必須來自一個特定集合中的指定值。列值能夠包含來自該集合的多個值。
在指定的集合中,最大能夠有64個元素
enum就是枚舉,與set類型類似,可是該類型的列能夠只有一個指定集合中的值或者null,在枚舉中最大還能夠有65535個元素
常規字符串類型
類型 | 取值範圍 | 描述 |
---|---|---|
[National]char(M) [Binary/Ascii/Unicode] | 0~255個字符 | 固定長度爲M的字符串,其中M的取值範圍0~255.National關鍵字指定了應使用的默認字符集。Binary關鍵字指定了數據是否區分大小寫。Ascii關鍵字指定了在該列使用lation1字符集。Unicode指定了使用Ucs字符集 |
char | 0~255個字符 | char(1)的同義詞 |
[National]varchar(M) [Binary] | 1~255個字符 | 出了可變長度,其餘與上一項相同 |
text和blob類型
類型 | 最大長度(字符數) | 描述 |
---|---|---|
tinyblob | 255 | 小二進制大對象(blob)字段 |
tinytext | 255 | 小text字段 |
blob | 65535 | 常規大小blob字段 |
text | 65535 | 常規大小text字段 |
mediumblob | 2^24-1(16777215) | 中型大小blob字段 |
mediumtext | 2^24-1(16777215) | 中型大小text字段 |
longblob | 2^32-1(4294967295) | 長blob字段 |
longtext | 2^32-1(4294967295) | 長text字段 |
set和enum類型
類型 | 集合最大值 | 描述 |
---|---|---|
enum('value1','value2',... ) | 65535 | 該類型的列只能夠容納所列值之一或者null |
set('value','value',...) | 64 | 該類型的列能夠容納一組值或者null |