MySql教程

Mysql基本语法(持续更新中)

本文主要是介绍Mysql基本语法(持续更新中),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Mysql


语言定义

  • db_name 数据库名称
  • tbl_name 表单名称
  • col_name 字段名称
  • xx_name 列表名称
  • view_name 视图名称
  • index_name 序列名称
  • tri_name 触发器名称
  • pro_name 存储过程名称
  • func_name 存储函数名称

数据库系统

-- 使用命令连接数据库
mysql- h 数据库IP -P 数据库端口 -u 用户名 -p 密码
mysql -h 192.168.31.1 -P 3306 -u root -p 123

-- 查看数据库版本信息
SELECT version();

数据定义语言 DDL

作用:数据定义语言主要用来定义数据库中的各类对象,包括用户、库、表、视图、索引、触发器、事件、存储过程和函数等。


数据库

创建数据库

  • 基本语法CREATE database

    -- 创建tbl_name数据库
    CREATE DATABASE tbl_name;
    

    示例:

    -- 创建school数据库
    CREATE DATABASE school;
    

查看数据库

  • 基本语法 SHOW DATABASES

    -- 查看当前所有数据库名称
    SHOW DATABASES;
    
    -- 数据库使用切换
    USE tbl_name;
    

    示例:

    -- 查看当前所有数据库名称
    SHOW DATABASES;
    
    -- 切换使用school库
    USE school;
    

删除数据库

  • 基本语法 DROP DATABASE

    -- 查看当前所有数据库名称
    DROP DATABASE [ IF EXISTS ] tbl_name;
    

    示例:

    -- 删除school库,存在报成功,不存在报错
    DROP DATABASE school
    
    -- 先判断school库是否存在:存在则删除,不存在不报错
    DROP DATABASE IF EXISTS school;
    

表单

创建表单

  • 基本语法 CREATE TABLE xxx (列名1 列类型, 列名2 列类型, ...);

    -- 创建表tbl_name,其中包含列id、name、sex
    CREATE TABLE tbl_name(
        id INT NOT NULL,
        name CHAR(10) NOT NULL,
        sex CHAR(2),
    );
    

    示例:

    DROP TABLE IF EXISTS student;
    -- 创建student表,表中包含id、name
    CREATE TABLE student (
        `id` int(11) NOT NULL,
        `name` varchar(255)
    ) ;
    

查看表单

  • 基本语法 SHOW TABLES

    -- 查看该库下的所有表
    SHOW  TABLES;
    
    -- 查看tbl_name的表结构
    DESC tbl_name;
    

    示例:

    -- 查看该库下的所有表
    SHOW  TABLES;
    
    -- 查看student的表结构
    DESC student;
    

编辑表单

  • 基本语法ALTER TABLE

    -- 编辑表名称
    ALTER TABLE tbl_name rename to tbl_name2;
    
    -- 编辑表,增加列
    ALTER TABLE tbl_name
    ADD (xx_edu CHAR(50));
    
    -- 编辑表,修改列名称
    ALTER TABLE tbl_name change xx_edu yy_edu CHAR(50);
    
    -- 编辑表,修改列类型
    ALTER TABLE tbl_name modify xx_edu CHAR(100);
    
    -- 编辑表,删除列
    ALTER TABLE tbl_name DROP xx_edu;
    

    示例:

    -- 修改表格增加一列,列项名为age
    ALTER TABLE student ADD (age CHAR(50));
    

删除表单

  • 基本语法DROP table

    DROP TABLE [ IF EXISTS ] tbl_name;
    

    示例:

    -- 删除student表,存在报成功,不存在报错
    DROP TABLE student;
    
    -- 先判断student表是否存在:存在则删除,不存在不报错
    DROP TABLE IF EXISTS student;
    
  • 基础语法TRUNCATE TABLE

    TRUNCATE TABLE tbl_name;
    

区别:

  • DROP 可选择删除的记录;TRUNCATE TABLE 删除表中的所有记录;
  • DROP 会返回删除记录数,执行速度不快;TRUNCATE TABLE 不能返回被删除的记录数,执行速度快;‘

视图

视图是对若干张基本表的引用,是一张虚表,查询语句执行的结果,不存储具体的数据(基本表发生了改变,视图也会跟着被改变)

创建视图

  • 基本语法 CREATE VIEW

    -- 创建一个视图view_name,用来查询 tbl_name 的数据:
    CREATE VIEW view_name
    as
    SELECT * FROM tbl_name; 	# 后面跟SELECT语句
    

    示例:

    --  先创建一张表
    DROP TABLE IF EXISTS student;
    CREATE TABLE student (
      `id` int(11) NOT NULL,
      `name` varchar(255)
    ) ;
    
    -- 为表创建一个视图
    CREATE VIEW  stu_view AS SELECT * FROM student;
    
  • with check option

    • 遵循视图表的规则 with check option

    • 增加条件后了之后,如果需要在视图表进行操作,需要遵循视图表的规则

    • 如果视图表遵循as SELECT * FROM user where sex='man',那么再视图表中增加的数据,sex只能为man

    CREATE VIEW view_name
    as
    SELECT * FROM user where sex='man'
    with check option;
    

查看视图

  • 基本语法 SHOW CREATE VIEW

    SHOW CREATE VIEW view_name;
    

    示例:

    -- 查看创建的视图 stu_view
    SHOW CREATE VIEW stu_view;
    

修改视图

  • 基本语法 ALTER VIEW

    ALTER VIEW view_name 	
    as
    SELECT name FROM tbl_name; 
    

    注:修改视图和创建视图语句一样,因为视图是根据真实表的结构创建的,无法修改视图中列的属性。

    示例:

    -- 修改视图获取条件
    ALTER VIEW stu_view
    as
    SELECT name FROM student where id = '1'; 
    

使用视图

  • 基本语法 select

    SELECT * FROM view_name;
    

    示例:

    -- 引用视图
    SELECT * FROM stu_view;
    

删除视图

  • 基本语法 DROP view

    DROP VIEW view_name;
    

    示例:

    -- 删除视图 stu_view
    DROP VIEW stu_view;
    

索引

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库 索引 好比是一本书前面的目录,能加快数据库的查询速度。

转载:https://www.jianshu.com/p/3a181a5ee156

创建索引

  • 创建表时,添加索引

    CREATE TABLE table_name (  
        id int(11) NOT NULL,  
        title char(255) NOT NULL ,  
        PRIMARY KEY (id),  
        INDEX index_name (title)  # 设置索引
    );  
    

    示例:

    -- 创建tbl_name 表时,添加索引
    DROP TABLE IF EXISTS student;
    CREATE TABLE student(
        id INT NOT NULL,
        name CHAR(10) NOT NULL,
        sex CHAR(2),
        INDEX sex_index(sex) 	# 设置 sex 为索引
    );
    
  • 在已存在的表上创建索引

    -- 给tbl_name 的 col_name字段,创建索引
    CREATE INDEX index_name ON tbl_name(col_name);
    
    -- 给tbl_name 的 col_name字段,创建唯一索引
    ALTER TABLE tbl_name ADD INDEX index_name(col_name);
    

    示例:

    -- 先创建一个没有索引的表
    CREATE TABLE people(
        id INT NOT NULL,
        name CHAR(10) NOT NULL,
        age CHAR(2)
    );
    
    -- 为表创建索引
    CREATE INDEX age_index ON people(age);
    

查看索引

  • 基本语法 SHOW

    -- 查看tbl_name表中的索引;
    SHOW INDEX FROM tbl_name;
    

    示例:

    -- 查看student表中的索引
    SHOW INDEX FROM student;
    

删除索引

  • 基本语法 ALTER table tbl_name DROP index

    -- 修改表的方式删除索引
    ALTER TABLE tbl_name DROP INDEX index_name;
    
    -- 删除tbl_name表上的index_name索引
    DROP INDEX index_name on tbl_name;
    

    示例:

    -- 修改表的方式删除索引
    ALTER TABLE student DROP INDEX sex_index;
    
    -- 删除tbl_name表上的index_name索引
    DROP INDEX age_index on people;
    

序列

MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。

https://www.cnblogs.com/csj2018/p/9966144.html

创建序列

  • 创建tbl_name 表时,添加序列: AUTO_INCREMENT

    CREATE TABLE tbl_name(
        id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id);
        name CHAR(10) NOT NULL,
        sex CHAR(2),
        PRIMARY KEY (id) 
    );
    

    示例:

    -- 创建表时,添加序列
    DROP TABLE IF EXISTS student ;
    CREATE TABLE `student`(
    	`id` int UNSIGNED not null AUTO_INCREMENT, PRIMARY KEY (id),
    	`name` varchar(20) not null,
    	`age` date not null
    );
    
  • 创建序列时,设置序列的开始值

    -- 设置开始值为100
    CREATE TABLE tbl_name(
        id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id),
        name CHAR(10) NOT NULL,
        sex CHAR(2),
    ) AUTO_INCREMENT=100;
    

查看序列

  • 查看表结构就是查看序列

    -- 查看表结构中的 Extra 字段有AUTO_INCREMENT字段,说明该列就是设置了序列
    DESC tbl_name;
    

    示例:

    DESC student;
    

image

编辑序列

  • 重置序列

    -- 先删除tbl_name表中得id列
    ALTER TABLE tbl_name DROP id;
    
    -- 添加 tbl_name新增id字段,并设置为自增长
    ALTER TABLE tbl_name ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST;
    

    示例:

    -- 存在一份没有设置序列的表
    DROP TABLE IF EXISTS student ;
    CREATE TABLE `student`(
    	`id` int UNSIGNED not null,
    	`name` varchar(20) not null,
    	`age` date not null
    );
    
    
    -- 先删除tbl_name表中得id列
    ALTER TABLE student DROP id;
    
    -- 再表单设置序列
    ALTER TABLE student ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST;
    

删除序列

  • 基本语法DROP

    -- 删除序列其实就是删除表中的列,或者将表删除
    DROP tbl_name;
    

    示例:

    DROP TABLE student;
    

触发器

触发器是一种对象,它能根据对表的操作时间,触发一些动作,这些动作可以是insert、update、delete等修改操作。

https://www.cnblogs.com/phpper/p/7587031.html

创建触发器

  • 基本语法CREATE TRIGGER tri_name

    -- 每次在tbl_name表中插入一行数据,将用户变量str的值设置为 abc
    CREATE TRIGGER tri_name 		# 创建触发器的名称
    after  							# 触发时间
    INSERT on tbl_name 				# 触发事件
    for each row set @str="abc";	# 触发的动作
    

    示例:

    -- 现在有表如下:
    # 用户 users 表
    DROP TABLE IF EXISTS users;
    CREATE TABLE `users` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
      `add_time` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `name` (`name`(250)) USING BTREE
    ) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1;
    
    # 日志 logs 表:
    DROP TABLE IF EXISTS logs;
    CREATE TABLE `logs` (
      `Id` int(11) NOT NULL AUTO_INCREMENT,
      `log` varchar(255) DEFAULT NULL COMMENT '日志说明',
      PRIMARY KEY (`Id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志表';
    
    
    # 创建触发器:
    -- 需求是:当在users中插入一条数据,就会在logs中生成一条日志信息。
    DELIMITER $
    CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
    BEGIN
    DECLARE s1 VARCHAR(40)character set utf8;
    DECLARE s2 VARCHAR(20) character set utf8;	#后面发现中文字符编码出现乱码,这里设置字符集
    SET s2 = " is CREATED";
    SET s1 = CONCAT(NEW.name,s2);     			#函数CONCAT可以将字符串连接
    INSERT INTO logs(log) values(s1);
    END $
    DELIMITER ;
    

查看触发器

  • 基本语法

    SHOW TRIGGERS;
    

触发-触发器

示例:

-- 创建好了触发器,继续在users中插入数据并查看数据
INSERT INTO users(name,add_time) VALUE('周伯通','1634523798');

-- 在来看下logs表,日志会自动记录到logs表中
SELECT * FROM logs;

删除触发器

  • 基本语法 DROP

    DROP TRIGGER tri_name;
    

    示例:

    DROP TRIGGER user_log;
    

存储过程

存储过程就是具有名字的一段代码,用来完成一个特定的功能。

https://blog.csdn.net/qq_33157666/article/details/87877246

创建存储过程

  • 基本语法 CREATE procedure pro_name()

    -- 创建一个存储过程,其功能是查询tbl_name表的数据
    CREATE procedure pro_name()
    SELECT * FROM tbl_name;
    

    示例:

    -- 创建一个表
    DROP TABLE IF EXISTS student;
    CREATE TABLE student (
      `id` int(11) NOT NULL,
      `name` varchar(255),
      `age` int(3)
    ) ;
    
    -- 往表单中插入数据
    INSERT INTO student(id,name,age) VALUE(1,'张三','35'),(2,'李四','26');	
    
    -- 创建存储过程
    CREATE PROCEDURE proc()
    SELECT * FROM student;
    

    执行 CREATE PROCEDURECREATE FUNCTION 语句需要 CREATE ROUTINE 权限。

调用存储过程

  • 基本语法 call

    CALL pro_name();
    

    示例:

    CALL proc();
    

删除存储过程

  • 删除存储过程和删除表一样

    DROP PROCEDURE pro_name;
    

    示例:

    DROP PROCEDURE proc;
    

存储函数

函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能写成一个函数。

https://blog.csdn.net/pan_junbiao/article/details/86307126

https://blog.csdn.net/u013103102/article/details/104119669

创建存储函数

  • 基本语法 CREATE FUNCTION func_user

    -- 创建存储函数
    CREATE FUNCTION func_name ([param_name type[,...]])
    RETURNS type
    [characteristic ...] 
    BEGIN
    	routine_body
    END;
    

    示例:

    -- 先创建tb_user(用户信息表),并添加数据。
    # 创建用户信息表
    DROP TABLE IF EXISTS student;
    CREATE TABLE student(
    	id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',
    	name VARCHAR(50) NOT NULL COMMENT '用户姓名'
    ) COMMENT = '用户信息表';
     
    -- 添加数据
    INSERT INTO student(name) VALUES('pan_junbiao的博客');
    INSERT INTO student(name) VALUES('KevinPan');
    INSERT INTO student(name) VALUES('pan_junbiao');
    
    -- 创建存储函数
    DELIMITER $$
    CREATE FUNCTION fn_search_name(uid INT)
    RETURNS VARCHAR(50)
    DETERMINISTIC
    BEGIN
    DECLARE NAME VARCHAR(50);
    SELECT name INTO NAME FROM student WHERE id = uid;
    IF NAME IS NULL THEN RETURN(SELECT '查无此人');
    ELSE IF NAME='minton' THEN RETURN(SELECT '哇!是minton大佬');
    ELSE RETURN(SELECT NAME);
    END IF;
    END IF;
    END $$
    

调用存储函数

  • 基本语法 select

    SELECT func_name()
    

    示例:

    SELECT fn_search_name(1);
    

删除存储函数

  • 基本语法 DROP FUNCTION;

    DROP FUNCTION func_name;
    

    示例:

    DROP FUNCTION fn_search_name;
    

用户

创建用户

  • 基本语法 CREATE user

    CREATE user 'user_name'@'host_name' 
    [IDENTIFIED by 'password'];
    
    # user_name:用户名
    # host_name:主机名,不填写默认所有主机
    # password:口令,密码
    

    示例:

    # 创建用户名为mike,用户密码为123,主机名为localhost;
    DROP USER IF EXISTS 'mike'@'%';
    CREATE USER 'mike'@'%' identified by '123';
    

修改用户

  • 修改用户账号,基本语法 rename user

    RENAME USER 'old_user'@'host_name' to 'new_user'@'host_name';
    

    示例:

    RENAME USER 'mike'@'localhost' to 'jake'@'%';
    
  • 修改用户密码,基本语法 set password

    # for user指定修改密码的用户
    SET PASSWORD [FOR 'user_name'@'host_name'] = PASSWORD('password');
    

    示例:

    SET PASSWORD FOR 'jake'@'%' = PASSWORD("abc");
    

删除用户

  • 基本语法 DROP

    DROP USER  [ IF EXISTS ]  'user_name1'@'host_name', 'user_name2'@'host_name';
    

    示例:

    DROP USER 'jake'@'%';
    

数据操纵语言 DML

作用:用于添加、删除、更新和查询数据库记录,并检查数据完整性,主要包括的操作有:INSERT,UPDATE,DELETE。

增加数据

  • 基本语法 insert into

    # 向tbl_name 的表中插入多条数据
    INSERT INTO db_name.tbl_name(id,name,age)
    value(1,'张三','35'),(2,'李四','26');	
    

    示例:

    -- 创建一个表单
    DROP TABLE IF EXISTS student;
    CREATE TABLE student (
      `id` int(11) NOT NULL,
      `name` varchar(255),
      `age` int(3)
    ) ;
    
    -- 往表单中插入数据
    INSERT INTO student(id,name,age) VALUE(1,'张三','35'),(2,'李四','26');	
    
  • 插入部分列值的数据

    # insert...set		
    INSERT INTO db_name.tbl_name 
    SET xx_name='mike',xx_age=1;
    
  • 插入子查询数据

    # insert...SELECT
    INSERT INTO db_name.tbl_name
    SELECT * FROM id ='1';
    
  • 插入新数据的列为自增长,使用 0 表示

    INSERT INTO db_name.tbl_name
    VALUE(3,'王五','11');
    
  • 插入新数据要为默认值时,可以使用 default 表示

    INSERT INTO db_name.tbl_name
    VALUE(id,'name',default);
    

修改数据

  • 基本语法 update

    # 修改tbl_name表中,id为1的数据,修改名称为micke
    UPDATE db_name.tbl_name
    SET name='mike'
    WHERE id=1;
    

    示例:

    UPDATE student SET name='王五' WHERE id='1';
    

删除数据

  • 基本语法delete FROM

    DELETE FROM db_name WHERE xx=xx;
    

    示例:

    # 删除tbl_name表中,id 为 1 的数据
    DELETE FROM student WHERE id='1';
    

数据查询语言 DQL

作用:主要用来查看表中的数据,也是平时使用最多的操作,主要命令为:SELECT

单表查询

  • 基本语法 SELECT * FROM tbl_name where id='1';

    SELECT col_name			# col_name 输出字段
    FROM tbl_name			# 查询表名
    [where xx_name='mike']	# 数据条件选择
    [group by {}]
    [having]
    [order by {col_name} ASC|DESC]	 # 对结果进行排序
    [limit {}]				# 限制行数
    

    示例:

    -- 创建一个表,并添加数据
    DROP TABLE IF EXISTS student;
    CREATE TABLE student (
      `id` int(11) NOT NULL,
      `name` varchar(255),
      `age` int(5),
      `sex` varchar(10)
    );
    
    -- 往表单中插入数据
    INSERT INTO student(id,name,age,sex) VALUE(1,'张三','35','boy'),(2,'李四','26','girl'),(3,'王五','13','boy');	
    
    -- 使用selct命令所有表的所有数据信息
    SELECT * FROM student;
    
子句 说明 是否必须使用
select 要返回的列或表达式
from 从中检索数据的表 仅从表选择数据时使用
where 行级过滤
group by 分组说明 仅在按组计算聚合时使用
having 组级过滤
order by 输出排序顺序
limit 要检索的行数

重命名 - as

  • 替换列的名称 as

    # as后就是更改后的列名
    SELECT col_name AS '名称' FROM tbl_name;	
    

    示例:

    SELECT name AS '姓名' FROM student;
    

image

  • 替换查询结果中的数据 case

    SELECT col_name, case where col_sex='man' then '男'	# 将数据为man的输出为"男"
    else '女'	# 除man以外的数据,输出为"女"
    end as 性别	# 列表的名称
    FROM tbl_name;
    
  • 计算列值

    SELECT  xx_id+100,xx_name,xx_sex
    FROM tbl_name;
    # 输出后xx_id的数据增加100
    # 例:xx_id=1,输出结果为101
    
  • 聚合函数

函数名 说明
count 求组中,返回int类型整数
max 最大值
min 最小值
sum 求和
avg 求平均值
std 或 srddev 返回给定表达式中所有值得标准值
variance 方差
group_concat 返回由属于一组的列值连接组合而成的结果
bit_and 逻辑与
bit_or 逻辑或
bit_xor 逻辑异或

where

  • 比较运算符

    比较运算符 说明
    = 等于
    <> 或 != 不等于
    < 小于
    <= 小于等于
    > 大于
    >= 大于等于
    <=> 不会返回unknow
  • 判定范围

    判定符 说明 示例
    between 在....之间 where id between 901 and 902;
    in 枚举 where id in(901,902);
    is null 空值 where id is null;

子查询

  • 子查询 in

    SELECT * FROM tbl_name1 
    WHERE tbl_name1.xx_id 
    IN(
        SELECT tbl_name2.xx_id 
        FROM tbl_name2 
        WHERE xx_name='mike'
    );
    # xx_id分别为tbl_name1,tbl_name2的主/外键
    

分组 - group by

  • 基本语法group by

    SELECT xx_id,xx_sex,count(*) as "人数"
    FROM tbl_name
    group by xx_id,xx_sex;
    
    # 输出相同xx_id和xx_sex的人数
    
  • 分组汇总 with rollup

    SELECT xx_id,xx_sex,count(*) as "人数"
    FROM tbl_name
    group by xx_id,xx_sex
    with rollup;
    
    # 输出相同xx_id和xx_sex的人数
    # with rollup输出xx_id,xx_sex,count的总数
    

介于两个值中间 - BETWEEN ... AND


搜索指定的字符 - LIKE


去重 --- DISTINCT


having

  • 过滤分组

    SELECT xx_id,xx_name
    FROM tbl_name
    group by xx_id,xx_name
    having count(*) < 3;
    
    # 输出相同xx_id和xx_sex的少于3人的数据
    

order by

  • 排序 oder by col_name;ASC,升序;DESC,降序

    SELECT * 
    FROM tbl_name
    WHERE xx_sex='man'
    order by xx_id DESC;
    
    # 输出xx_sex为man的人数,排列顺序为降序
    

Limit

  • 输出数据的行数 limit

    # 输出从第五行(4)开始,后三行(3)的数据
    # 计算机计数从0开始
    
    SELECT * 
    FROM tbl_name
    limit 4,3;
    

联表查询

交叉连接

  • cross join

    SELECT * 
    FROM tbl_name 1
    cross join tbl_name2;
    
    # 或者
    SELECT * 
    FROM tbl_name1,tbl_name2;
    

内连接

  • tbl_name1的主键和tbl_name2的外键相等的时候,需要使用内连接:inner join...on...

    # FROM 表1 inner join 表2 on 键名称|外键=主键
    SELECT *
    FROM tbl_name1
    inner join tbl_name2
    on some conditions;
    
    # some conditions 可以这样表示
    # tbl_name1.xx_name = tbl_name2.xx_name
    # 或者
    # xx_name='mike'
    

左连接

  • 以左表为基表left join

    # FROM 表1 left join 表2 on 键名称|外键=主键
    SELECT *
    FROM tbl_name1
    left join tbl_name2
    on some conditions;
    
    # 输出tbl_name1的表数据
    

右连接

  • 以右表为基表right join

    # FROM 表1 right join 表2 on 键名称
    SELECT *
    FROM tbl_name1
    right join tbl_name2
    on some conditions;
    
    # 输出tbl_name2的表数据
    

数据控制语言 DCL

作用:用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。

授予权限

  • 基本语法 grant

    GRANT priv_type [column_list]
    ON [object_type] priv_level
    TO user_specification
    [with grant option];
    
    # priv_type:指定权限名称,如SELECT、insert、delete等
    # column_list:指定权限要授予表中的那些具体列
    # object_type:指定权限授予对象和级别;可以看到哪些表
    # user_specification:用户名,用于指定被授予权限的用户user
    # with grant option:用户实现权限的转移或限制
    

    示例:

    -- 创建一个表
    DROP TABLE IF EXISTS student;
    CREATE TABLE student (
      `id` int(11) NOT NULL,
      `name` varchar(255),
      `age` int(5)
    ) ;
    
    -- 授予mike在数据库db_name的表tbl_name上,拥有列xx_id、xx_name的SELECT、update权限
    GRANT SELECT,UPDATE(id,name)
    ON student
    TO 'mike'@'localhost';
    
    -- 刷新权限
    FLUSH PRIVILEGES;
    
  • grant语句授权时,可以同时创建用户

    -- 授权给 mike 用户,关于 tbl_name 表的 SELECT 权限
    GRANT SELECT		# 授予表的SELECT权限
    ON db_name.tbl_name	# 授予的表名称
    TO 'user_name'@'host_name' identified by 'password';	# 用户名称及密码
    
    -- 刷新权限
    FLUSH PRIVILEGES;
    
  • 授予数据库所有权限

    -- 授予mike 的db_name库中所有表的所有权限
    GRANT ALL		# 所有操作权限
    ON db_name.*	# db_name的所有表
    TO 'user_name'@'host_name';
    
    -- 刷新权限
    FLUSH PRIVILEGES;
    

查看权限

  • 查看某个用户所授予的权限

    -- 查询给 'mike'@'host_name' 所授予的所有权限
    SHOW GRANTS FOR 'user_name'@'host_name';
    

    示例:

    SHOW GRANTS FOR 'mike'@'loaclhost';
    

回收权限

  • 基本语法 revoke

    REVOKE priv_type [column_list]
    ON [object_type] priv_level
    FROM user_specification;
    

    示例:

    -- 回收用户mike,在数据库db_name的tbl_name表,delete的权限
    REVOKE UPDATE
    ON student
    FROM 'mike'@'localhost';
    
    -- 刷新权限
    FLUSH PRIVILEGES;
    

备份恢复

备份数据

  • 基本语法 SELECT into ... outfile

    SELECT * into outile 'file_name' export_options;
    

    示例:

    # 导出名为backupfile.txt的备份,
    # 字段值如果是字符用双引号标注	optionally enclosed
    # 字段值之间用逗号隔开		  fields terminated
    # 每行以问号结束				lines terminated
    
    SELECT * FROM db_name.tbl_name
    into outfile 'C:/backupfile.txt'
    fields terminated by ','
    optionally enclosed by ""
    lines terminated by ? ;
    

恢复数据

  • 基本语法 load data ... infile

    load data infile 'file_name'
    into table tbl_name;
    

    示例:

    load data infile 'C:/backupfile.txt'
    into table db_name.tbl_name
    fields terminated by ','
    optionally enclosed by ""
    lines terminated by '?' ;
    

导入导出

导出

  • 导出数据库

    # 将本地mysql服务器上的bs_audit数据库导出到本地的bs_audit.bak文件中:
    use <数据库名>;
    mysqldump -uroot -p123456 --databases bs_audit > bs_audit.bak;
    
  • 导出表

    # 将本地主机上的stranger_info数据库的tb2数据表导出到本地的stranger_info.bak文件中:
    mysqldump -uroot -pAnkki_mySQL123 bs_audit stranger_info > stranger_info.bak;
    

导入

  • 导入数据库

    # 进入mysql中,使用source指令完成数据库导入,如下:
    
    # 将原有的数据库删除
    drop database bs_audit;
    # 创建全新的数据库
    create database bs_audit;
    # 进入数据库环境
    use bs_audit;
    # 导入备份文件恢复
    source /root/bs_audit.bak;
    
  • 导入表

    # 进入数据库环境
    use bs_audit;
    # 若没有此表,则需创创建;若存在,不需执行 
    create database stranger_info;
    # 导入备份文件恢复
    source /root/data/stranger_info.bak;
    
这篇关于Mysql基本语法(持续更新中)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!