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 |