基本表的定义、删除与修改
定义基本表
创建了一个模式就建立了一个数据库的命名空间,一个框架。在这个空间中首先要定义的是该模式包含的数据库基本表。
SQL语言使用CREATE TABLE语句定义基本表,其基本格式如下:
sql
CREATE TABLE tbl_name
(
字段名1 数据类型 [ 列级完整性约束条件 ] [ 默认值 ]
[ , 字段名2 数据类型 [ 列级完整性约束条件 ] [ 默认值 ] ]
[ , ... ]
[ , 表级完整性约束条件 ]
)[ ENGINE = 引擎类型 ];
- 列级完整性约束条件有:NULL(空)、UNIQUE(取值唯一)、NOT NULL UNIQUE(取值唯一且不能取空值)
- 建表的同时通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的数据字典中,当用户操作表中的数据时由关系数据库管理系统自动检查该操作是否违背这些完整性约束条件。如果完整性约束条件设计该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
例1

sql
use db_exam;
create table dept
(
deptno int primary key auto_increment,
dname char(20) not null,
addr varchar(50)
);
如类型为int建议加自增长标识:auto_increment
定长字符串:char
变长字符串:varchar
创建外键
基本语法格式:[ CONSTRAINT 外键名 ] FOREIGN KEY(外键列) REFERENCES 父表名 (父表列)
例2:

sql
use mysqltest;
create table Dept1
(
deptno int primary key, /*列级完整性约束条件,deptno不能取空值*/
dname varchar(20),
higherdeptno int default null,
[constraint fk_higher] foreign key(deptno) reference Dept2(deptno)); /*表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno*/)
)
使用add语句向已有的表中添加外键
例3:

sql
alter table tb_gs add foreign key(sno) references tb_student(sno);
指定字符集
在字段定义中指定字符集的标准语法是:字段名 数据类型(长度) CHARACTER SET 字符集名称 其他约束
例4:

sql
use newtes;
create table Emp
(
empid int primary key auto_increment,
empname char(20) character set GB2312 not null,
streename varchar(50),
cityname varchar(30) not null default 'N/A'
);
标准关键字:CHARACTER SET(完整写法)或 CHARSET(简写)
位置:放在数据类型后面、其他约束(如 NOT NULL)前面
| 字符集名称 | 说明 |
|---|---|
| GB2312 | 简体中文字符集 |
| GBK | 扩展中文字符集 |
| UTF8 | Unicode 变长编码 |
| UTF8MB4 | UTF8 完整版(含 Emoji) |
| LATIN1 | 西欧字符集 |
修改基本表
SQL语言用ALTER TABLE语句修改基本表,其一般格式为:
sql
ALTER TABLE<表名>
[ ADD [ COLUM ] <新列名><数据类型> [ 完整性约束 ] ]
[ ADD<表级完整性约束> ]
[ DROP [COLUMN] <列名> [ CASCADE | RESTRICT ] ]
[ DROP CONSTRAINT<完整性约束名> [ RESTRICT | CASCADE ] ]
[ ALTER COLUMN <列名><数据类型> ];
其中<表名>是要修改的基本表,ADD子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件。DROP COLUMN子句用于删除表中的列,如果指定了CASCADE短语,则自动删除引用了该列的其他对象,比如视图;如果指定了RESTRICT短语,则如果该列被其他对象引用,RDBMS将拒绝删除该列。DROP CONSTRAINT子句用于删除指定的完整性约束条件。ALTER COLUMN子句用于修改原有的列定义,包括修改列名和数据类型。
DEFAULT
默认值是指在向数据表中插入数据时,如果没有明确给出某个字段所对应的值,则 DBMS 此时允许为此字段指定一个值。
需要注意的是,如果没有为字段指定默认值,MySQL 会自动地为其分配一个,即如果字段可以取 NULL 值,则默认值就是 NULL,而如果字段被声明为 NOT NULL,那么默认值就取决于字段的类型:
- 对于没有声明 AUTO INCREMENT 属性的数值类型,默认值是 0;对于一个 AUTO_INCREMENT 列,默认值是在顺序中的下一个值。
- 对于除 TIMESTAMP 以外的日期和时间类型,默认值是该类型适当的"零"值;对于表中第一个 TIMESTAMP 列,默认值是当前的日期和时间。
新增列
例1:

sql
alter table tb_student add [column] ssex char(1) default 'M';
新增约束
字段添加唯一约束,标准语法为:ALTER TABLE 表名 ADD [CONSTRAINT 约束名] 约束类型 (字段名);
例2:

sql
alter table tb_group add constraint unique(gname);
不带约束名(系统自动命名)
修改列的数据类型
ALTER TABLE 语句提供了三条修改字段的子句,分别如下:
- CHANCE COLUMN子句。CHANGE COLUMN子句可同时修改表中指定列的名称和数据类型。ALTER TABLE 语句中可以同时添加多条 CHANGE COLUMN子句 只需彼此间用逗号分隔。
- ALTER COLUMN子句。ALTER COLUMN子句可以修改或删除表中指定列的默认值。
- MODIFY COLUMN子句。与 CHANCE COLUMN子句有所不同,MODIFY COLUMN子句只会修改指定列的数据类型,而不会干涉它的列名。另外,MODIFY COLUMN子句还可以通过FIRST或AFTER关键字修改指定列在表中的位置。
上述三条子句的常用语法格式分别为:
sql
ALTER TABLE tb_name CHANGE [ COLUMN ]原字段名 新字段名 数据类型 [ 约束条件 ];
ALTER TABLE tb_name ALTER [ COLUMN ]字段名 { SET | DROP } DEFAULT;
ALTER TABLE tb_name MODIFY [ COLUMN ]字段名 数据类型 [ 约束条件 ] [ FIRST | AFTER 已有字段名 ];
例3:

sql
alter table tb_student modify native varchar(20);
数据查询
SQL提供了SELECT语句进行数据查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为:
sql
SELECT [ ALL | DISTINCT | DISTINCTROW ] <目标列表达式1> [ ,目标列表达式 ]...
FROM <表名1或视图名1> [ <表名2或视图名2> ]...
[WHERE <条件表达式>]
[GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ORDER BY <列名2> [ ASC | DESC ] ]
[LIMIT [ m, ] n ]
使用聚合函数查询
聚合函数是MySQL提供的一类系统内置函数,常用于对一组值进行计算,然后返回单个值。
| 函数名 | 说明 |
|---|---|
| COUNT( DISTINCT | ALL * ) | 统计数据表中的记录数 |
| COUNT( DISTINCT | ALL <列名> ) | 统计数据表的一列中值的个数 |
| MAX( DISTINCT | ALL <列名> ) | 求数据表的一列值中的最大值 |
| MIN( DISTINCT | ALL <列名> ) | 求数据表的一列值中的最小值 |
| SUM( DISTINCT | ALL <列名> ) | 计算数据表的一列中值的总和 |
| AVG( DISTINCT | ALL <列名> ) | 计算数据表的一列中值的平均值 |
其中,如果指定关键字 DISTINCT,则表示在计算时要取消指定列中的重复值;如果不指定 DISTINCT 短语或指定 ALL 短语( ALL 为默认值),则表示不取消重复值。注意:除函数 COUNT( *) 外,其余聚合函数( 包括 COUNT(<列名>)) 都会忽略空值。
例1:

sql
select readerName, bookNo from tb_reader, tb_borrow
where tb_reader.readerNo = tb_borrow.readerNo and borrowDate > '2024-01-01';
注意: 当分别从两个不同的表选取字段时,SELECT 语句的标准结构是:
SELECT 字段1, 字段2, ... FROM 表1, 表2, ...这个写法:
select readerName from tb_reader, bookNo from tb_reader, tb_borrow where...×应该为:
select readerame, bookNo from tb_reader, tb_borrow where√
定义字段的别名
在系统输出查询结果集中某些列或所有列的名称时,若希望这此列的名称显示为自定义的列名。则可以在 SELECT 子句的目标列表达式之后添加 AS 子句,以此来指定查询结果集中字段的别名。为字段定义别名的语法格式是:字段名 [AS] 字段别名
例2:COUNT函数

sql
select count(*) as 总人数 from tb_employee where deptno = (select deptno from tb_dept where dname = '销售部');
例3:SUM函数

sql
select sum(price) as total from tb_commodity where cname = '电视机' and origin = '北京';
例4:

sql
select name as 姓名, 2014-birth as 年龄 from tb_emp;
GROUP BY子句和ORDER BY子句
在 SELECT 语句中,允许使用 GROUP BY 子句对数据进行分组运算。分组运算的目的是为了细化聚合函数的作用对象。如果不对查询结果分组,聚合函数作用于整个查询结果,对查询结果分组后。 聚合函数分别作用于每个组,查询结果按组聚合输出。
CROUP BY 子句的语法格式是: [ GROUP BY 字段列表 ] [ HAVING <条件表达式> ]
例5:

sql
select name, Student.stuid, sum(grade) as total from Student,Score
where Student.stuid = Score.stuid
group by name, Student.stuid
order by total asc;
HAVING短语
HAVING 是在 GROUP BY 分组之后,用于对分组结果进行条件筛选的子句。它和 WHERE 最大的区别在于:WHERE 过滤行,HAVING 过滤分组。
WHERE中不能使用聚合函数((如 SUM、AVG、COUNT 等))
SQL 语句的执行顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
例6:

sql
select cname as 课程名, max(grade) as 最高分数 from Score
group by cname
having avg(grade) > 85;
例7:

sql
create view v_gs(社团名, 成员总数) as select gname, count(*) from tb_group, tb_gs
where tb_group.gno = tb_gs.gno
group by gname
having count(gname)
order by count(*) desc;
DISTINCT 短语
例8:

sql
select dinstinct aname,major from tb_author,tb_aubook
where tb_author.ano = tb_aubook.ano and arole = '主编';
例9:

sql
select dname from tb_department, tb_employee
where tb_department.dno = tb_employee.dno
group by dname
having count(distinct jobno) >= 3;
IN 和 NOT IN关键字
例10:

sql
select 学号 from 选课 where 课程名称 = 'C语言程序设计'
and 学号 in (select 学号 from 选课 where 课程名称 = '操作系统');
因为需要查询同时选修"C语言程序设计"和"操作系统"两门课程的学生学号,所以应该求出两次查询结果的交集,where后面条件查询到选修了C语言程序设计的学生学号,and后面的语句得到选修了操作系统的学生学号。而and是并且的意思(交集),所以整个语句就是查询同时选修"C语言程序设计"和"操作系统"两门课程的学生学号。
例11:

sql
select tb_room.rtype from tb_room where tb_room.rno not in (select rno from tb_booking);
带LIKE关键字的字符串匹配查询
关键字 LIKE 可以用来进行字符串的匹配,其一般语法格式如下:[ NOT ] LIKE '<匹配串>'[ ESCAPE '<换码字符> ']
其含义是查找指定的字段值与"<匹配串>"相匹配的记录。"<匹配串>" 可以是一个完整的常字符串,也可以含有通配符。利用通配符可以在不能完全确定比较值的情形下,创建一个用于比较特定数据的搜索模式,并置于关键字 LIKE 后。通配符可以出现在指定字段值的任意位置,并且可以同时使用多个。 MySQL 所支持的常用通配符有两种:"%"和""。其中,"%"(百分号)代麦任意长度的字符串,甚至包括长度为0的字符;""(下橫线)代表任意单个字符。能进行匹配运算的字段可以是 CHAR、VARCHAR、TEXT、DATETIME 等数据类型,运算返回的结果是逻辑值 TRUE 或 FALSE。
例12:
sql
update tb_class set department = '管理工程学院' where classno LIKE '%信息管理%';
限制查询结果的数量
当使用 SELECT 语句返回的结果集中行数很多时,为了便于用户对查询结果集进行浏览和操作,可以使用 LIMIT 子句来限制 SELECT 语句返回的行数。 LIMIT 子句的语法格式是:LIMIT [ 位置偏移量, ] 行数
其中,"行数"指定需要返回的记录数;"位置偏移量"是一个可选參数,指示 MySOL 从哪一行开始显示,第一条记录的位置偏移量是 0,第二条记录的位置偏移量是 1...以此类推。如果 不指定"位置偏移量",系统将会从表中的第一条记录开始显示。
注意:"行数"必须是非负的整数常量。若指定行数大于实际能返回的行数时,MySQL 将只返回它能返回的数据行。
例13:

sql
select tb_student.sno, sname, count(*) from tb_student,tb_gs
where tb_student.sno = tb_gs.sno
group by tb_student.sno, tb_student.sname
order by count(*) desc
limit 0,2;
注意:SELECT 后面的列名,除了聚合函数(COUNT、SUM、AVG 等),其他的都要列入 GROUP BY 里。
数据更新
数据插入
插入完整的数据记录
使用 INSERT 语句向数据库的表中插入记录时,要求指定表名称和插入到新记录中的值,其基本的语法格式是:INSERT INTO tb_name(column_list) VALUES(value_list);
其中,tb_name指定要插入数据的表名,column_list指定要插入数据的字段,value_list 指定每个字段对应插入的数据。注意,使用该语句时字段和数据值的数量必须相同,并且要保证每个插入值的类型和对应字段定义的数据类型匹配。
向表中所有属性列插入值的方法有两种:一种是指定所有字段名,另一种是不指定字段名。 不指定字段名时,值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同。
例1:

sql
insert into tb_dept(deptno, dname,manager, telephone) values('D4', '公关部', 'Liming', '010-82953306');
为表的指定字段插入数据
为表的指定字段插入数据就是在 INSERT 语句中只给部分字段插入值,而其他字段的值为表定义时的默认值,没有定义默认值的字段应允许取空值。
例2:

sql
insert into tb_commodity(cname, ctype, origin, birth, price) values('钢笔', '文具', '上海', '2012-12-25', 25);
修改数据
修改字段默认值
MySQL 中修改字段默认值的标准语法是:ALTER TABLE 表名 ALTER COLUMN 字段名 SET DEFAULT 默认值;
例3:

sql
alter table tb_employee alter column salary set default 3500;
更新数据
修改操作又称为更新操作,其语句的一般格为:
sql
UPDATE<表名>
SET<列名>=<表达式> [,<列名>=<表达式>]...
[ WHERE<条件> ];
例4:

sql
update tb_student set smajor = '计算机' where sno = 100;
删除数据
删除表中列(字段)
删除表中一列(字段)的基本语法格式:ALTER TABLE 表名 DROP [COLUMN] 列名;
其中,COLUMN 关键字是可选的,可以省略。
例5:

sql
alter table tb_commodity drop [column] desc1;
删除表中的行(元组)
在MySQL中,可以使用DELETE语句删除表中的一行或多行数据。DELETE语句的语法格式为:DELETE FROM tb_name [ WHERE <conditions> ];
其中,tb_name为指定要删除数据的表名;WHERE子句为可选项,用于指定删除条件,如果不指定WHERE子句,DELETE语句将删除表中的所有记录。
例6:

sql
DELETE FROM tb_gs WHERE tb_gs.sno IN (
SELECT sno FROM tb_student WHERE smajor = '计算机'
);
区别:IN和 =
| 写法 | 含义 | 适用场景 |
|---|---|---|
| IN (...) | 匹配子查询返回的多个值中的任意一个 (可以返回 0 行、1 行或多行) | 子查询返回多行时 |
| = (...) | 匹配子查询返回的唯一一个值 (必须且只能返回 1 行) | 子查询必须只返回一行,否则报错 |
视图
创建视图
sql
CREATE [ OR REPLACE ]
VIEW view_name [ ( column_list ) ]
AS SELECT_statement
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
主要语法说明如下:
- OR REPLACE:可选项,用于指定 OR REPLACE子句。 该语句用于替換数据库中已有的同名视图,但需要在该视图上具有 DROP 权限。
- view_name:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。
- column_list:这条可选子句可以为视图中的每个列指定明确的名称。其中,列名的数目必须等于 SELECT 语句检索出的结果数据集的列数,并且每个列名间用逗号分隔。如若省略 column_list子句,则新建视图使用与基础表或源视图中相同的列名。
- SELECT statement:用于指定创建视图的 SELECT 语句。这条 SELECT 语句给出了 的定义,它可用于查询多张基础表或源视图。
- WITH CHECK OPTION:这条可选子句用于指定在可更新视图上所进行的修改都需要符合 select_statement 中所指定的限制条件,这样可以确保数据修改后仍可以通过视图看到修改后的数据。当视图是根据另一个视图定义时,WITH CHECK OPTION 给出两个參数,即 CASCADED 和 LOCAL,它们决定检查测试的范围。其中,关键字 CASCADED 为选项默认值, 它会对所有视图进行检查,而关键字 LOCAL 则使 CHECK OPTION 只对定义的视图进行检查。
例1:

sql
create view v_emp as
select eno, ename, age, salary from tb_employee
where deptno = (select deptno from tb_dept where dname = '采购部')
在指定数据库中创建视图
sql
CREATE VIEW 数据库名.视图名 AS
SELECT 列1, 列2, ...
FROM 数据库名.表名
WHERE 条件;
例2:

sql
create view db_mall.v_bjcommodity as
select cno, cname, ctype, origin, birth, price from db_mall.tb_commodity
where origin = '北京';
//如果是全部列的话可以简化为:
create view db_mall.v_bjcommodity as
select * from db_mall.tb_commodity
where origin = '北京';
例3:

sql
create view tb_score.v_avg(cname, caverage) as
select cname, avg(grade) from tb_score
group by cname;
例4:

sql
//显式列名
create view v_borrow(读者编号, 借书总册数) as
select readerNo, count(bookNo) from tb_borrow
group by readerNo;
//隐式列名
create view v_borrow as
select readerNo [AS] 读者编号, count(bookNo) [AS] 借书总册数 from tb_borrow
group by readerNo;
注意:视图中的列名(读者编号,借书总册数)不需要打引号
标识符:指数据库、表、列、视图等对象的名称。它们直接书写,不加引号。
字符串:指实际的数据值,需要用单引号 ' 括起来。
例5:

sql
create view db_booking.v_LastBooking as select bno, cname
from tb_booking, tb_cusomers
where tb_booking.bno = (select max(bno) from tb_booking) and tb_booking.cno = tb_cusomers.cno;
索引
建立索引
MySQL提供了三种创建索引的方法。 一种是在创建表的同时创建索引,另外两种分别是在已经存在的表上使用 CREATE INDEX 语句创建索引,或使用 ALTER TABLE 语句添加索引。
使用 CREATE TABLE 语句创建索引
CREATE TABLE 语句可在创建表的同时创建该表的索引,其语法格式是:
sql
CREATE TABLE tbl_name[ col_name data_type ]
[ CONSTRAINT index_name ] [ UNIQUE ] [ INDEX | KEY ]
[ index_name ](index_col_name[ length ]) [ ASC | DESC ]
语法说明如下:
- tbl_name:指定需要建立索引的表名。
- index_name:指定所建立的索引名称。 一张表上可以建立多个索引,而每个索引的名称必须是唯一的。
- UNIQUE:可选项,指定所创建的是唯一性索引。
- index_col_name:指定要创建索引的列名。通常可考虑将查询语句中在 WHERE 子句和 JOIN 子句里出现的列作为索引列。
- length:可选项,用于指定使用列的前 length 个字符创建索引。使用列值的一部分创建索引有利于减小索引文件的大小, 节省磁盘空间。当然,在某些情况下,只能对列的前缀进行索引。另外,为 BLOB 或 TEXT 类型的数据列建立索引时必须使用前缀索引。前缀最长为 255 字节,但对于 MyISAM 和 InnoDB 表,前缀最长为 1000字节。
- ASC I DESC:可选项,指定索引是按升序(ASC)还是降序 ( DESC)排列,默认为 ASC。
使用 CREATE INDEX 语句创建索引
在SQL语句中,建立索引使用CREATE INDEX语句,其一般形式为:
sql
CREATE [UNIQUE] INDEX idex_name
ON tbl_name (col_name[(length)] [ ASC | DESC ]...)
使用 ALTER TABLE 语句创建索引
在MySQL中,除了使用CREATE INDEX语句在一张已存在的表上创建索引之外,还可以用ALTER TABLE语句实现类似的功能。
sql
ALTER TABLE tbl_name
ADD [ UNIQUE | FULLTEXT ] [ INDEX | KEY ] [ index_name ] (col_name[ length ] [ ASC | DESC ],...)
例1:

sql
create unique index idx_stu on tb_student(sno); //使用 CREATE INDEX 语句创建索引
alter table tb_student add unique index idx_stu(sno); //使用 ALTER TABLE 语句创建索引
例2:

sql
alter table tb_dept add unique index idx_dept(department desc);
建立组合索引
例3:

sql
create index idx_gs on tb_gs(gno asc, sno desc) ;
ROUND()函数
例4:

sql
create view V_成绩(课程名称,平均成绩) as select 课程名称,round(avg(成绩), 2) from 选课
group by 课程名称 order by avg(成绩) desc;
修改索引
对于已经建立的索引,如果需要对其重新命名,可以使用ALTER INDEX语句。其一般格式为:ALTER INDEX <旧索引名> RENAME TO <索引名>;
用户账户管理
创建用户账户
可以使用CREATEUSER语句来创建一个或多个MySQL账户,并设置相应的口令,其语法格式为:CREATE USER user_specification [ , user_specification ]...
其中,user_specification的格式为:user [ IDENTIFIED BY [ PASSWORD ] 'password' | IDENTIFIED WITH auth_plugin [ AS 'auth_string' ] ]
语法说明如下:
- user:指定创建的用户账号,其格式为'user_name'@'host name'。 这里,user_name 是用户名host_name 为主机名,即用户连接 MySQL 时所在主机的名字。如果在创建的过程中,只给出了账户中的用户名,而没指定主机名,则主机名会被默认为是"%",表示一组主机。
- IDENTIFIED BY 子句:用于指定用户账号对应的口令,若该用户账号无口令,则可省略此子句。
- 可选项 PASSWORD:用于指定散列口令,即若使用明文设置口令时,需忽略 PASSWORD 关键字;如果不想以明文设置口令,且知道 PASSWORD( )函数返回给密码的散列值,则可以在此口令设置语句中指定此散列值,但需要加上关键字 PASSWORD。
- password:指定用户账号的口令,在 IDENTIFIED BY 关键字或 PASSWORD 关键字之后。给定的口令值可以是只由字母和数字组成的明文,也可以是通过 PASSWORD( ) 函数得到的散列值。
- IDENTIFIED WITH 子句:用于指定验证用户账号的认证插件。
- auth_plugin:指定认证插件的名称,紧跟在IDENTIFIED WITH关键字之后。
例1:

sql
create user 'Yaoming'@'localhost' identified by 'abc123';
账户权限管理
授予权限
SELECT:授予访问权限
INSERT:授予添加权限
DELETE:授予删除权限
UPDATE:授予修改权限
CREATE:授予创建权限
sql
GRANT
priv_type [(column_list)] [, privilege_type [(column_list)]] ...
ON [ object_type ] priv_level
TO user_specification [, user_specification ] ...
[ REQUIRE | NONE | ssl_option [ AND ] ssl_option ]
[ WITH with_option... ]
其中,object_type的格式为:TABLE | FUNCTION | PROCEDURE
priv_level的格式为:* | *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_name;
user_specification的格式为:
sql
user
[
IDENTIFIED BY [ PASSWORD ] 'password'
| IDENTIFIED WITH auth_plugin [ AS 'auth_string' ] ]
]
with_option的格式为:
sql
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_QUERIESUPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
例2:

sql
create user 'tmpuser'@'localhost' identified by 'a12345';
grant select, insert on tb_group to 'tmpuser'@'localhost';
注意:题目里并没有写 localhost,如果在创建的过程中,只给出了账户中的用户名,而没指定主机名,则主机名会被默认为是"%",表示一组主机。即
create user 'tmpuser'@'%' identified by 'a12345';建议在考试中遇到创建用户的题目,建议始终写成 '用户名'@'localhost' 的形式。这样既符合安全规范,也是二级考试标准答案的写法。
例3:

sql
create user 'client'@'localhost';
grant select(cno, cname) on tb_commodity to 'client'@'localhost';
在指定数据库的某个表上授予权限
在指定数据库的某个表上授予权限的标准语法格式:GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名' IDENTIFIED BY '密码';
例4:

sql
create user 'abc'@'localhost' identified by '123';
grant select on db_exam.score to 'abc'@'localhost';
例5:

sql
grant select,update on newtest.* to 'abc'@'192.168.1.100';
如果是指定数据库的所有表,则将表名用*表示;主机名可以替换成IP地址
GRANT 权限列表 ON 数据库名.* TO '用户名'@'IP地址' IDENTIFIED BY '密码';
在某个表上的指定字段上授予权限
MySQL 的列级权限授予规范语法格式:GRANT 权限类型(列名列表) ON 表名 TO '用户名'@'主机名' [WITH GRANT OPTION];
例6:

sql
grant select(score) on tb_score to 'zhaojun'@'localhost';
授予所有数据库、所有表的权限
例7:

sql
grant create on *.* to '张民'@'localhost';
授予全部权限
例8:

sql
grant all [previleges] on xsxk.* to 'test'@'localhost';
允许权限转授
允许权限转授只需在末尾加上:with grant option即可
例9:

sql
grant select,update on db_club.tb_gs,db_club.tb_group to '胡虎'@'localhost' with grant option;
同时授权多个用户
多个用户用逗号分隔
例10:

sql
grant select,update on tb_jperson to 'zhang'@'localhost', 'tong'@'localhost';
撤销权限
当要撤销一位用户的权限,而又不希望将该用户从系统中删除时,可以使用REVOKE语句来实现,其常用的语法格式为:
sql
REVOKE pri_type [ (column_list) ] [ ,priv_type [ (column_list) ] ]...
ON[ object_type ] pri_level
FROM user[ ,user ]...
sql
REVOKE ALL PRIVILEGES,GRANT OPTION
FROM user[ ,user ]...
使用说明如下:
• REVOKE 语句和 GRANT 语句的语法格式相似,但具有相反的效果。
授权:GRANT...ON...TO
撤销:REVOKE...ON...FROM
• 第一种语法格式用于回收某此特定的权限。
• 第二种语法格式用于回收特定用户的所有权限。
• 要使用 REVOKE 语句,必须拥有 MySQL 数据库的全局 CREATE USER 权限或 UPDATE权限。
例11:

sql
revoke insert on db_booking.tb_flag from'tmpuser'@'localhost';
撤销全部权限

sql
revoke all [previleges] on db_society.tb_gs from '王勇'@'localhost';
PRIVILEGES 在 GRANT 和 REVOKE 语句中都是可选的,可以写也可以不写,两者完全等价。
备份与修复
使用SQL语句备份和恢复表数据
SELECT INTO...OUTFILE语句
在 MySQL 5.5 中,可以使用 SELECT INTO...OUTFILE 语句把表数据导出到一个文本文件中进行备份,并可使用 LOAD DATA...INFILE 语句来恢复先前备份的数据。这种方法有一点不足。 就是只能导出或导入数据的内容,而不包括表的结构,若表的结构文件损坏,则必须先设法恢复原来表的结构。
导出备份语句 SELECT INTO...OUTFILE 的语法格式为:SELECT * INTO OUTFILE 'file_name' [ CHARACTER SET charset_name ] export_options I INTO DUMPFILE 'file_name
其中,export_options 的格式为:
sql
[ FIELDS
[ TERMINATED BY 'string' ]
[ [ OPTIONALLY ] ENCLOSED BY 'char' ]
[ ESCAPED BY 'char' ]
]
[LINES TERMINATED BY 'string' ]
语法说明如下:
- 这条语句的作用是将表中 SELECT 语句选中的所有数据行写入到一个文件中,file_name 指定数据备份文件的名称。文件默认在服务器主机上创建,并且文件名不能是已经存在的,否则可能会将原文件覆盖。如果要将该文件写入到一个特定的位置,则要在文件名前加上具体的路径。在文件中,导出的数据行会以一定的形式存放。其中空值是用"\N"表示 。
- 导出语句中使用关键字 OUTFILE 时,可以在 export_options 中加入以下两条自选的子句,它们的作用是决定数据行在备份文件中存放的格式:
①FIELDS 子句:在 FIELDS 子句中有三条亚子句,分别是 TERMINATED BY、 OPTIONALLY ENCLOSED BY 和 ESCAPED BY。如果指定了 FIELDS 子句,则这三条亚子句中至少要求指定一 条。其中,TERMINATED BY 用来指定字段值之间的符号;ENCLOSED BY 子句用来指定包裹文件中字符值的符号,若加上关键字 OPTIONALLY 则表示所有的值都放在双引号之间;ESCAPED BY 子句用来指定转义字符。
②LINES 子句:在 LINES 子句中使用 TERMINATED BY指定一个数据行结束的标志。
如果FIELDS和LINES子句都不指定,则默认声明的是下面的子句:
sql
FIELDS TERMINATED BY '\t' ENCLOSED BY " ESCAPED BY '\\'
LINES TERMINATED By '\n'
- 导出语句中使用的是关健学 DUMPEIE 而非 OUTFILE时,导出的备份文件里面所有的数据行都会彼此紧挨着放置,即值和行之问没有任何标记
LOAD DATA... INFILE 语句
导入恢复语句 LOAD DATA...INFILE 的语法格式为:
sql
LOAD DATA [ LOW_PRIORITY | CONCURRENT ] [ LOCAL ] INFILE 'file_name.txt'
[ REPLACE |IGNORE ] INTO TABLE tbl_name
[FIELDS
[ TERMINATED BY `string' ]
[ [ OPTIONALLY ] ENCLOSED BY 'char']
[ ESCAPED BY 'char' ]
]
[ LINES
[ STARTING BY 'string' ]
[ TERMINATED BY 'string']
]
[ IGNORE number LINES ]
[ (col_name_or_user_var,...) ]
[SET col_name = expr,... ] ]
语法说明如下:
- LOW PRIORITY | CONCURRENT:若指定 LOW_PRIORITY,则延迟该语句的执行;若指 定 CONCURRENT,则当 LOAD DATA 正在执行的时候其他线程可以同时使用该表的数据。
- LOCAL:若指定了 LOCAL,则文件会被客户主机上的客户端读取、并被发送到服务器。文件会被给予一个完整的路径名称,以指定确切的位置。如果给定的是一个相对的路径名称,则此名称会被理解为相对于启动客户端时所在的目录。若没有指定 LOCAL,则文件必须位于服务器主机上,并且被服务器直接读取。与让服务器直接读取文件相比,使用 LOCAL 的速度会略慢些,这是由于文件的内容必须通过客户端发送到服务器上。
- file_name:待导入的数据库备份文件名。文件中保在了待载入数据库的所有数据行。输入文件可以手动创建,也可以使用其他的程序创建。导入文件时可以指定文件的绝对路径,则服务器会根据该路径搜索文件。若不指定路径,则服务器在默认数据库的数据库目录中读取。出于安全考虑,当读取位于服务器中的文本文件时,文件必须位于数据库目录中,或者是全体可读的。 注意,这里给出 的路径大 Windows 下的路径。
• REPLACE I IGNORE:如果指定 REPLACE,则当导入交件中出现与数据库中原有行相同的唯一关键字值时,输入行会替换原有行;如果指定 IGNORE,则把与原有行有相同的唯一关键字值的输入行跳过。
bl_name:指定需要导人数据的表名,该表在数据库中必须存在,表结构必须与导入文件的数据行一致。 - FIELDS 子句:此处的 FIELDS 子句和 SELECT...INTO OUTEILE 语句中类似,用于判断字段之间和数据行之间的符号。
- LINES 子句:TERMINATED BY 亚子句用来指定一行结束的标志;STARTINC BY 亚子句则指定一个前缀,导入数据行时,忽略数据行中的该前缀和前级之前的内容。 如果某行不包括该前缀,则整个数据行被跳过。
- IGNORE LINES:这个选项可以用于忽略文件的前几行。
- col_name_or_user_var:如果需要载入一张表的部分列。或者文件中字段值顺序与原表中列的顺序不同时,就必须指定一个列清单,其中可以包含列名或用户变量。
例1:

sql
LOAD DATA INFILE 'backup.txt' INTO TABLE tb_reader1;