MySQL的基本结构

一、启动/停止服务

1、启动 mysql 服务:net start mysql
2、停止 mysql 服务:net stop mysql

二、连接/退出 mysql

1、连接:mysql -h 主机地址 -u 用户名 -p 用户密码
2、退出:exit

三、库操作

1、 创建数据库:create database <数据库名>
2、 显示所有的数据库:show databases(注意:最后有个 s)
3、 删除数据库:drop database <数据库名>
4、 使用数据库:use <数据库名>
5、 查看当前使用的数据库:select database();
6、 当前数据库包含的表信息:show tables; (注意:最后有个 s)

四、创建表

1、创建表:

命令:create table <表名> ( <字段名> <类型> [,..<字段名 n> <类型 n>]); 
例:create table MyClass
(id int(4) not null primary key auto_increment, 
name char(20) not null, 
sex int(4) not null default ’′, 
degree double(16,2)); 

2、删除表

命令:drop table [if exists] 表名

3、获取表结构

命令:desc 表名,或者 show columns from 表名
例:describe MyClass; 
desc MyClass; 
show columns from MyClass; 

4、查看指定表的创建语句

命令:show create table 表名

5、修改表

命令:alter table 语句
• 添加字段
alter table 表名 add 字段名 数据类型 [null | not null] [first | after 字段名]; 
• 修改字段名称
alter table 表名 change column 旧字段名 新字段名 数据类型 [null | not null];
• 修改字段数据类型
alter table 表名 modify 字段名 数据类型 [null | not null];
• 删除字段
alter table 表名 drop 字段名;
• 修改表名
alter table 旧表名 rename as 新表名;
或者 rename table 旧表名 to 新表名;

6、复制表

create table 新表名 like 旧表名;

五、数据更新

1、插入记录

命令:insert into <表名> [( <字段名>[,..<字段名 n > ])] values ()[, ( 值 n )]
例:insert into MyClass values(1,’Tom’,96.45),(2,’Joan’,82.99), (2,’Wang’, 96.59);

2、替换记录

命令:replace into <表名> [( <字段名>[,..<字段名 n > ])] values ()[, ( 值 n )]

3、更新记录

命令:update 表名 set 字段=新值,where 条件
例:update MyClass set name='Mary', degree =90 where id=1;

4、删除记录

命令:delete from 表名 where 表达式
例:delete from MyClass where id=1;

六、数据完整性

1、约束(主键 primary key,唯一性 unique,非空 not null)
2、自增 auto_increment
3、外键 foreign key
4、默认值 default
5check 约束
6、备注 comment

七、单表查询

1、select 基本语法格式

SELECT [ALL | DISTINCT] select_expr [, select_expr ...] 
[FROM table_references]
[WHERE where_condition] 
[GROUP BY {col_name | expr }]
[HAVING where_condition]
[ORDER BY {col_name | expr} [ASC | DESC]
[LIMIT {
    [offset,] row_count}]

2、查询所有字段

select * from <表名>
3、查询指定字段
select [( <字段名>[,..<字段名 n > ])] from <表名>

4、查询筛选条件

• 比较运算符(=>, >=, <>, !=, <, <=)
• IN(condition1,condition2,……,conditionN)BETWEEN 初始值 AND 终止值
• LIKE ‘通配符字符串’
“%”:可以匹配任意长度的字符,包含空字符。
“_”:可以匹配任意单个字符。
• IS [NOT] NULLREGEXP ‘正则表达式字符串’
• 多条件查询 (AND, OR, NOT

5、结果集特定格式

select_expr [AS] 字段别名
DISTINCT 消除结果集中的重复行
ORDER BY {col_name | expr} [ASC | DESC] 结果集排序
LIMIT {
    [offset,] row_count}

八、多表查询

1、表的别名

表名 [AS] 表的别名

2、内连接

SELECT 列名[,...n] FROM1 [INNER] JOIN2 ON 连接条件

3、外连接

SELECT 列名[,...n] FROM1 
{
    LEFT|RIGHT} OUTER JOIN2 ON 连接条件
• 左外连接 LEFT OUTER JOIN:返回左表中所有记录和右表符合连接条件的记录。
• 右外连接 RIGHT OUTER JOIN:返回右表中所有记录和左表符合连接条件的记录.

4、交叉连接

SELECT 列名[,...n] FROM1 CROSS JOIN2
--结果集的记录数是两个数据表的记录数乘积

5、合并查询结果

SELECT 列名[,...n] FROM1 
UNION [ALL]
SELECT 列名[,...n] FROM2

6、子查询

• 子查询的返回值为单条记录(ANY|ALL 可以是单列多值)的嵌套查询
SELECT * FROM 表名
WHERE 字段名 = | <>| > | < | >= | <= [ ANY | ALL ] (子查询)
• 子查询的返回值为多条记录的嵌套查询
SELECT * FROM 表名
WHERE 字段名 IN | NOT IN (子查询)
• 子查询不返回查询的记录,而是返回一个逻辑值
SELECT * FROM 表名
WHERE exists | not exists (子查询)
子查询除了可以用在 SELECT 语句中,还可以用在 INSERTUPDATEDELETE 语句中

九、分组汇总

1、统计函数

统计函数主要用在 GROUP BY 字句、HAVING 字句中,用来对查询结果进行分组统计。

2、GROUP BY

GROUP BY 子句将查询结果按照某个字段(或多个字段)进行分组(字段值相同的记录作为
一个分组),通常与统计函数一起使用。常用的语法格式:
SELECT 字段名, 统计函数
FROM 表名
GROUP BY 字段名

3、HAVING

HAVING 子句用于设置分组或聚合函数的过滤筛选条件,通常与 GROUP BY 子句一起使用。
常用的语法格式:
SELECT 字段名, 统计函数
FROM 表名
GROUP BY 字段名
HAVING 分组筛选条件
HAVINGWHERE 的区别:
• WHERE:约束来自数据库的数据,是在结果返回之前起作用,不能使用统计函数。
• HAVING:是在查询返回结果集以后,对查询结果进行的过滤操作,在 having 中可
以使用统计函数。

十、索引

1、索引

索引是一种与数据表相关的类似于目录的一种数据结构,使用索引可以提高查询的效率。
索引的分类:
• 普通索引( INDEX | KEY )
• 唯一性索引( UNIQUE [INDEX] )
• 主键索引( PRIMARY KEY )
• 单列索引和多列索引
• 全文索引( FULLTEXT [INDEX] )
• 空间索引( SPATIAL [INDEX]

2、创建索引

• 在 CREATE TABLE 语句中创建索引
• 使用 CREATE INDEX 语句创建索引
CREATE [UNIQUE] | [FULLTEXT] | [SPATIAL] INDEX <索引名>
ON <表名> (<列名 1> [ASC|DESC] [, ……n]);
• 在 ALTER TABLE 语句中创建索引
ALTER TABLE <表名>
ADD [UNIQUE] | [FULLTEXT] | [SPATIAL] INDEX <索引名> (<列名 1> [ASC|DESC] 
[, ……n]);

3、删除索引

ALTER TABLE <表名>DROP INDEX <索引名>;DROP INDEX <索引名> ON <表名>;

十一、视图

1、视图

数据库中的视图是一个虚拟表,是从一个或多个数据表(基本表)或视图导出的虚拟表或查询
表。
➢ 视图其实只储存了它的定义(select 语句),而没有储存视图对应的数据,这些数据仍
存放在原来的数据表(基本表),在视图中看到的数据其实是基本表中的数据。
➢ 当对视图的数据进行操作时,系统是根据视图的定义去操作与视图相关联的基本表
中的数据的。

2、创建视图

CREATE 
[ALGORITHM = {UNDEFIEND | MERGE | TEMPTABLE}]
VIEW <视图名>[(<字段名>[, ……n])]
AS <SELECT 语句>
[WITH [CASCADED | LOCAL] CHECK OPTION];

3、修改视图

• 使用 CREATE OR REPLACE VIEW 语句修改视图
CREATE OR REPLACE
[ALGORITHM = {UNDEFIEND | MERGE | TEMPTABLE}]
VIEW <视图名>[(<字段名>[, ……n])]
AS <SELECT 语句>
[WITH [CASCADED | LOCAL] CHECK OPTION]
• 使用 ALTER VIEW 语句对已有的视图进行修改
ALTER
[ALGORITHM = {UNDEFIEND | MERGE | TEMPTABLE}]
VIEW <视图名>[(<字段名>[, ……n])]
AS <SELECT 语句>
[WITH [CASCADED | LOCAL] CHECK OPTION]

4、删除视图

DROP VIEW [ IF EXISTS ]<视图名>

5、通过视图向表中插入、修改、删除数据

1、增加记录
命令:insert into <视图名> [( <字段名>[,..<字段名 n > ])] values ()[, ( 值 n )]
例:insert into MyClass values(1,’Tom’,96.45),(2,’Joan’,82.99), (2,’Wang’, 96.59);
2、替换记录
命令:replace into <视图名> [( <字段名>[,..<字段名 n > ])] values ()[, ( 值 n )]
3、更新记录
命令:update 视图名set 字段=新值,where 条件
例:update MyClass set name='Mary', degree =90 where id=1;
4、删除记录
命令:delete from 视图名 where 表达式
例:delete from MyClass where id=1;

十二、MySQL 编程基础

1、注释

a) 单行注释:
i. #注释内容
ii. - - 注释内容(注意有空格)
b) 多行注释:/* 注释内容 */

2、变量

a) 系统变量:在 MySQL 服务器启动时被创建并初始化为默认值。
例:SELECT @@VERSION, @@HOSTNAME, CURRENT_USER;
SELECT @@BASEDIR, @@DATADIR;
b) 用户变量:由用户创建、其作用域限制在用户连接(会话)中的变量,必须以@开头。
#使用 SET 为变量赋值
SET @myVar1 = 'MySQL';
#使用 SQL 语句代替 SET 语句为用户变量赋值,注意赋值符必须为“:=”,有冒号!
SELECT @myVar2 := COUNT(*) FROM student;
#使用 SELECT…INTO 为变量赋值
 SELECT count(*) INTO @myVar3 FROM student;
#使用 SELECT 查询变量
SELECT @myVar1, @myVar2, @myVar3;
c) 局部变量(仅在函数、存储过程、触发器中使用)
• 定义局部变量
DECLARE <变量名> [,] <数据类型> [DEFAULT 默认值]
例:DECLARE myVar INT DEFAULT 10;
• 使用 SET 为变量赋值
例:SET myVar = 30;
• 使用 SELECTINTO 为变量赋值
SELECT count(*) INTO myVar FROM student;
• 使用 SELECT 查询变量
SELECT myVar;

3、流程控制语句

IF 语句
IF <条件表达式 1> THEN <语句块 1>
[ELSEIF <条件表达式 2> THEN <语句块 2>][ELSE <语句块 n>]
END IFCASE 语句
(1)简单的 case 语句
CASE <表达式名称>
WHEN < 表达式值 1 > THEN < 结果 1 >
[WHEN < 表达式值 2 > THEN < 结果 2 >][ELSE < 结果 n > ]
END [CASE]2)搜索 CASE 语句
CASE
WHEN <条件表达式 1> THEN <结果 1>
[WHEN <条件表达式 2> THEN <结果 2>][ELSE <结果 n>]
END [CASE]WHILE 语句
[label:] WHILE <条件表达式> DO
<语句块>
END WHILE [label]LOOP 语句和 LEAVE 语句
[label:] LOOP
<语句块>
[LEAVE label]
END LOOP [label]REPEAT 语句
[label:] REPEAT
<语句块>
UNTIL <条件表达式>
END REPEAT [label]ITERATE 语句
可用于跳过本次循环中尚未执行的语句,即 ITERATE 语句后面的任何语句不再执行,重新开始新一轮的循环。
ITERATE label

4、系统函数

a) 数学函数
例:SELECT PI(), TRUNCATE(3.69,1), ROUND(3.69,1), ROUND(3.69);
b) 字符串函数
例:SELECT CHAR_LENGTH('MySQL'), CHAR_LENGTH('数据库'),
LENGTH('MySQL'), LENGTH('数据库'); #结果:5,3,5,9
SELECT CONCAT(studentid,studentname), 
CONCAT_WS('-', studentid,studentname) FROM student;
SELECT SUBSTRING('abcdef',4,2), LOCATE('de','abcdef');
c) 日期时间函数
例:SELECT CURDATE(), CURTIME(), NOW(),UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP('2018-8-28 15:14:16'), FROM_UNIXTIME(1535440456);
SELECT NOW(), YEAR(NOW()), MONTH(NOW()), DAY(NOW()), DAYNAME(NOW());
SELECT NOW(), DATEDIFF(NOW(),'2018-7-20'), ADDDATE(NOW(),15);
SELECT NOW(), DATE_FORMAT(NOW( ),'%b %D %Y %r %W');

十三、存储过程和存储函数

1、创建存储过程

CREATE PROCEDURE <存储过程名> ([<参数> [, …n]])
[characteristic …]
BEGIN
<存储过程体的语句>
END
说明:
• <参数>的格式为:[IN | OUT | INOUT ] <参数名> <类型>。
• IN 表示输入参数;OUT 表示输出参数;INOUT 表示既可以是输入也可以是输出参
数。
• characteristic 取值如下:
{
    CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
| SQL SECURITY {
    DEFINER | INVOKER}
| COMMENT 'string'

2、调用存储过程

CALL <存储过程名>([<实际参数值>[,.]])

3、修改存储过程

ALTER PROCEDURE <存储过程名> [characteristic …]
说明:
• characteristic 参数的取值及说明与创建存储过程中的一样。
• 目前,MySQL 还不提供对已存在的存储过程代码的修改,如果一定要修改代码,请先删除存储过程,再重新创建。

4、删除存储过程

DROP PROCEDURE [IF EXISTS] <存储过程名>

5、创建存储函数

CREATE FUNCTION <函数名> ([<参数> [, …n]])
RETURNS <数据类型>
[characteristic …]
BEGIN
<函数体>
END
说明:
• <参数>的格式为:<参数名> <类型>。
• characteristic 参数指定函数的特性,其取值与存储过程中的取值一样。
• 函数体中必须包含使用 RETURN 语句的返回值,该返回值的数据类型由之前的
“RETURNS <数据类型>”指定。

6、调用存储函数

SELECT <存储函数名>(<实际参数值>)

7、修改存储函数

ALTER FUNCTION <函数名> [characteristic …]
说明:
• characteristic 参数的取值及说明与创建存储过程中的一样。

8、删除存储函数

DROP FUNCTION [IF EXISTS] <存储函数名>

十四、用户权限

1、创建用户

CREATE USER [IF NOT EXISTS] 用户名[@主机名] 
[IDENTIFIED [WITH PASSWORD] BY '密码']
例:
a) #以用户名‘zhang3’,主机名‘localhost’ 创建用户,未指定加密方式和密码
create user 'zhang3'@'localhost'; 
b) 以用户名‘li4’,密码‘4444’创建用户,未指定主机名和加密方式
create user 'li4' identified by '4444';
c) 以用户名‘wang5’,主机名‘127.0.0.1’,密码‘5555’ 创建用户,并且密码加密方式不采
用默认,而是 mysql_native_password 方式。
create user 'wang5'@'127.0.0.1' identified with mysql_native_password by '5555';

2、修改用户账号

RENAME USER 旧用户名[@主机名] 
TO 新用户名[@主机名] ;
例:
#把'wang5'@'127.0.0.1'用户的用户名更改为'wang6'@'127.0.0.1' 
rename user 'wang5'@'127.0.0.1' to 'wang6'@'127.0.0.1';

3、修改用户密码

a) MySQL8.0 及以上版本:使用 ALTER USER 语句
ALTER USER 用户名[@主机名] 
[IDENTIFIED [WITH PASSWORD] BY '密码']
b) MySQL8.0 以下版本:使用 SET PASSWORD 语句
SET PASSWORD FOR 用户名@主机名 = PASSWORD('新密码');

4、删除用户

DROP USER <用户名 1@主机名> [ ,用户名 2@主机名]

5、创建角色

CREATE ROLE [IF NOT EXISTS] 角色名 1 [,];

6、删除角色

DROP ROLE [IF NOT EXISTS] 角色名 1 [,];

7、查看用户账号或角色的权限

SHOW GRANTS FOR <用户名@主机名> | <角色名>

8、为用户账号授予权限

GRANT <权限列表> [(列名列表)] ON <数据库.数据表>
TO <用户名@主机名>
[WITH GRANT OPTION]
其中,WITH GRANT OPTION 选项表示得到该权限的用户账号可以将该权限转授给其他用户账号
例:
a) #授予新用户‘test2@localhost’ 在数据库 dbstudent 中的学生表(student)上的查询权限
grant select on dbstudent.student 
to test2@localhost;
b) #授予新用户‘test3@%’ 对所有数据库的所有数据表的查询、插入、修改、删除权限,并可将权限授予其他账号
grant select, insert, update, delete on *.*
to test3
with grant option;

9、为角色授予权限

GRANT <权限列表> [(列名列表)] ON <数据库.数据表>
TO <角色名>
[WITH GRANT OPTION]
10、 为用户账号或角色授予角色
GRANT <角色列表> TO <用户名@主机名> | <角色名>
[WITH ADMIN OPTION]
其中,WITH ADMIN OPTION 选项表示得到该角色的用户账号或角色可以将该权限转授给其他用户账号或角色

11、 激活角色

SET ROLE {
DEFAULT 
| NONE 
| ALL 
| ALL EXCEPT 角色名 [,]
| 角色名 [,]
}
角色授予用户账号后,必须激活才能真正起作用。
例:激活 test3 用户账号的所有角色
SET DEFAULT role ALL to test3

12、 查看当前的激活角色

以用户 test3 登录,查询当前的激活角色
select current_role();

13、 收回权限

a) 从用户账号或角色收回权限
REVOKE <权限列表> [(列名列表)] ON <数据库.数据表>
FROM <用户名@主机名> | <角色名>
b) 从用户账号或角色收回角色
REVOKE <角色列表>
FROM <用户名@主机名> | <角色名>

十五、备份和恢复数据库

1、使用 mysqldump 命令备份数据库

a) 备份一个数据库
mysqldump -u root -p dbname > backdb.sql
注:
• dbname:数据库名
• backdb.sql 备份完成的备份脚本文件名
b) 备份一个数据库中的指定表
mysqldump -u root -p dbname tbname1, tbname2 > bakdb.sql
注:
• dbname:数据库名
• tbname1, tbname2:要备份的表名
• bakdb.sql 备份完成的备份脚本文件名
c) 备份多个数据库
mysqldump -u root -p --databases dbname1 dbname2>path\bakdbs.sql
注:
• 备份多个数据库时,需要添加选项 --databases
• dbname1 dbname2:要备份的数据库名,可多选
• bakdbs.sql:备份完成后生成的备份脚本文件名 
• 备份多个数据库时产生的备份脚本文件中包含创建数据库的语句
d) 备份服务器上的所有数据库
mysqldump -u root -p --all-databases > path\alldbs.sql
或:mysqldump -u root -p -A>path\alldbs.sql
注:
• 这个应用场景需要添加参数 --all-databases 或-A 
• path 为备份脚本文件存放的文件夹
• alldbs.sql 为备份完成的备份脚本文件名

2、mysqldump 命令的其他常用方法

a) 只导出表结构 不导出数据
mysqldump -u root -p --opt -d dbname>path\bakdb.sql
可以通过选用参数--opt –d 来实现
b) 导出 xml 格式的备份脚本
mysqldump -u root -p --xml dbname>path\bakdb.xml
可以通过选用参数--xml 选项来实现
c) 生成<Tab>键分隔的文本文件
mysqldump path -u root -p -T dbname
或
mysqldump -u root -p --tab=path dbname
导出 txt 格式的备份脚本,可以通过选用参数--tab=path 或-T path 选项来实现
注意:
• 在导出前,要用以下语句查看系统指定的导入导出文件夹:
show variables like '%secure%;
• 也可修改 my.ini 配置文件,将导入导出文件夹设置为所需要的:
Secure File Priv
secure-file-priv="D:/baktxt"

3、使用备份脚本还原数据库

a) 使用 mysql 命令还原数据库
mysql –u root –p [dbname] <bakdb.sql
说明:
• bakdb.sql 为备份脚本文件名,在文件名前面可以指定路径
• 如果备份脚本包含数据库创建语句,不可加[dbname]
• 如果备份脚本不含数据库创建语句,要加[dbname],指定还原的数据库名
b) 使用 source 语句还原数据库
mysql> source bakdb.sql;
说明:
• bakdb.sql 为备份脚本文件名,在文件名前面可以指定路径
• 首先要登录到 mysql 命令行状态,才可用 source 语句还原数据库
• 如果备份脚本不包含数据库创建语句,要先创建数据库,再用 use 语句进入
数据库,才可用 source 语句还原数据库

4、使用日志文件还原数据库

mysqlbinlog [选项] filename.number | mysql -u root –p
其中:filename.number 为用于还原的二进制日志主要[选项] 说明:
• 省略:按照二进制日志中的所有内容进行还原数据库。
• --start-position=n1 --stop-position=n2:按照二进制日志中指定的位置间隔进行
还原
• --start-datetime="dt1" --stop-datetime="dt2":按照二进制日志中指定的时间
间隔进行还原数据库,其范围为[dt1, dt2)

最后MySQL其中还有很多函数,读者自己去查一查吧,这里就不加了;

你可能感兴趣的:(SQL,server数据库,mysql,sql,数据库)