原文链接:https://blog.csdn.net/K346K346/article/details/52106044#2mysql__4
1、启动MySQL:mysql -u 用户名 -p 密码 -P 端口 -h 地址
添加用户:create user [username]@[host] identified by [password]
删除用户:DROP USER [username]@[host]
授权用户:GRANT [privileges] ON [databasename].[tablename] TO [username]@[host]
撤销授权:REVOKE [privileges] ON [databasename].[tablename] FROM [username]@[host]
修改密码:SET PASSWORD FOR [username]@[host]= PASSWORD([newpassword])
2、数据库操作:
create database 库名 创建数据库
show databases 显示所有数据库
drop database 删除数据库
use database 连接数据库
3、数据表操作:
create table [表名] ( [字段名1] [类型1] [is null] [key] [default value] [extra] [comment], ... )[engine] [charset] 创建数据表
存储引擎有:InnoDB、MyISAM、Memory、Heap
说明: 上面的建表语句命令格式,除了表名,字段名和字段类型,其它都是可选参数,可有可无,根据实际情况来定。is null表示该字段是否允许为空,不指明,默认允许为NULL;key表示该字段是否是主键,外键,唯一键还是索引;default value表示该字 段在未显示赋值时的默认值;extra表示其它的一些修饰,比如自增auto_increment;comment表示对该字段的说明注释;engine表示数据库存储引擎,MySQL支持的常用引擎有ISAM、MyISAM、Memory、InnoDB和BDB(BerkeleyDB),不显示指 明默认使用MyISAM;charset表示数据表数据存储编码格式,默认为latin1。
存储引擎是什么? 其实就是如何实现存储数据,如何为存储的数据建立索引以及如何更新,查询数据等技术实现的方法。
主键(Primary Key)与唯一键(Unique Key)的区别:
(1)主键的一个或多个列必须为NOT NULL,而唯一键可以为NULL;
(2)一个表只能有一个主键,但可以有多个唯一键。
show tables 显示所有数据表
describe 表名 查看表结构
drop table 表名/truncate 表名 删除数据表
当你不再需要该表时用 drop;当你仍要保留该表,但要删除所有记录时用 truncate;当你要删除部分记录时用 delete
alter tabel 表名 rename as 表名 修改表名
show create table 表名 查看建表语句
alter table 表名 add 字段 字段属性 添加表字段
alter table 表名 modify/change 字段 字段属性 修改表字段类型
alter table 表名 drop 字段 删除字段
alter table 表名 add column 列名 列属性 列位置 指定位置增加列
alter table 表名 drop column 列名 删除单个列
alter table 表名 drop 列名1,drop 列名2... 删除多个列
4.索引操作(添加索引是为了提高查询的速度)
alter table 表名 add index [indexname](字段名1,字段名2…) 添加索引
show index from 表名 查看索引
alter table 表名 drop index 索引名 删除索引
5.数据操作
(1)查询数据:一个完整的SELECT语句包含可选的几个子句
<SELECT clause> [<FROM clause>] [<WHERE clause>] [<GROUP BY clause>] [<HAVING clause>] [<ORDER BY clause>] [<LIMIT clause>]
(a)select语句
-
- SELECT子句是必选的,其它子句如FROM、WHERE、GROUP BY子句等是可选的。
- 一个SELECT语句中,子句的顺序是固定的。例如GROUP BY子句不会位于WHERE子句的前面。
- SELECT语句执行顺序 :
开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果
-
- 列别名:紧跟列名,也可以在列名和别名之间加入关键字
AS
- 去除重复行:在SELECT语句中使用关键字
DISTINCT
(需要放到所有列名的前面) - 常数查询:如果查询数据不包含列,则增加列
- 聚合函数:count(),max(),min(),sum(),avg()
- 列别名:紧跟列名,也可以在列名和别名之间加入关键字
(b)where子句:WHERE 列 运算符 值
运算符 | 描述 |
---|---|
= | 等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN AND | 在某个范围内 |
LIKE | 搜索某种模式 |
AND | 多个条件与 |
OR | 多个条件或 |
IN |
where in的用法:
-
-
- in 后面是子查询产生的记录集,注意,子查询结果数据列只能有一列且无需给子表添加别名
- select * from table where uname in(select uname from user)
- in 后面是数据集合
- select * from table where uname in('aaa',bbb','ccc','ddd','eee',ffff'')
- in 后面是子查询产生的记录集,注意,子查询结果数据列只能有一列且无需给子表添加别名
-
(c)group by 子句
group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤
-
- 当group by 与聚合函数配合使用时,功能为分组后计算
- 当group by 与having配合使用时,功能为分组后过滤
- 当group by 与聚合函数,同时非聚合字段同时使用时,非聚合字段的取值是第一个匹配到的字段内容,即id小的条目对应的字段内容
(d)having 子句 与 where子句的区别
HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集
HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足
-
- 作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组
- 作用的阶段不同。WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算),而 HAVING 在分组和聚集之后选取分组
- WHERE 子句不能包含聚集函数,HAVING 子句一般包含聚集函数
(e)order by子句
ORDER BY 语句用于根据指定的列对结果集进行排序,默认按照升序对记录进行排序。如果希望按照降序对记录进行排序,可以使用 DESC(descend)关键字,升序关键字是 ASC(ascend)
(f)limit子句
LIMIT 接受一个或两个数值参数。参数必须是一个整数常量
-
- 一个参数:返回指定数量的行数
- 两个参数
- limit offset,row_count 第一个参数指定返回记录行的开始偏移量,第二个参数指定返回记录行的最大数目
- limit row_count OFFSET offset 第一个参数row_count为返回记录行的最大数目,第二个参数offset为返回记录行的开始偏移量
(g) union
union 的作用是将两次或多次查询结果纵向联合起来
-
- union 的使用条件:union作用于只要两个结果集,不能直接作用于原表,结果集的列数相同就可以
- union 与 union all 的区别:union用于合并两个或多个select语句的结果集,并消去联合后表中的重复行;union all则保留重复行
- union 的排序:MySQL优化了SQL语句,不让内层排序起作用
- union与join的区别:union只能作用于select结果集,不能直接作用于数据表,join只能作用于数据表,不能直接作用于select结果集
- union 的使用条件:union作用于只要两个结果集,不能直接作用于原表,结果集的列数相同就可以
(h)join
-
- select from两个表与inner join on的区别:select from两个表的结果是两张表记录的笛卡尔乘积,inner join则只拼接含有相同字段的记录
- join将记录组合到新列中
- inner join:如果表中有至少一个匹配,则返回行(INNER JOIN 与 JOIN)
- left join:即使右表中没有匹配,也从左表返回所有的行
- right join:即使左表中没有匹配,也从右表返回所有的行
- full join:只要其中一个表中存在匹配,就返回行
- select from两个表与inner join on的区别:select from两个表的结果是两张表记录的笛卡尔乘积,inner join则只拼接含有相同字段的记录
(2)插入数据
-
- insert into
- insert into tablename(column1,column2,...) values(value1,value2,...) 指定字段,值插入,可插入多行
- insert into tablename (col0,col1,col2) select (col0,col1,col2) from othertable 使用select结果集插入
- inse into tablename set column1=value1,column2=value2... 设置字段值方式插入
- replace into
- 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据,否则直接插入
- REPLACE语句会返回一个数,来指示受影响的行的数目:为1,则一行被插入,同时没有行被删除;大于1,则在新行被插入前,有一个或多个旧行被删除
- 频繁的REPLACE INTO 会造成新纪录的主键的值迅速增大,会导致数据太大溢出
- 如果因唯一索引导致旧行被删除,新纪录与老记录的主键值不同,所以其他表中所有与本表老数据主键id建立的关联全部会被破坏。
- 插入语法同insert into
- insert into
(3)删除数据
delete from [tablename] where [condition]
(4)更新数据
UPDATE [表名称] SET [列名称]=[新值] WHERE [条件]
(5)备份还原数据
-
- 导出数据库的数据表:mysqldump -u 用户名 -p 数据库名 数据表名 > 导出的文件名
- 还原整个数据库(选择一个数据库之后,直接执行sql文件):source file_name.sql
- 导出数据库的数据表:mysqldump -u 用户名 -p 数据库名 数据表名 > 导出的文件名
6、索引
- MySQL 索引 是什么
- 索引是一个单独的、存储在 磁盘 上的 数据库结构 ,包含着对数据表里 所有记录的 引用指针
- MySQL 索引 的存储类型有哪些
- MySQL中索引的存储类型有两种,即 BTree 和 Hash
- MySQL中索引的存储类型有两种,即 BTree 和 Hash
- MySQL 索引 在哪里实现的
- 索引是在存储引擎中实现的(MySQL 的存储引擎有:InnoDB、MyISAM、Memory、Heap)
- InnoDB / MyISAM 只支持 BTree 索引
- Memory / Heap 都支持 BTree 和 Hash 索引
- 索引是在存储引擎中实现的(MySQL 的存储引擎有:InnoDB、MyISAM、Memory、Heap)
- 存储引擎是什么
- 存储引擎就是指 表的类型以及表在计算机上的存储方式
- 索引的优缺点有哪些
- 优点:
(1)提高数据的查询的效率(类似于书的目录)
(2)可以保证数据库表中每一行数据的唯一性(唯一索引)
(3)减少分组和排序的时间(使用分组和排序子句进行数据查询),被索引的列会自动进行分组和排序
-
- 缺点:
(1)占用磁盘空间
(2)降低更新表的效率(不仅要更新表中的数据,还要更新相对应的索引文件)
-
- 使用技巧
(1)较频繁的被查询的字段应该创建索引
(2)唯一性太差的字段(字段值比较单调,如性别)不适合创建索引
(3)更新比较频繁的字段不适合创建索引
(4)不会出现在WHER子句中的字段不适合创建索引
-
MYSQL索引的分类
- 普通索引和唯一索引
- 单列索引和组合索引
- 全文索引
- 空间索引
- 前缀索引
- 创建索引
- 普通索引:created INDEX index_name on table_name(column)或者alter table_name add index index_name (id)
- 唯一索引:created UNIQUE INDEX index_name on table_name(column);
- 主键索引:创建表的时候添加(primary key)
- 删除索引:
- drop index index_name on table_name;
- 修改索引
- 先删除,再增加
- 查询是否有索引
- show INDEX from table_name;
- show INDEXES from table_name;
- show keys from table_name
7、事务
数据库事务(Database Transaction) ,是指对数据库的一系列操作组成的逻辑工作单元(并非任意的对数据库的操作序列都是数据库事务)( ISAM 和 MyISAM 不支持事务)
- 四大特性
- 原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行
- 一致性:事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束
- 隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务的执行
- 持久性:已被提交的事务对数据库的修改应该永久保存在数据库中
- 查看是否自动提交事务:select @@global.autocommit/show variables like '%autocommit%'
- 关闭和开启自动提交事务:
- 关闭自动提交事务:
- 临时关闭:set autocommit = 0
- 永久关闭:修改配置文件my.cnf文件,通过vim编辑my.cnf文件,在[mysqld](服务器选项下)添加autocommit=0
- 开启自动提交事务:
- 临时开启:set autocommit = 1
- 永久开启:修改配置文件my.cnf文件,通过vim编辑my.cnf文件,在[mysqld](服务器选项下)添加autocommit=1
- 手动提交或者回滚:
- 回滚:rollback
- 手动提交:commit
- 设置事务的保存点:
- 设置折返点:savepoint [pointname]
- 回滚折返点:rollback to savepoint [pointname]
- 关闭自动提交事务:
- 事务的隔离级别:
- 为了有效保证并发读取数据的正确性,提出了事务隔离级别
- 并发操作会出现不确定情况:
- 更新丢失:两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了
- 脏读:一个事务读取到了另一个事务未提交的数据操作结果
- 不可重复读:同一事务中的多个select语句在读取数据时,第一次读取数据后,另外的事务对其做了修改,当再次读该数据时得到与前一次不同的值
- 幻读:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围内的记录时,会产生幻行
- 解决上述问题,提出事务隔离:
-
-
- RU 级别:Read Uncommitted 读未提交。允许脏读、不可重复读、幻读
- 所有事务都可以读取未提交事务的执行结果,也就是允许脏读,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读该事务增删改的数据
- RU 级别:Read Uncommitted 读未提交。允许脏读、不可重复读、幻读
-
-
-
- RC 级别:Read committed 读已提交。允许不可重复读、幻读,不允许脏读
- 允许不可重复读取,但不允许脏读取,读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行
RR 级别:Repeatable Read 可重复读。允许幻读,不允许脏读和不可重复读。InnoDB 默认级别
- 禁止不可重复读取和脏读取,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务
- S 级别:Serializable 。不允许脏读、不可重复读、幻读
- 提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行
- RC 级别:Read committed 读已提交。允许不可重复读、幻读,不允许脏读
- 查看事务隔离级别:
- 查看全局:select @@global.tx_isolation
- 查看当前会话:(1) SELECT @@session.tx_isolation; (2)SELECT @@tx_isolation; (3)show variables like 'tx_isolation'
- 更改事务的隔离级别:
-
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
-
set tx_isolation='read-committed';默认修改当前会话
-
-
8、游标
游标(Cursor)是系统为用户开设的一个数据缓冲区,存放 SQL 语句的执行结果,主要用于存储过程中用来书写过程化的 SQL
游标可以让我们可以对结果集中的每一条记录进行定位,并对指向的记录中的数据进行操作
-
- 在sql中,游标是一种临时的数据库对象
- 游标充当了指针的作用
- 我们可以通过操作游标来对数据进行操作
- MySQL中游标可以在存储过程和函数中使用
- 步骤:
- 声明游标,游标要在声明处理程序之前被声明,而且变量和条件还必须在声明游标或处理程序之前被声明
- DECLARE cursor_name CURSOR FOR select_statement
- 打开游标
- open cursor_name
- 提取数据
- FETCH cursor_name INTO var_name1,var_name2...
- 关闭游标
- CLOSE cursor_name
标签:事务,数据库,表名,索引,子句,MySQL,table From: https://www.cnblogs.com/Will-Zh/p/16952003.html