程序猿必备技能之mysql基础篇(代码片段)

波波烤鸭 波波烤鸭     2023-02-25     584

关键词:

  MySQL是我们非常常用的关系型数据库,非常重要,所以在这里给大家整理下MySQL的基础内容。

1. MySQL基础

1.1. 简介

  MySQL是关系型数据存储容器,它将数据以特定的格式存储到内存或者文件中,MySQL是目前主流的数据库之一。

1.2. 数据类型

  MySQL 中定义数据字段的类型对你数据库的优化是非常重要的。
  MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

数值类型

  MySQL 支持所有标准 SQL 数值数据类型。
  这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。
  关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
  BIT数据类型保存位字段值,并且支持 MyISAM、MEMORY、InnoDB 和 BDB表。
  作为 SQL 标准的扩展,MySQL 也支持整数类型 TINYINT、MEDIUMINT 和 BIGINT。下面的表显示了需要的每个整数类型的存储和范围

日期和时间类型

  表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
  每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
  TIMESTAMP类型有专有的自动更新特性,将在后面描述。

字符串类型

  字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
  CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
  BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
  BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
  有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

1.3. 常用操作指令

1.3.1. DCL

  DCL是Data Control Language的缩写,主要包括数据权限有关的操作指令,常见操作指令如下:

用户管理操作

-- 创建用户
-- username:用户名,ip:该用户访问ip,password:密码,newPassword:新密码
create user 'username'@'ip' identified by 'password';
-- 删除用户
drop user 'username'@'ip';
-- 修改用户
rename user 'username'@'ip'; to 'newUserName'@'ip';;
-- 修改密码
set password for 'username'@'ip' = Password('newPassword')

授权操作

-- privilege:授予的权限,dbName:数据库名,tableName:表名
-- 查看权限
-- @ip表示用户只能在当前ip下才能访问数据库,它支持通配%(表示任意) 可以表示为@%(任意ip)
show grants for 'username'@'ip'
-- 授权
-- password表示用户密码,flush privileges:表示刷新权限,
grant privilege  on dbName.tableName to   'username'@'ip' identified by "password" flush privileges-- 取消权限
revoke privilege on dbName.tableName from 'username'@'ip'

privilege 权限可选项包括如下:

all privileges  -- 除grant外的所有权限
select          -- 仅查权限
select,insert   -- 查和插入权限
usage                   -- 无访问权限
alter                   -- 使用alter table
alter routine           -- 使用alter procedure和drop procedure
create                  -- 使用create table
create routine          -- 使用create procedure
create temporary tables -- 使用create temporary tables
create user             -- 使用create user、drop user、rename user和revoke  all privileges
create view             -- 使用create view
delete                  -- 使用delete
drop                    -- 使用drop table
execute                 -- 使用call和存储过程
file                    -- 使用select into outfile 和 load data infile
grant option            -- 使用grant 和 revoke
index                   -- 使用index
insert                  -- 使用insert
lock tables             -- 使用lock table
process                 -- 使用show full processlist
select                  -- 使用select
show databases          -- 使用show databases
show view               -- 使用show view
update                  -- 使用update
reload                  -- 使用flush
shutdown                -- 使用mysqladmin shutdown(关闭MySQL)
…………

1.3.2. DDL

  DDL是Data Definition Language的缩写,主要包括create、alter、drop等常用指令,用于操作表或者数据库结构的指令,常见指令如下:

-- 创建数据库dbName
create database dbName default charset utf8 collate utf8_general_ci;
-- 使用数据库
use dbName;
drop database dbName;
-- 创建表
-- column_name列名称,column_type列类型
create table if not exists tableName (column_name column_type);
-- 删除表
drop table tableNamea;
-- 添加列
alter table tableName add column_name column_type;
-- 添加实例
ALTER TABLE `user_info` ADD COLUMN `id` VARCHAR (11) DEFAULT NULL COMMENT '平台ID' AFTER `id_number`;
-- 删除列
alter table tableName drop column column_name;
-- 修改列
alter table tableName modify column column_name column_type;
alter table tableName change old_column_name new_column_name column_type;
-- 添加主键
alter table tableName add primary key(column_name);
-- 删除主键
alter table tableName drop primary key;
alter table tableName  modify  column_name int, drop primary key;
-- 添加外键,stable从表名称,fk_name外键名称,fk外键,mtable主表名称,pk主键字段
alter table stable add constraint fk_name(如:FK_从表_主表) foreign key stable(fk) references mtable(pk);
-- 删除外键
alter table tableName drop foreign key fk_name
-- 修改默认值,default_value默认值
alter table tableName alter column_name set default default_value;
-- 删除默认值
alter table tableName alter column_name drop default;
-- 创建索引,indexName索引名称
create index indexName ON tableName(column_name(length));
-- 删除索引
drop index [indexName] ON tableName;
-- 创建唯一索引
create unique index indexName ON tableName(column_name(length));
-- 添加主键,column_list主键列表,因为主键可以是多个
alter table tableName add primary key (column_list)
-- 创建唯一索引
alter table tableName add unique (column_list)
-- 修改表结构,添加索引(普通索引)
alter table tableName add index indexName(column_list);
-- 添加全文索引
alter table tableName add fulltext indexName(column_list);
-- 删除索引
alter table tableName drop index indexName;
-- 删除主键
alter table tableName drop primary key;
-- 重置数据库表自增序列,id为主键
alter table tableName drop id;
alter table tableName add id int unsigned not null auto_increment first,add primary key (id);
-- 指定自增序列开始值
alter table tableName auto_increment = 100;

1.3.3. DML

  DML是Data Manipulation Language的缩写,也就是SQL语句,指令如下:
1).insert

-- 插入一条
insert into tableName (field1,field2,...fieldN) values (value1,value2,...valueN);
-- 插入多条
insert into tableName (field1,field2,...fieldN) values (value1,value2,...valueN),(value1,value2,...valueN),(……);
-- 全值插入
insert into tableName (value1,value2,...valueN);
-- 基于已经存在的表插入数据
insert into tableName1 (field1,field2...) select (field2,field2...) from tableName2

2)delete

-- 删除表数据, []表示可选项,condition表示条件
delete from tableName [[where condition1 [and [or]] condition2.....];
-- 清空表所有数据,保留表结构
truncate table tableName;
-- 删除表,表结构、数据全部删除,同时释放磁盘空间,也就是表彻底从当前数据库消失了
drop table tableName;

3)query

-- n数字是检索的行数,m数字是指从第m行开始,也就是查询的数据从m行开始计算
select field1, field2,...fieldN from tableName [[where condition1 [and [or]] condition2.....] [limit n][offset m];
-- 模糊查询语句语法
select field1, field2,...fieldN from tableName where field1 like condition1 [and [or]] condition2.....
-- 查询合并[all | distinct] 条件可选,默认union具有distinct去重功能
select field1, field2,...fieldN from tableName1 [where conditions]
union [ALL | distinct]
select field1, field2,...fieldN from tableName2 [where conditions];
-- 排序查询语句语法,order by 默认asc升序
select field1, field2,...fieldN from tableName1, tableName2... order by field1, [field2...] [asc [desc]]
-- 分组查询,这里需要注意,where与having的区别,where 分组前过滤,having分组后过滤,分组查询中,条件中有聚合函数必须使用having
-- where/having/function 在from后面的执行顺序:where>function>having
select column_name, function(column_name) from tableName
[where conditions]
group by column_name
[having [function_conditions|simple_conditions]];
-- 连接查询
select [distinct] field1, field2,...fieldN from left_tableName
[inner|left|right] join right_tableName on conditions [and|or conditions]
[where conditions]
[group by column_name]
[having [function_conditions|simple_conditions]]
[order by field1, [field2...] [asc [desc]]]
[limit n][offset m]

4)update

-- 更新数据,new-value新值
update tableName set field1=new-value1, field2=new-value2
[where conditions]
-- 关联更新
update left_tableName
[inner|left|right] join right_tableName on conditions
set field1=new-value1, field2=new-value2,……
[where conditions]
-- 替换某个字段中的字符
update tableName set field=replace(field, 'old-string', 'new-string')
[where conditions]

1.3.4. TCL

  TCL是Transaction Control Language的缩写,事务控制语言,指令如下:

事务

  事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行,用来管理 insert,update,delete 语句。

事务的特性

  原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
   隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

指令

-- 显示开启事务,两种开启方式是等价的
begin/start transaction;
-- 显示提交事务,两种提交方式是等价的
commit/commit work;
-- 事务回滚,回滚结束用户的事务,并撤销正在进行未提交的修改
rollback/rollback work;
-- 创建事务保存点,一个事务可以有多个保存点,保存点主要用于事务内部回滚
savepoint idenfier;
-- 删除事务保存点
release savepoint idenfier;
-- 将事务回滚到某一个保存点
rollback to identifier;
-- 查看设置事务隔离级别,隔离级别有read uncommit、read commit、repeatable read、serializable
select @@global.tx_isolation, @@session.tx_isolation;
-- 设置当前会话事务隔离级别
set session transaction isolation level REPEATABLE READ;
-- 设置全局事务隔离级别
set global transaction isolation level REPEATABLE READ;
-- 禁止自动提交
set autocommit=0
-- 开启自动提交
set autocommit=1

1.3.5. 常用show指令

-- 显示当前数据库中所有表的名称。
show tablesshow tables from database_name;
-- 显示mysql中所有数据库的名称。
show databases;
-- 显示表中列名称。
show columns from table_name from database_name;show columns from database_name.table_name;
-- 显示一个用户的权限,显示结果类似于grant 命令。
show grants for user_name;
-- 显示表的索引。
show index from table_name;
-- 显示一些系统特定资源的信息,例如,正在运行的线程数量。
show status;
-- 显示系统变量的名称和值。
show variables;
-- 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。
show [full] processlist;
-- 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间。
show table status;
-- 显示服务器所支持的不同权限。
show privileges;
-- 显示create database 语句是否能够创建指定的数据库。
show create database database_name;
-- 显示create database 语句是否能够创建指定的数据库。
show create table table_name;
-- 显示innoDB存储引擎的状态。
show innodb status;
-- 显示BDB存储引擎的日志。
show logs;
-- 显示最后一个执行的语句所产生的错误、警告和通知。
show warnings;
-- 只显示最后一个执行语句所产生的错误。
show errors;
--显示安装后的可用存储引擎和默认引擎。
show [storage] engines;
-- 查看表锁,Table_locks_waited数值高,锁表锁频次高
show status like 'table%';
-- 数值高说明,表锁比较严重
show status like 'innodb_row_lock%';

1.3.6. MYSQL常用函数

https://www.runoob.com/mysql/mysql-functions.html

1.3.7. 事务的隔离级别

  MySQL中的事务隔离级别的存在时为了防止多个事务并发执行时由于交叉执行而导致数据的不一致。
  在事务并发情况下,会出现如下几种情况:

  • 脏读
       指事务A读取到事务B未提交的数据,若要解决脏读可以在事务B执行操作时加上排他锁。

  • 不可重复读
       指事务A两次读取到的数据不一致,因为事务B更新了数据,可以通过在事务A读取数据时添加共享锁,当事务B执行更新时就需要等待事务A释放共享锁。

  • 幻读
       事务A读取数据时,是读取某个范围的数据,当事务B向数据表中插入数据后,事务A就读取到新增的数据导致幻读;这种情况需要在读取数据时锁住范围内的数据行,对于MySQL InnoDB引擎能解决幻读,或者串行话的隔离级别。

1.4. 主从复制

  通过服务器配置多个库来实现数据同步,实现主从复制来达到负载均衡、高可用、高扩展行,实现数据分布式读取等。
原理

  • 主库变更的数据以二进制的形式输出保存到磁盘上;
  • 从库读取主库中的二进制文件,将二进制文件复制到中继日志中;
  • 从库从中继日志中读取,并执行备份,复制方式异步串行化的。


配置步骤:

  • 配置主库my.ini文件;
[mysqld]
# 主从复制配置
#设置server-id,保证主从唯一
server-id=1 
#开启二进制日志
log-bin=logPath
# 主库可以读写
read-only=0
# 设置不要复制的数据库
binlog-ignore-db=mysql
# 可设置定复制的数据库
# binlog-do-db=mysql

  • 配置从库my.ini文件
[mysqld]
# 主从复制配置
# 设置server-id,保证主从唯一
server-id=2
# 开启二进制日志
log-bin=logPath
  • 分别重启主从库服务器;
  • 创建主库复制用户权限并从库复制权限;
# 创建用户rickslave为用户名,可自行替换  localhost为从库ip IDENTIFIED BY '密码'
create user 'rickslave'@'localhost' IDENTIFIED BY 'rickslave';
# 授权
grant replication slave on *.* to 'rickslave' @'localhost';
# 查看主库的状态,记住file和position的值,mysqlbin.000006,67需要在从库进行热备份配置。
show master status
# 处理的线程
show processlist
# 刷新权限
flush privileges;

  • 配置从库复制功能;
# 从库复制功能主库配置, master_host为主库地址,master_user为从库用户,master_password为密码,master_log_file和master_log_pos为show master status 查询出对应的值
change master to master_host = 'localhost',
master_user = 'rickslave', master_password = 'rickslave',
master_log_file = 'mysqlbin.000006', master_log_pos =2031

# 启动从服务器复制功能
start slave
# 停用从库服务器复制功能
stop slave
显示从库状态,当Slave_IO_Running和Slave_SQL_Running为Yes时说明功能正常
show slave status
  • 最后执行数据更新,操作验证主从数据变化。

详见官网:https://dev.mysql.com/doc/refman/5.7/en/replication-configuration.html

程序员必备技能之springboot的自动装配原理,很详细,建议收藏!!!(代码片段)

  SpringBoot应该是每个Java程序猿都会使用的基础框架了,对于SpringBoot的核心内容自动装配原理的掌握就显得非常重要了。自动装配原理分析1理论介绍  SpringBoot通过自动装配实现了第三方框架系统对象的注入。这种实现... 查看详情

程序员必备技能之springboot的自动装配原理,很详细,建议收藏!!!(代码片段)

  SpringBoot应该是每个Java程序猿都会使用的基础框架了,对于SpringBoot的核心内容自动装配原理的掌握就显得非常重要了。自动装配原理分析1理论介绍  SpringBoot通过自动装配实现了第三方框架系统对象的注入。这种实现... 查看详情

mysql基础篇之分组查询(代码片段)

MySQL基础篇之分组查询简单分组函数的使用:#简单分组函数的使用selectmax(salary)fromemployees;selectmin(salary)fromemployees;selectavg(salary)fromemployees;selectcount(salary)fromemployees;selectsum(salary)fromemployees;也可以这样写 查看详情

vue入门基础教程之经验总结篇(小白入门必备)|建议收藏(代码片段)

目录一、vue组件的三个API:prop、event、slot二、Vue生命周期中的钩子函数三、自定义指令四、mixins基础概况五、修饰符一、vue组件的三个API:prop、event、slotprop定义了这个组件有哪些可配置的属性,组件的核心功能也都... 查看详情

spring+springmvc+mybatis(开发必备技能)01基础idea环境配置(代码片段)

Spring+SpringMVC+Mybatis(开发必备技能)01、基础idea环境配置环境:数据库:MySQL开发工具:IntelliJIDEA2020.1.3x64框架:SSM(Spring+SpringMVC+Mybatis)目录1、创建idea的 查看详情

云原生时代必须具备的核心技能之docker高级篇(docker实战之springboot项目部署)(代码片段)

  上篇文章介绍了如何搭建MySQL的高可以集群,那么本文就继续在这个基础上我们实现一个具体的SpringBoot项目部署。话不多说,直接开干!!!SpringBoot项目部署  咱们一个实际的项目部署情况应该是这样的。  接下来... 查看详情

mysql基础篇之基础查询条件查询模糊查询排序查询(代码片段)

MySQL基础篇之基础查询、条件查询、模糊查询、排序查询首先使用如下SQL语句创建数据库,并建立四张表,每个表中插入相应的数据。四张表的结构如下:SQL语句如下:USE`myemployees`;/*Tablestructurefortable`depar... 查看详情

技能篇:开发必备linux命令大全(代码片段)

我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须。接下来将一一详细介绍一些常用的linux的命令文件操作远程登录与操作磁盘挂载进程管理启动和结束系统性能参数查看网络数据抓取shell脚本命令jvm常... 查看详情

mysql基础篇之索引下--05(代码片段)

Mysql基础篇之索引下--05前言覆盖索引最左前缀原则索引下推小結前言在上一篇文章中,我和你介绍了InnoDB索引的数据结构模型,今天我们再继续聊聊跟MySQL索引有关的概念在开始这篇文章之前,我们先来看一下这个问... 查看详情

mysql基础知识之必会技能mha(高可用)+故障切换(代码片段)

一、MHA简介MHA(MasterHighAvailability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的... 查看详情

mysql基础篇之索引上--04(代码片段)

Mysql基础篇之索引上--04引言索引的常见模型InnoDB的索引模型索引维护小结补充引言提到数据库索引,我想你并不陌生,在日常工作中会经常接触到。比如某一个SQL查询比较慢,分析完原因之后,你可能就会说“给... 查看详情

mysql基础篇之常用基本命令(代码片段)

MySQL基础篇之常用基本命令DB:database,数据库,存储数据的仓库,保存一系列有组织的数据。DBMS:数据库管理系统,又称为数据库软件,用于管理数据库中的数据。SQL:结构化查询语言,用来和DBMS进行通... 查看详情

技能篇:开发必备linux命令大全-稳赚不亏(代码片段)

我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须。接下来将一一详细介绍一些常用的linux的命令文件操作远程登录与操作磁盘挂载进程管理启动和结束系统性能参数查看网络数据抓取shell脚本命令jvm常... 查看详情

mysql基础篇之全局锁和表锁--06(代码片段)

Mysql基础篇之全局锁和表锁--06前言全局锁表级锁小结前言今天我要跟你聊聊MySQL的锁。数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁... 查看详情

微信公众平台小程序开发大牛必备技能

   近期在热议微信公众平台小程序,很多程序猿GG们在说不就是网页版的软件么~~~真是“材”大气粗。然而重点来了~~~程序猿GG们真的会开发么?不要随意吹牛好不好?      接下来,我给程序猿GG... 查看详情

mysql原理篇之事务--08(代码片段)

...点小结引言上一篇文章。本文为事务原理篇,如果对事务基础概念还有不清楚的,建议看一下事务基础篇,假设我们有如下两条sql语句://大忽悠转账给小朋友10元//大忽悠账号扣除10元UPDATEaccountSETbalance=balance-10WHEREid 查看详情

云原生时代必须具备的核心技能之docker高级篇(docker实战之mysql高可用集群搭建)(代码片段)

  本文来给大家介绍下MySQL在Docker中的集群搭建。MySQL高可用集群搭建  MySQL集群搭建在实际项目中还是非常必须的,我们通过PXC【PerconaXtraDBCluster】来实现强一致性数据库集群搭建。1.MySQL集群搭建1>拉去镜像dockerpullperc... 查看详情

应急响应第一篇之基础篇(代码片段)

...个方面三、应急响应的基本流程四、应急响应的原则0x02技能和工具的简介一、常用工具-webshell工具--Processhacker工具-火绒剑工具-LastActivityview工具---Autoruns工具---evtxLogparser工具---everything免责声明0x01基本流程和基本原则一、什么是... 查看详情