MySQL的基本使用相關知識

登陸到MySQL

mysql -h hostname -P hostport -u username -pmysql

  • -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可能有許多用戶,並且不一樣的用戶有不一樣的權限。加密

最少權限原則:一個用戶(或者一個進程)應該擁有可以執行分配給他的任務的最低級別的權限

GRANTREVOKE分別用來授予和取消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命令用來建立用戶並賦予權限,常見形式是

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: 用戶每小時鏈接的數量

REVOKE命令

GRANT相反的命令是REVOKE,用來從一個用戶收回權限,語法與GRANT相似

REVOKE privileges [(columns)]
ON item
FROM username

若是已經給出WITH GRANT OPTION子句,能夠用下面方式撤銷(以及其餘全部權限)

REVOKE ALL PRIVILEGES, GRANT
FROM username

使用GRANT和REVOKE的例子

  1. 管理員的建立和撤銷
    建立一個管理員,能夠輸入以下所示命令:

命令授予了一個用戶名zhao,密碼爲secret的用戶使用全部數據庫的全部權限,並容許他向其餘人授予這些權限

grant all
on *
to zhao identified by 'secret'
with grant option;

若是不但願用戶在系統中存在,能夠按照如下方式撤銷:

revoke all privileges, grant
from zhao
  1. 建立基本用戶和授予權限
    建立一個沒有任何權限的普通用戶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手冊

用SHOW和DESCRIBE來查看數據庫

登陸到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的標示符

在MySQL中有5種類型的標識符: Database,Table,Column,indexAlias

類型 最大長度 是否區分大小寫 容許的字符
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
相關文章
相關標籤/搜索