注意:数据库登陆命令:mysql –u root –p; 密码:123456
1、 数据库由表(1张或多张)构成,表是在数据库中包含数据的结构,由列和行组成。
列是存储在表中的一块数据。行是一组能够描述某个事物的列的集合。
列又可以称为字段(field),行又可以称为记录(record)。它只能查看表的结构,而不能查看其中的数据。
要想查看表中的内容,应该通过select语句。如:select * from tablename;
数据库和表的名称不一定要大写。但命令最好大写,也就是关键字一般大写。
但SQL本身不区分大小写。也就是会所,命令不大写也可以,但命令大写是良好的SQL编程习惯。大写能够让我们很容易分辨命令和数据库名称。
命令后一定要加分号;。
不可以创建已经存在的数据库或表。
RDBMS(Relational Database Management System):关系型数据库管理系统。
2、 在创建表前先把数据分类,尤其要注意每列的数据类型。
在使用CREATE DATABASE xx语句来创建存储所有表的数据库。
使用USE xx语句进入数据库,然后创建表。
所有表都以CREATE TABLE tablename语句创建,句中包含列名及其数据类型。
例如:create table student (name varchar(20), id varchar(10), birthday date);
一些常用的数据类型有CHAR,VARCHAR,BLOB,INT,DEC,DATE,DATETIME。每种数据类型的存储规则都不一样。对于不参与运算的整形应该声明为char型,如学生id等。
任何属于VARCHAR,CHAR,DATE, BLOB列类型的值都需要加单引号。DEC(有些像double型)和INT不需要加单引号,如果加了,mysql也许也不会认为有错,它会省略多余的引号,并把dec和int值视为数字,而不会因为引号就把这些值视为文本值。
BLOB运来处理大量文本数据,如处理超过255个字符的文本,如果少于255个,使用可能会浪费空间。而CHAR或VARCHAR只会占用特定空间,不会多于256个字符。
DEC,有些像double型,如DEC(6,2),前者代表总位数,后者是小数点后的位数。
DATE处理日期。
使用DROP Table tablename 删除表,无论表里是否有数据,都会删除。
注意:复习要点:
A、 在创建表前先把数据分类,尤其要注意每列的数据类型。
B、 使用createdatabase xx语句来创建存储所有表的数据库。
C、 使用usedatabase xx/use xx语句进入数据库,然后创建表。
D、 所有表都以createtable xx语句创建,句中包含列名及数据类型。
E、 一些常用的数据类型有char,varchar,blob,int,desc, date,datetime。每种数据类型的存储规则都不一样。
3、 查看新建的表的结构:DESC/desctablename; desc是describe的缩写。
如何在新建的空表中加入新列?
答:没有办法,删除该表后重新建表。除非该表不是空表。
将数据添加到表中:INSERT INTOtablename (field1,field2….fieldn)
VALUES(‘xx’, ‘xx’...’xx’), (‘xx’, ‘xx’, ‘xx’);
如果你的数据库“挂”在那边,试着在输入整段语句后多输入一个单引号并加上分号。
数据值的顺序必须和列名的顺序完全一致。
可以改变列名的顺序,只要记得数据值的顺序也要一起调整。
列名可以省略,但数据值必须全部填入,而且必须与当初创建表时的列顺序完全相同。
也可以只填入部分列值。没赋值的列默认为NULL。毕竟有时记录不是完整的。
4、 SQL中NULL表示未定义,它不等于零,也不等于空值。在表中,有些列应该有值,如姓名,此时应该在该列的数据类型后面加上NOT NUll。如:create table tablename(xx varchar(30)notnull); 这样你在插入数据insert时,必须插入该列,不能省略。或者你设置默认值,如:
create table tablename(xx varchar(30) not null default xx);
5、 select * from tablename where field(列名) = ‘xx’;
* 告诉RDBMS显示所有的列。
如果只想显示某列,把*改成那列列名即可。要显示若干个列名时,用逗号隔开即可。
可以在select中指定查询结果的列顺序,磁盘里存储数据的顺序并不重要。
如selectcolumn1, column3 from tablename;
或selectcolumn3, column1 from tablename;或改为其其它你喜欢的顺序。
6、当出现‘> 说明你的SQL出现了不成对的‘,此时你输入单引号和分号即可结束语句,此时会提示错误,但SQL重新恢复响应。
如果要出入包含单引号的varchar,char,blob数据时,可以加入转义字符反斜杠。
如:’linxingjin\’sxx’.
还有一种方法就是在单引号前在加个单引号,如’linxingjin’’s xx’.
不要使用双引号,因为你的SQL语句日后会搭配其他编程语言,如PHP。在编程语言中使用” ”表示从这里开始时SQL语句,这样单引号才会被视为SQL语句中的一部分,而不是其他编程语言的一部分。
7、 SQL语言中等号是= ,不等号是 <>.
查找所有名称大于以L开头的饮料名称。
Select drink_name from tablename where drink_name >= ‘L’and drinkName < M;
一般情况下,每个WHERE子句都把列名放在运算符的左边,经测试,如果把列名放在右边也可以。
不可以直接通过等号选择NULL,如select * from tablename where xx = null;
而应该通过关键字IS NULL, 如select * from tablename where xx is null;
唯一直接选择NULL的方法就是利用关键字IS NULL。
当然,如果你要取得某列中的NULL,可以再where子句中选择其他列来间接获得。
8、SQL通配符必须与 LIKE运算符一起使用,可以进行模糊快速查找。
% 代表一个或多个字符。
_ (下划线) 仅代表一个字符
如select * from tablename where xx like ‘%jin’;
…where xx >= 30 and xx <= 60; 等价于 ….where xx between30 and 40; (30和40不能写反,较小值必须写在前面)。
如果要查找以G到O为首字母的xx的名称的话,应该使用O之后的字母。
如select * from tablename where xx between ‘G’ and ‘P’.
某些情况下,为了不使用过多的OR,可以使用关键字IN,加上用括号围起的值的集合。
不然,就是NOT IN。…where xx in (xx, xx, xx); 或 ….where xx not in(xx, xx, xx);
NOT可以和BETWEEN和LIKE一起使用。重点是NOT一定要紧跟在WHERE后面。
(NOT IN)除外。但是即使把not移动where后也可以运作。
如….where not xx between 30 and 40;
….where not xx like ‘%jin’;
当NOT和AND或OR一起使用时,则要直接接在AND和OR的后面。
对于<>(不等)而言,使用NOT也可以,此时就是双重否定,因此应该使用等号更合理。
NOT也可以套用在NULL上。…where not xx is null; 等价于 …where xx is notnull;
8、 记住表中的最后一行未必就是最新的输入记录。因为表中的数据随时可能经过排序等处理。Delete的使用:delete from tablename; 删除所有的行。
delete from tablename where xx = ‘xx’; 和select不一样,我们不需要指定删除的对象,它会删除整条记录。
delete不能删除某一列中的值或表中某一列的所有值。要改变某列的值应该使用update。
update语句:update tablename set xx1 = ‘xx3’, xx2=’xx4’… where xx1 = ‘xx2’;
update可用于更新一行或多行,一切都交给where字句决定。
set关键字是属于update语句的。
delete 可用于删除一行或多行,根据where子句而定。
除非你可以非常确定where子句只会删除你打算删除的行或进行更新操作时,否则都应该用select先确定情况是否正确。因为delect *和select的where子句完全一模一样。
9、 原子性数据的正式规则:
具有原子性数据的列中不会有多个类型相同的值。如某列中存放了多个值。这样不好的地方在于,查找起来相当不方便。
具有原子性数据的表中不会有多个存储同类数据的类。
规范化表的好处:减小数据库的大小,节省硬盘空间,方便查询。
每个数据行必须包含具有原子性的值。
每个数据行必须有独一无二的识别项,即主键(Primary Key)。
主键是表中的某个列,它可以让每一条记录称为唯一的。
主键不可以为NULL,插入新记录时必须指定主键值。主键必须简洁,主键应该只包含需要的独一无二的数据,不该有其它内容。主键值不可以修改。
最佳主键可能是新的主键。通过创建一个包含唯一性主键的列。如新增一个ID列。
注意:在SQL的世界中,关于该使用虚构、人造主键(如ID列),还是使用自然主键—表中现有的数据(例如车牌号或社会安全号),目前还有争议。我们不会站在某一边,以后讨论。
主键的创建通常会在编写CREATE TABLE代码时进行。
通过show create table tablename; 可以查看表tablename可能的创建的方式。
另外,还有show create database xx; 可以提供重建表所需的语句。
至于show create table tablename 中的反撇号的存在是因为RDBMS有时无法分辨出列名。
Show命令还有如下用法:show columns from tablename; 效果等同于desc tablename;
Show create database databasename;
Show index from tablename; 会显示任何编了索引的列以及索引类型。
Show warnings; 如果你从控制台收到SQL命令造成的错误信息,键入这个命令就可取得确切的警告内容。
如果在列名前后加上反撇号就能以SQL保留字(即关键字)作为列名(尽管这不是个好主意)。
例如:由于某些奇怪的原因,你想把某列命名为select。则下列命令无法实现:
Select varchar(150)但这个命令可以`select`varchar(50)
10、第一范式1NF(First Normal Form):是指数据库表的每一列都是不可再分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。每一个记录必须有主键。
第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库。
11、为ID列加上关键字AUTO_INCREMENT, 可以让SQL软件自动为该列填入数字,从1
开始,每次插入新记录时逐次递增1。
如: id int not null auto_increment;
如果你自己设定了一个id,则会覆盖AUTO_INCREMENT列的值。如果你设置id为NULL,则会被AUTO_INCREMENT忽略。
你可以把它添加到没有自动递增功能的列中,如下所示:
Altertable table_name change column column_name int(11) not null auto_increment;
而且你可以这样将它删除:
Altertable table_name change column column_name int(11) not null;
注意:每个表中只有一列可以加上AUTO_INCREMENT, 该列必须为整数类型且不能包含NULL。
12、如果要更改表的结构,如增加新的一列,增加主键等,可以同过alter语句。
Alter table tablename add column column_name not nullauto_increment first, add primary key (id);
其中first说明将该列添加到最前面。FIRST是可选关键字,不添加的话,默认添加在最后。通过将first改为after xx,指定该列添加到xx列之后。此外,还有BEFORE xx,LAST,SECOND,THIRD等关键字。
注意:测试时发现second,third,last不能用。
原因可能是:见后面红字那段,只有添加列时才是调整顺序的最佳时机。
更改表名: alter table old_tablename rename to new_tablename;
add 增加某列;
drop 删除某列;
alter tabletablename drop column column_name;
change 改变现有列的名称和数据类型(同时修改);
如:alter tabletablename change column old_column_name new_column_name type;
(最后的类型type不能忘加,最好保留原始数据类型,但可以让它多存储几个字符,如果你把数据改为另一种类型,你可能会丢失数据)。
想同时更改多列时,通过逗号隔开;
alter tabletablename
change columnold_column_name new_column_name type,
change …….;
modify 修改现有列的数据类型(如增加字符长度)和位置;
注意:它只会修改列的类型而不会干涉它的名称。
alter tabletablename
modfiy column column_namevarchar(100);
这也可以通过change实现,如:
alter tabletablename
change columncolumn_name column_name varchar(100);
至于alter table tablename modify column xx first;不行啊,无效,还是无法改变列的位置。
如果你的软件运行此操作的话,实际上它在后台运行了非常多的命令。它把我们要移除的列的内容暂时复制到临时变量中,然后卸载你要移除的列,再用alter创建与旧列同名的新列,并放在我们指定的位置,而后把临时表的内容复制到新列中,最后再删除临时表。一般而言,如果列中已经有内容,而且你使用的软件无法完成上述操作的话,最好不要对列的位置动手动脚,你可以通过select用任何顺序排序列。因此,只有添加列时才是调整顺序的好时机。
主键的移除:alter tabletable_name drop primary key;
小结:
想要同时改变列的名称和类型时请用change。
只想改变数据类型时请用modify。
有些RDBMS只有在添加新列时才允许改变列的顺序。
13、有用的字符串函数
select right/left(列名,2) fromtablename; 2表示字符数量
Selectsubstring_index(列名, ‘,’, 1) from tablename; 1表示命令要寻找的第一个逗号,如果是2,函数就会寻找第二个逗号,然后才截取它前面的所有内容。
这个函数会找出指定字符或字符串前的所有内容。(但我试了怎么不行呢)
select substring(your_string,start_position, length); 截取一部分your_string字符串。
upper(your_string)和lower(your_string)分别可把整组字符串改为大写或小写。
(别忘了加引号)
select reverse(your_string): 反转字符串里的字符排序。
select ltrim(your_string) 与 selectrtrim(your_string) 会返回清除多余空格后的字符串。
ltrim和rtrim分别清除字符左侧(前面) 和 右侧(后面)的多余空格。
select length(your_string); 返回字符串中的字符数量。
以上字符串函数可以select,update,delete搭配使用。
注意:字符串函数不会改变存储在表中的内容,它们只是把字符串修改后的摸样当成查询结果返回。
14、使用 update tablename
set new_column =
case
when column1 =somevalue1 then newvalue1
when column2 = somevalue2then newvalue2
else newvalue3
end;
跟C语言中的case 一样,一旦符号条件就退出,else就相当于default。
至于要不要用到else,看个人选择。如果不需要,也可以不加else,不过如果有else字句,就是完全不符合其他条件,也会更新列。有分类值总比没有值或有null好吧。
如果只想对部分列套用case表达式,可以在关键字end后加上where子句,这样,case就只会套用在符合where条件的列上。
15、order by默认升序,eg:order bycolumn_name asc;
如果想降序的话,关键字desc应位于order子句中的列名后;
eg:order by column name desc;
distinct在许多记录的某一列均为相同值时特别有用。还有,如果你只是想看看存储了哪些值,而不需要一长串重复的记录时,distinct也很好用。
Limit n 限制查询结果显示的数量。
Limit m, n; m表示从查询结果的起始处开始,n表示返回查询结果的数量。
16、外键是表中的某一列,它引用到另一个表的主键。
外键能用于确认一张表中的行与另一张表中的行相对应。此时,另一个表称为主键。
外键值可以使NULL。外键为空,表示在父表中没有相符的主键。
外键值不需唯一,事实上,外键通常都没有唯一性。
插入外键列的值必须已经存在于父表的来源列中,这是引用完整性。
创建外键约束后,就只能插入已经存在于父表中的值,有助于加强两张表间的连接。
外键约束能确保引用完整性(换句话说,如果表中的某行有外键,约束能确保该行通过外键与另一张表中的某一行对应)。如果我们试图删除主键表中的行或试着改变主键值,而这个主键是其他表的外键约束键时,就会收到错误警告。
17、数据模式:一对一: A的某条记录在B表中最多只能有一条相对应的记录。
使用一对一表的时机:
通常把一对一的数据留在主表更合理,但也有适合把某些列拉出来的时候:
a、 抽出数据或许能让你写出更快速的查询。例如,如果大多数时候你只需要查询SSN,就可以查询较小的SSN表。
b、 如果有列包含还不知道的值,可以单独存储这一列,以免主要表中出现NULL。
c、 我们可能希望某些数据不要太常被访问。隔离这些数据即可管制访问次数。
d、 如果有一大块数据,例如BLOB类型,这段数据或许存为另一张表会更好。
数据模式:一对多: A的某条记录在B表中可以对应到多条记录,但B表中的每一条记录都只会对应到A表中的某一条记录。
数据模式:多对多:通常有两个一对多关系并利用junction table在中间连接而构成。
Junctiontable(连接表),用它来存储两个相关表的主键。
18、部分函数依赖是指,非主键的列依赖于组合主键的某个部分(不完全依赖于组合主键)。
传递函数依赖:任何非主键列于另一个非主键列有关联。
有什么简单的方式可以避免部分函数依赖?
可以采用新的专用于索引的字段,如增加id列,这样就没有字段依赖于它。
19、第二范式(2NF):
规则一:先符合1NF;
规则二:没有部分函数依赖性。
第三范式(3NF):
规则一:先符合2NF
规则二:没有传递函数依赖性。(因此,在考量3NF的关键时可以忽略主键)
20、as能把select的查询结果填入到新表中。
创建别名:在查询中首次使用原始列名的地方接as并设定要采用的别名。
Select xx1as xx2 from tablename;(其中as也可以省略)
注意:别名改变了查询结果中的列名,但并未改变来源列的名称。别名只是临时的。
你也可以为表创建别名,同为列创建别名一样。
21、交叉连接:select t.toy, b.boy from toys as t cross join boys as b;
等价于selecttoys.toy, boys.boy from toys, boys.(省略cross join)
交叉联接是内联接的一种。
内联接基本上就是通过查询中的条件移除了某些结果数据行后的交叉联接。
内联接:selectsomecolumns from table1 inner join table2 on(where) somecondition;
内联接利用条件式里的比较运算符结合两张表。
内联接分为相等联接,不等联接及自然联接。
自然联接只有在联接的列在两张表中的名称都相同时才会有用。(不使用on子句的内联接)
自然联接会识别出每个表里的相同名称并返回相同的纪录。
Select boys.boy,toys.toy from boys natural join toys
外联接:
左外联接:接收左表的所有行,并用这些表与右表中的行匹配。当左表与右表具有一对多关系时,左外联接特别有用。
左外联接的结果集中的NULL表示右表中没有找到与左表相符的记录。
22、子查询,是被另一个查询包围的查询,也可被称为内层查询。
在单一查询不够用的时候:请用子查询。
子查询都是单一select语句。
大多数情况下,内层查询只能返回单一值(也就是一个列里的一行)。而后,外层查询才能利用这个值与列中的其他值进行比较。
一般而言,子查询必须返回一个值。使用IN是例外情况。大部分时候,子查询只需要返回单一值。
如果子查询可以独立运行且不会引用外层查询的任何结果,即称为非关联子查询。
飞关联子查询使用in或not in来检查子查询返回的值是否为集合的成员之一。
23、联合(UNION):把两张或更多表的查询结果合并至一个表中。
Select xx from xxunion select xx from xx union xx from xx
Union只能接受一个orderby且必须位于语句末端。这是因为union已经把多个select语句的查询结果串联起来并分组了。
如果想对查询结果排序,请在合并的最后一条select语句中加入order by。这样就能排列整个结果集的顺序。
每个select语句中列的数量必须一致。不可以由第一条语句选择了两列,由其他语句却只选取一列。
Select语句的顺序不重要,不会改变结果。
SQL默认会清除联合的结果中的重复值。
列的数据类型必须相同或者可以互相转换。
如果处于某些原因而需要查看重复数据,可以使用union all运算符。这个运算符返回每个相符的记录,而不只是没有重复的记录。
24、intersect(交集):只会返回同时在第一个与第二个查询中的列。
Select xxfrom xx intersect select xx from xx
Except(差集):返回只出现在第一个查询,而不在第二个查询中的列。
Select xxfrom xx except select xx from xx
25、几乎能用子查询办到的事都能用联接实现。
26、check(检查)约束限定允许插入某个列的值。它与where子句都使用相同的条件表达式。
如果插入的值无法通过check条件,则出现错误信息。
检查约束可确保输入数据的合理性。你不会在最后发现一堆神秘的值。
注意:在MySQL中,虽然你可在创建表时加上检查约束,但它不会有什么帮助。MySQL只会忽略它。
27、视图(View)的创建:create view xx as xx….(正常语句)
若想查看视图的内容,可以把它想成一张表,我们一样可以使用select选出它的内容:
Select *from xx(视图名称)
当在查询中实际使用视图时,它的行为方式与子查询一样。
基本上,视图是一个只有在查询中使用view时才存在的表,它被称为虚拟表。
因为其行为和表一样,也能执行表可用的操作。但虚拟表不会一直保存在数据库里。
如果创建了视图,就不需要重复创建复杂的联接与子查询。视图隐藏了查询的复杂性。当SQL与PHP等编程语言结合后,把视图加入程序代码会比加入冗长、复杂、充满联接的查询更简单。简单代表不容易打错字,程序代码也会更容易理解。、
创建视图可以隐藏读者无需看到的信息。
CheckOption创建可更新视图时,使用这个关键字强迫所有插入语更新的数据都要满足视图里的where条件。
CheckOption检查每个进行insert或delete的查询,它根据视图中的where自己来判断这些查询可否执行。
虽然有使用视图的正当理由,但直接使用表操作insert,update, delete等查询通常会更容易。
当不需要使用视图后,使用语句:drop view xx;
如何查看已创建的视图?
视图会像表一样出现在数据库中。利用show tables就能看到所有视图和表。也因为视图就像表,所以使用desc即可观察它的结构。
28、事务(transaction)是一群可完成一组工作的SQL语句。
在事务过程中,如果所有步骤无法不受干扰地完成,则不该完成任何单一步骤。
为了帮助你判断SQL步骤是否为一个事务,可以借助ACID。这个简称由四个字符组成,是判断一组SQL语句是否构成一个事务的四个原则。
A— Atomicity(原子性)。事务里的每一个步骤都必须完成,否则只能都不完成。不能只执行部分事务。
B— Consistency(一致性)。事务完成后应该维持数据库的一致性。如:在完成两组金钱事务后,钱的数量应该符合账户余额的情况。
C— Isolation(隔离性)。表示每次事务都会看到具有一致性的数据库,无论其他事务有什么行动。
D— Durability(持久性)。事务完成后,数据库需要正确地存储数据并保护数据免受断电或其他威胁的伤害。通常把事务记录存储在主数据库以外的地方。
Starttransaction:持续追踪后续所有SQL语句,直到你输入commit或rollback。
Commit:等到我们满意后在提交,让一切改变成真。
Rollback:回滚,回到事务开始前的状态。
在你commit之前数据库不会发生任何改变。
在MySQL下使用事务前,你需要先采用正确的存储引擎(storage engine)。存储引擎是存储所有数据库内容和结构的背后功臣。有些存储引擎运行事务,有些则不行。
存储引擎必须是RDB或InnoDB,两种支持事务的引擎之一。
RDB与InnoDB是两种RDBMS在幕后存储数据的可能方式。这些就是存储引擎,使用其中一种可确保事务能够使用。
29、不同的RDBMS创建用户的方式也不一样。请参考你的数据库软件的说明文档,找出正确的创建用户的方式。
如:create userxx identified by ‘xxxx(密码)’;
注意:新用户不能对数据库中的任何对象执行任何SQL语句,我们刚刚创建的新用户没有任何权限。Grant语句可以为用户授予操作数据库的特权。使用grant语句可以控制用户对表和列可执行的操作。
如:grantselect on tablename to username;
Grant allon tablename to username; 表明授予用户选择select,更新update,插入insert,删除delete某个表的权限。
Grantdelete on tablename to username with grant option; 表明授予用户delete某表的权限并允许该用户将这个权限授予其他人。
Grant小结:
A、 可用同一个grant语句为多为用户设定权限。每个提到名称的用户都会被授予相同权限。
B、 With grant option让用户能把刚刚获得的权限授予其他用户。
C、 指定用户可于某个表中使用的列,而不是允许用户操作整张表。
D、 一段语句可对表指定超过一种权限,以逗号分隔各种权限即可。
E、 Grant all把select,update,insert,delete指定表内容的权限都授予用户了。
F、 使用database_name.*可把权限范围运用到数据库中的每张表上。
如果要把授予xx的权限收回,需要revoke语句。
如:revoke select ontablename from username;
如果只想撤销with grantoption,但不触及用户的权限,可以使用
Revoke grantoption on delete on tablename from username;
此时用户仍具备删除表的权限,但是不能把这项权限分给别人。
Revoke 的副作用,对目标用户撤销权限时,会影响目标以外的用户。
但可以通过关键字cascade和restrict来精确地锁定目标用户,决定谁会失去权限,谁又能保存权限。
第一种方式:使用cascade(串联的意思)移除目标用户的权限后,如果目标用户已将该权限授予他人,则连同被授予者的权限一起移除。
Revokedelete on tablename from username cascade;
若被撤销权限的目标用户已把权限授予他人,则使用如下的第二种方式restrict可能会返回错误信息。
Revokedelect on tablename from username restrict;
此时两方的权限都会被保留。
如果指定列名的grant语句,则此时insert实际上就是个无用的权限,因为如果只能插入某列的值,就无法真正地插入一条新纪录到表中。
选取所有数据库中的所有表(视不同的RDBMS而定):grant select on *.* to xx;
第一个*代表所有数据库,第二个*代表所有表;
如果未指定revoke的使用方式,cascade通常是默认值。
30、我们需要授予一群人所需权限,同时又让他们每个人都有自己的账号的方式,此时就需要角色(role)。角色是把特定权限汇集成组,在把组权限授予一群人的方式。角色成为一个数据库对象,可以数据库变动时依需求调整,而不需要逐一指定、调整每名用户的权限。
注意:MySQL目前没有角色功能。
Createrole role_name;
Grantselect,inserton table_name to role-name;
此时,我们已经创建了角色,也已授予角色权限,现在需要指定用户的角色…..
Grantrole_name to username(with admin option); 其中with admin option允许用户把role_name授予其他人。
卸除角色:droprole role_name;
31、结合create user与grant
Createuser xx identified by ‘123456’;
Grantselect on table_name to xx;
合并成一句:grantselect on table_name to xx identified by ‘123456’