MySQL实战系列2:你不可不知的数据库操作

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

作者介绍

索宁擅长Python开发、MySQL、前端等众多技术领域,曾负责众多企业安全架构解决方案 ,涉猎行业有媒体、出版社、航空运输、医疗、军队、政府、教育等。

 

       一、数据库操作      

 

1、查看数据库

 

SHOW DATABASES;

 

# 默认数据库:

  mysql - 用户权限相关数据

  test - 用于用户测试数据

  information_schema - MySQL本身架构相关数据

 

2、创建数据库

 

# utf-8 编码

CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

 

# gbk 编码

CREATE DATABASE 数据库名称 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;

 

3、使用数据库

 

USE db_name;

 

# 可以不使用分号

 

4、用户管理

 

# 创建用户

create user '用户名'@'IP地址' identified by '密码';

# 删除用户

drop user '用户名'@'IP地址';

# 修改用户

rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';;

# 修改密码

set password for '用户名'@'IP地址' = Password('新密码')

 

PS:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)

 

# 查看当前用户

select user();

# 查看所有用户

select host,user from mysql.user;

# 人性化显示所有用户

SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;

# 查看用户的所有权限

show grants for 'nick'@'%';

 

  • View Code

 

20161026103316249.jpg

20161026103327449.jpg

 

5、授权管理

 

# 查看权限

    show grants for '用户'@'IP地址'

# 授权

    grant  权限 on 数据库.表 to   '用户'@'IP地址'

# 取消权限

    revoke 权限 on 数据库.表 from '用户'@'IP地址'

 

常用权限:

 

all privileges   除grant外的所有权限

select              仅查权限

select,insert    查和插入权限

usage              无访问权限

 

对于目标数据库以及内部其他:

 

20161026103417349.jpg

 

对于用户和IP:

 

20161026103427600.jpg

 

  • 更多权限

 

20161026103452813.jpg

20161026103510206.jpg

 

  • 添加额外管理员

 

20161026103526546.jpg

 

  • 简单示例

 

20161026103538306.jpg

 

  • 创建用户一般流程

 

20161026103623578.png

 

6、授权局域网内主机远程连接数据库

 

#百分号匹配法

    grant all on *.* to 'test'@'192.168.200.%' identified by 'test123';

#子网掩码配置法

    grant all on *.* to 'test'@'192.168.200.0/255.255.255.0' identified by 'test123';

#刷新权限

    flush privileges;

#远程登陆连接

    mysql -utest -ptest123 -h 192.168.200.96

 

       二、表操作      

 

1、创建表

 

# 基本语法:

create table 表名(

    列名  类型  是否可以为空  默认值  自增  主键,

    列名  类型  是否可以为空

)ENGINE=InnoDB DEFAULT CHARSET=utf8

 

not null                # 不可以为空

default 1              # 默认值为1

auto_increment   # 自增

primary key         # 主键

constraint 外键名 foreign key (从表字段’自己‘) references 主表(主键字段)    # 外键

 

是否可空,null表示空,非字符串

not null    - 不可空

null          - 可空

 

默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值

            create table tb1(

                nid int not null defalut 2,

                num int not null

            )

 

自增,如果为某列设置自增列,插入数据时无需设置此列,默认将自增(表中只能有一个自增列)

            create table tb1(

                nid int not null auto_increment primary key,

                num int null

            )

            或

            create table tb1(

                nid int not null auto_increment,

                num int null,

                index(nid)

            )

 

注意:1、对于自增列,必须是索引(含主键)。

          2、对于自增可以设置步长和起始值

          20161026103703321.jpg

 

主键,一种特殊的唯一索引,不允许有空值,如果主键使用单个列,则它的值必须唯一,如果是多列,则其组合必须唯一。

          20161026103811670.jpg

 

外键,一个特殊的索引,只能是指定内容

         20161026103850601.jpg

 

2、删除表

drop table 表名

 

3、清空表

 

# 表还存在,表内容清空

delete from 表名

truncate table 表名

 

4、修改表

 

# 添加列:

        alter table 表名 add 列名 类型

# 删除列:

        alter table 表名 drop column 列名

# 修改列:

        alter table 表名 modify column 列名 类型;  -- 类型

        alter table 表名 change 原列名 新列名 类型; -- 列名,类型

 

# 添加主键:

        alter table 表名 add primary key(列名);

# 删除主键:

        alter table 表名 drop primary key;

        alter table 表名  modify  列名 int, drop primary key;

 

# 添加外键:

        alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);

# 删除外键:

        alter table 表名 drop foreign key 外键名称

 

# 修改默认值:

      ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;

# 删除默认值:

      ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;

# 更改表名

         rename table 原表名 to 新表名;

 

  • 增删改表的字段

 

#增加表字段,altertable法。

1>    语法: altertable 表名 add 字段 类型 其他;

2>    插入列,名为sex。

20161026103916899.jpg

3>    插入名为suo列在name后面。

20161026103932589.jpg
4>    插入名为qq列在第一。

20161026103949502.jpg

 

#更改表名字,rename法。

1>    语法: rename table 原表名 to 新表名;

2>    更改oldsuo表为oldning。

20161026104007999.jpg

#删除表

1>    语法:drop table <表名>;

2>    删除表名为oldsuo表。

20161026104022933.jpg

 

       三、表内容操作      

 

1、增

 

语法:insert into 表 (列名,列名...) values (值,值,值...)

 

# 插入单条数据

        insert into 表 (列名,列名...) values (值,值,值...)

# 插入多条数据

       insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)

# 插入另一条语句的查询结果

        insert into 表 (列名,列名...) select 列名,列名... from 表

 

2、删

 

语法:delete from 表

 

delete from 表;

delete from 表 where id=1;

 

3、改

 

语法:update 表 set name = 'nick' where id>1

 

update 表 set name = 'nick' where id>1

 

4、查

 

语法:select * from 表

 

select * from 表

select * from 表 where id > 1

select nid,name,gender as gg from 表 where id > 1

# as 做别名

 

5、条件

 

语法:select * from 表 where id > 1

 

20161026104038356.jpg

 

6、通配符

 

语法:select * from 表 where name like '_n%'

 

20161026104052491.jpg

 

7、限制

 

语法:select * from 表 limit 9,5;

 

20161026104121802.jpg

 

8、排序

 

语法:select * from 表 order by 列1 desc,列2 asc

 

20161026104141365.jpg

 

9、分组

 

语法:select num from 表 group by num

 

20161026104203668.jpg

 注:group by 必须在where之后,order by之前

 

20161026104219626.jpg

 

10、连表

 

语法:inner join . on、left join . on、right join . on

 

20161026104235963.jpg

 

11、组合

 

语法:union、union all

 

20161026104249767.jpg

 

  • 查询表数据

 

1>    命令语法:select<字段1,字段2,…>from<表名>where<表达式>

2>    查询所有

20161026104311494.jpg
3>    查询某列。不用*,查询的列列出来。

20161026104332170.jpg
4>    指定条件查询

20161026104349270.jpg

    #升序

20161026104408388.jpg

    #倒叙

20161026104428181.jpg

 

  • 表中插入数据

 

1>    插入单个数据,student为表的名称。

20161026104445163.jpg

2>    批量插入数据,student为表的名称。

20161026104501316.jpg

 

  • 表中删除数据

 

1>    删除所有数据,student为表的名称。

20161026104516984.jpg

2>    删除表中的某行或某些

20161026104530587.jpg

3>    直接清空某张表

20161026104544280.jpg

 

       四、其它命令      

 

1、查看建表语句

 

20161026104603314.jpg

 

2、查看表结构

 

desc 表名;

 

20161026104617347.jpg

 

 

3、查看是否走索引

 

explain select * from 表名 where name ='nick' \G 

 

用此命令查看是否sql语句是否还有优化的余地

 

20161026104631706.jpg

 

 

       五、数据类型      

 

学习新的东西自然离不开数据类型,MySQL中的数据类型还算简单;大致分为数字、字符串、时间。

 

那就详细看看吧:

 

20161026104652984.jpg

20161026104709594.jpg

20161026104739666.jpg

20161026104800500.jpg

20161026104816434.jpg

 

 

       六、索引      

 

1、索引概述

 

索引是表的索引目录,在查找内容之前先查目录中查找索引位置,从而快速定位查询数据;

 

可以理解成新华字典中的索引;

 

索引会保存在额外的文件中。

 

2、索引种类

 

一般的索引种类及功能:

 

  • 普通索引:仅加速查询

  • 唯一索引:加速查询 + 列值唯一(可以有null)

  • 主键索引:加速查询 + 列值唯一 + 表中只有一个(不可以有null)

  • 组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并

  • 全文索引:对文本的内容进行分词,进行搜索 

  • 索引合并:使用多个单列索引组合查询搜索

  • 覆盖索引:select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖

 

a、普通索引

 

# 创建表 + 索引

20161026104840616.jpg

# 创建索引

create index index_name on table_name(column_name)

 

# 删除索引

drop index_name on table_name;

 

# 查看索引

show index from table_name;

 

#注意:对于创建索引时如果是BLOB 和 TEXT 类型,必须指定length。

create index ix_extra on in1(extra(32));

 

b、唯一索引

 

# 创建表 + 唯一索引

20161026104853102.jpg

# 创建唯一索引

create unique index 索引名 on 表名(列名)

 

# 删除唯一索引

drop unique index 索引名 on 表名

 

c、主键索引

 

# 创建表 + 创建主键

20161026104908269.jpg

# 创建主键

alter table 表名 add primary key(列名);

 

# 删除主键

alter table 表名 drop primary key;

alter table 表名  modify  列名 int, drop primary key;

 

d、组合索引

 

组合索引是多个列组合成一个索引来查询

 

应用场景:频繁的同时使用多列来进行查询,如:where name = 'nick' and age = 18。

 

# 创建表

20161026104931631.jpg

# 创建组合索引

create index ix_name_age on mess(name,age);

 

如上创建组合索引之后,查询一定要注意:

 

  • name and email  -- >使用索引,name一定要放前面

  • name         -- >使用索引

  • email         -- >不使用索引

 

注意:同时搜索多个条件时,组合索引的性能效率好过于多个单一索引合并。

 

3、相关命令

 

# 查看索引

    show index from  表名

 

# 查看执行时间

    set profiling = 1;  # 开启profiling

    SQL...              # 执行SQL语句

    show profiles;      # 查看结果

 

4、如何正确使用索引

 

# like '%xx',避免%_写在开头

    select * from tb1 where name like '%n';

 

# 使用函数

    select * from tb1 where reverse(name) = 'nick';

 

# or

    select * from tb1 where nid = 1 or email = '630571017@qq.com';

    注:当or条件中有未建立索引的列才失效,否则会走索引

 

# 类型不一致

    如果列是字符串类型,传入条件是必须用引号引起来。

    select * from tb1 where name = 999;

 

# !=,不等于

    select * from tb1 where name != 'nick'

    注:如果是主键,则还是会走索引

        select * from tb1 where nid != 123

 

# >,大于

    select * from tb1 where name > 'nick'

    注:如果是主键或索引是整数类型,则还是会走索引

        select * from tb1 where nid > 123

        select * from tb1 where num > 123

 

# order by

    select email from tb1 order by name desc;

    当根据索引排序时候,选择的映射如果不是索引,则不走索引

    注:如果对主键排序,则还是走索引:

        select * from tb1 order by nid desc;

 

# 组合索引最左前缀

    如果组合索引为:(name,email),查询使用:

    name and email       -- 使用索引

    name                 -- 使用索引

    email                -- 不使用索引

 

5、注意事项

 

# 避免使用select *

# count(1)或count(列) 代替 count(*)

# 创建表时尽量时 char 代替 varchar

# 表的字段顺序固定长度的字段优先

# 组合索引代替多个单列索引(经常使用多个条件查询时)

# 尽量使用短索引

# 使用连接(JOIN)来代替子查询(Sub-Queries)

# 连表时注意条件类型需一致

# 索引散列值(重复少)不适合建索引,例:性别不适合

 

6、执行计划

 

explain + 查询SQL  用于显示SQL执行信息参数,根据参考信息可以进行SQL优化

 

20161026104957901.jpg

 

id

查询顺序标识

 

如:mysql> explain select * from (select nid,name from tb1 where nid < 10) as B;    

20161026105028623.png

特别的:如果使用union连接气值可能为null

 

20161026105044573.jpg

20161026105100587.jpg

20161026105118741.jpg

20161026105146146.jpg


本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2016-10-26

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
11天前
|
存储 关系型数据库 MySQL
探索MySQL:关系型数据库的基石
MySQL,作为全球最流行的开源关系型数据库管理系统(RDBMS)之一,广泛应用于各种Web应用、企业级应用和数据仓库中
|
1天前
|
JavaScript 关系型数据库 API
Nest.js 实战 (二):如何使用 Prisma 和连接 PostgreSQL 数据库
这篇文章介绍了什么是Prisma以及如何在Node.js和TypeScript后端应用中使用它。Prisma是一个开源的下一代ORM,包含PrismaClient、PrismaMigrate、PrismaStudio等部分。文章详细叙述了安装PrismaCLI和依赖包、初始化Prisma、连接数据库、定义Prisma模型、创建Prisma模块的过程,并对比了Prisma和Sequelize在Nest.js中的使用体验,认为Prisma更加便捷高效,没有繁琐的配置。
Nest.js 实战 (二):如何使用 Prisma 和连接 PostgreSQL 数据库
|
8天前
|
关系型数据库 MySQL 网络安全
Mysql 数据库主从复制
在MySQL主从复制环境中,配置了两台虚拟机:主VM拥有IP1,从VM有IP2。主VM的`my.cnf`设置server-id为1,启用二进制日志;从VM设置server-id为2,开启GTID模式。通过`find`命令查找配置文件,编辑`my.cnf`,在主服务器上创建复制用户,记录二进制日志信息,然后锁定表并备份数据。备份文件通过SCP传输到从服务器,恢复数据并配置复制源,启动复制。检查复制状态确认运行正常。最后解锁表,完成主从同步,新用户在从库中自动更新。
976 6
Mysql 数据库主从复制
|
9天前
|
缓存 运维 关系型数据库
数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
经过深入的技术剖析与性能对比,PolarDB-X DN凭借其自研的X-Paxos协议和一系列优化设计,在性能、正确性、可用性及资源开销等方面展现出对MySQL MGR的多项优势,但MGR在MySQL生态体系内也占据重要地位,但需要考虑备库宕机抖动、跨机房容灾性能波动、稳定性等各种情况,因此如果想用好MGR,必须配备专业的技术和运维团队的支持。 在面对大规模、高并发、高可用性需求时,PolarDB-X存储引擎以其独特的技术优势和优异的性能表现,相比于MGR在开箱即用的场景下,PolarDB-X基于DN的集中式(标准版)在功能和性能都做到了很好的平衡,成为了极具竞争力的数据库解决方案。
|
1天前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
14 3
|
23小时前
|
DataWorks 关系型数据库 MySQL
DataWorks操作报错合集之从OceanBase(OB)数据库调度数据到MySQL数据库时遇到连接报错,该怎么办?
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
2天前
|
SQL 关系型数据库 MySQL
MySQL 聚合函数深入讲解与实战演练
MySQL 聚合函数深入讲解与实战演练
|
8天前
|
关系型数据库 数据库 RDS
利用DTS将自建mysql5.7版本数据库迁移至对应rds报错
利用DTS将自建mysql5.7版本数据库迁移至对应rds报错
30 0
|
11天前
|
SQL 存储 数据库
MSSQL数据库性能调优实战:索引、查询与并发控制的深度剖析
在数据库管理领域,Microsoft SQL Server(MSSQL)的性能调优是保障业务高效运行的核心任务
|
14天前
|
XML Java 关系型数据库
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了