MySQL中的DDL操作,MySQL中DML操作,MySQL查询数据,SQL函数,MySQL中的索引,MySQL事务,MySQL的用户管理,MySQL分页查询

2023-11-06

目录

MySQL中的DDL操作

一、创建表与删除表

1,创建表

2,查看已创建的表。

3,删除表

二、修改表

1,修改表名

2,修改列名

3,修改列类型

4,添加新列

5,删除指定列

三、MySQL的约束

1,修改表添加主键约束

2,删除主键

3,修改表添加外键约束 

4,删除外键约束

5,修改表添加唯一性约束

6,删除唯一性约束

7,修改表添加非空约束

8,删除非空约束

9,查询表中的约束信息

10,创建表时添加约束

MySQL中DML操作

一、添加数据(INSERT)

1,选择插入:

2,完全插入:

 3,创建表时指定列的默认值(DEFAULT)

 4,修改表添加新列并指定默认值

二、插入数据时的默认值处理

 三、更新数据(UPDATE)

 四、删除数据(DELETE)

1,DELETE删除数据

2,TRUNCATE清空表

清空表时DELETE与 TRUNCATE 区别:

MySQL查询数据

SELECT基本查询

1,查询中的列选择

选择所有列

 选择指定列

2,查询中的算术运算符

3,MySQL中定义空值

4,MySQL中的别名

使用列别名

使用表别名

5,除去相同的行

6,用选择限制行

7,MySQL中的比较条件

8,其他比较条件

a) 使用BETWEEN条件

b) 使用IN条件

 c) 使用LIKE条件

 d) 使用NULL条件

9,逻辑条件

10,优先规则

11,使用 ORDER BY 排序 

12,使用别名排序

13,多列排序

SQL函数

单行函数

​编辑​编辑

1,字符函数

2,数字函数

ROUND(column|expression, n) 函数

 TRUNCATE(column|expression,n) 函数

3,日期函数

4,转换函数

隐式数据类型转换

 显示数据类型转换

 5,通用函数(用的比较多,更多是用来处理逻辑判断的)

多表查询

SQL92标准中的查询

1,等值连接

增加搜索条件

限制不明确的列名

使用表别名

多表连接

2, 非等值连接

3,自连接(自连接的表别名非常重要)

SQL99标准中的查询

SQL99中的交叉连接(CROSS JOIN)

1,创建交叉连接

SQL99中的自然连接(NATURAL JOIN)

2,创建自然连接

 SQL99中的内连接(INNER JOIN)

用ON子句指定连接条件

 用ON子句指定更多的连接条件

外连接查询(OUTER JOIN)

1,孤儿数据(Orphan Data)

2,左外连接

3,右外连接(RIGTH OUTER JOIN)

4,全外连接(FULL OUTER JOIN)

聚合函数

AVG 和 SUM 函数

MIN 和 MAX 函数

COUNT 函数

使用 DISTINCT 关键字

组函数和 Null 值

数据分组(GROUP BY)

1,GROUP BY 子句语法

2,使用 GROUP BY 子句

3,在多列上使用分组

4,约束分组结果(HAVING)

HAVING 子句

约束分组结果

HAVING子句语法

子查询(分而治之)

子查询

1,使用子查询

 2,使用子查询的原则

单行子查询

多行子查询 

1,使用ANY运算符

2,使用ALL运算符

3,子查询中的空值

MySQL中的索引

普通索引

1,查询索引

2,直接创建索引

3,修改表添加索引

4,创建表时指定索引列

5,删除索引

唯一索引(当为一个表分配了唯一性约束时,这个表就自带唯一索引了)

1,创建唯一索引

2,修改表添加唯一索引

3,创建表时指定唯一索引

主键索引

1,修改表添加主键索引

2,创建表时指定主键索引

组合索引

1,添加组合索引

2,创建表时创建组合索引

MySQL事务

事务四大特征(ACID)

事务类型

使用事务

事务的并发问题

1,脏读(读取未提交数据)

2,不可重复读(前后多次读取,数据内容不一致)

3,幻读(前后多次读取,数据总量不一致)

事务的隔离级别

1,查看MySQL默认事务隔离级别

2,设置事务隔离级别

MySQL的用户管理

用户管理

1,创建用户

2,查看用户

权限管理

1,分配权限

2,刷新权限

3,删除用户

MySQL分页查询

1,IMIT子句

2,LIMIT OFFSET子句


MySQL中的DDL操作

一、创建表与删除表

1,创建表

CREATE TABLE 表名(列名 类型,列名 类型......);

 

2,查看已创建的表。

show tables;

3,删除表

DROP TABLE 表名;

二、修改表

1,修改表名

ALTER TABLE 旧表名 RENAME 新表名;

2,修改列名

ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 类型;

3,修改列类型

ALTER TABLE 表名 MODIFY 列名 新类型;

4,添加新列

ALTER TABLE 表名 ADD COLUMN 新列名 类型;

5,删除指定列

ALTER TABLE 表名 DROP COLUMN 列名;

三、MySQL的约束

1,修改表添加主键约束

ALTER TABLE 表名 ADD PRIMARY KEY(列名)

2,删除主键

ALTER TABLE 表名 DROP PRIMARY KEY;

注意: 删除主键时,如果主键列具备自动增长能力,需要先去掉自动增长,然后再删除主键。

3,修改表添加外键约束 

ALTER TABLE 表名 ADD CONSTRAINT 约束名FOREIGN  KEY(列名) 
REFERENCES 参照的表名(参照的列名);

4,删除外键约束

ALTER TABLE 表名 DROP FOREIGN KEY 约束名;

5,修改表添加唯一性约束

ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(列名);

6,删除唯一性约束

ALTER TABLE 表名 DROP KEY 约束名;

7,修改表添加非空约束

ALTER TABLE 表名 MODIFY 列名 类型 NOT NULL;

8,删除非空约束

ALTER TABLE 表名 MODIFY 列名 类型 NULL;

9,查询表中的约束信息

SHOW KEYS FROM 表名;

10,创建表时添加约束

示例:创建 depts 表包含 department_id 该列为主键且自动增长, department_name 列不 允许重复,location_id 列不允含有空值。

create table depts(department_id int primary key auto_increment,
department_name varchar(30) unique,
location_id int not null);

MySQL中DML操作

一、添加数据(INSERT)

1,选择插入:
INSERT INTO 表名(列名 1 ,列名 2 ,列名 3.....) VALUES(值 1 ,值 2 ,值 3......);
2,完全插入:
INSERT INTO 表名 VALUES(值 1 ,值 2 ,值 3......);

注意: 如果主键是自动增长,需要使用 default 或者 null 或者 0 占 位。

3,创建表时指定列的默认值(DEFAULT)

CREATE TABLE 表名(列名 类型 default 默认值,......);

在 MySQL 中可以使用 DEFAULT 为列设定一个默认值。如果在插入 数据时并未指定该列的值,那么 MySQL 会将默认值添加到该列 中。

 4,修改表添加新列并指定默认值

ALTER TABLE 表名 ADD COLUMN 列名 类型 DEFAULT 默认值;

示例: 修改 emp3 表,添加job_id 该列默认值为 0。

二、插入数据时的默认值处理

如果在插入数据时并未指定该列的值,那么MySQL 会将默认值添加 到该列中。如果是 完全项插入需要使用 default 来占位。

 三、更新数据(UPDATE)

UPDATE 表名 SET 列名=值,列名=值 WHERE 条件;

注意: 更新语句中一定要给定更新条件,否则表中的所有数据都会被 更新。

 四、删除数据(DELETE)

1,DELETE删除数据

DELETE FROM 表名 WHERE 条件;

注意: 在DELETE语句中,如果没有给定删除条件则会删除表中的所有 数据。

2,TRUNCATE清空表

TRUNCATE TABLE 表名;
清空表时DELETE与 TRUNCATE 区别:
  • truncate 是整体删除(速度较快), delete 是逐条删除(速度较慢);
  • truncate 不写服务器 log,delete 写服务器 log,也就是 truncate 效率比 delete 高的原因;
  • truncate 是会重置自增值相当于自增列会被置为初始值,又重新从 1 开始记录,而不是接着原 来的值。
  • delete 删除以后, 自增值仍然会继续累加

MySQL查询数据

SELECT基本查询

 1,查询中的列选择

选择所有列

 选择指定列

 用 SELECT 语句来显示表的指定列,指定列名之间用逗号分隔。

2,查询中的算术运算符

 如果算术表达式包含有一个以上的运算,乘法和除法先计算。如果 在一个表达式中的运算符优先级相同,计算从左到右进行。可以用圆括号强制其中 的表达式先计算。

3,MySQL中定义空值

 0 是一个数字,而空格是一个字符。包含空值的算术表达式计算结果为空。

4,MySQL中的别名

使用列别名
SELECT 列名 AS 列别名 FROM 表名 WHERE 条件;
使用表别名
SELECT 表别名.列名  FROM 表名 as 表别名 WHERE 条件;

5,除去相同的行

SELECT DISTINCT 列名 FROM 表名;

6,用选择限制行

SELECT * | 投影列 FROM 表名 WHERE 选择条件;

7,MySQL中的比较条件

 符号 != 也能够表示 不等于条件。

8,其他比较条件

a) 使用BETWEEN条件

可以用 BETWEEN 范围条件显示基于一个值范围的行。指定的范围包含一个下限和一个上限。

包含上限和下限,是闭区间。

b) 使用IN条件

 c) 使用LIKE条件

 d) 使用NULL条件

NULL 条件,包括 IS NULL 条件和 IS NOT NULL 条件。

IS NULL 条件用于空值测试。空值的意思是难以获得的、未指定 的、未知的或者不适用的。因此,你不能用 = ,因为 null 不能等于 或不等于任何值。

9,逻辑条件

 10,优先规则

可使用圆括号改变优先规则。

11,使用 ORDER BY 排序 

如果使用了 ORDER BY 子句,它必须位于 SQL 语句的最后。

SELECT 语句的执行顺序如下:

  • FROM 子句
  • WHERE 子句
  • SELECT 子句
  • ORDER BY 子句

12,使用别名排序

 13,多列排序

 也可以排序一个不在select列表中的列。

SQL函数

单行函数

 1,字符函数

2,数字函数

 

 

 举例:

ROUND(column|expression, n) 函数
SELECT ROUND(45.923,-1);--->50
SELECT ROUND(45.923,-2);--->0
SELECT ROUND(55.923,-2);--->100
 TRUNCATE(column|expression,n) 函数
SELECT TRUNCATE(45.923,0);--->45
SELECT TRUNCATE(45.923,-1);--->40
SELECT TRUNCATE(45.923,-2);--->0
SELECT TRUNCATE(345.923,-2);--->300
SELECT TRUNCATE(345.923,-3);--->0

3,日期函数

在MySQL中允许直接使用字符串表示日期,但是要求字符串的日期 格式必须为:‘YYYY-MM-DD HH:MI:SS’ 或者‘YYYY/MM/DD HH:MI:SS’。

4,转换函数

隐式数据类型转换

隐式数据类型转换是指MySQL服务器能够自动地进行类型转换。

 显示数据类型转换

显示数据类型转换是指需要依赖转换函数来完成相关类型的转换。

  • DATE_FORMAT(date,format) 将日期转换成字符串;
  • STR_TO_DATE(str,format) 将字符串转换成日期;

 5,通用函数(用的比较多,更多是用来处理逻辑判断的)

多表查询

多表查询分类 sql92标准:

  • 内连接(等值连接 、非等值连接 、 自连接)。
  • sql99标准:内连接、外连接(左外、右外、全外(MySQL不支持全外连接))、交叉连接。

SQL92标准中的查询

1,等值连接

等值连接特点:

  1. 多表等值连接的结果为多表的交集部分;
  2. n表连接,至少需要n-1个连接条件;
  3. 多表不分主次,没有顺序要求;
  4.  一般为表起别名,提高阅读性和性能;
  5. 可以搭配排序、分组、筛选….等子句使用;

注意: 等值连接也被称为简单连接 (simple joins) 或内连接 (inner joins)。

等值连接的使用

SELECT 子句指定要返回的列名:

----- employee last name、employee number 和 department number,这些是 EMPLOYEES 表中的列

----- department number、department name 和 location ID, 这些是 DEPARTMENTS 表中的列

FROM 子句指定数据库必须访问的两个表:

------ EMPLOYEES 表

----- DEPARTMENTS 表

WHERE 子句指定表怎样被连接:

EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID,因为 DEPARTMENT_ID 列 是两个表的同名列,它必须用表名做前缀以避免混淆

增加搜索条件

添加查询条件:除连接之外,可能还要求用 WHERE 子句在连接中限制一个或多个表中的行。

限制不明确的列名
  • 需要在 WHERE 子句中用表的名字限制列的名字以避免含糊不清。没有表前缀,DEPARTMENT_ID 列可能来自 DEPARTMENTS 表,也可能来自 EMPLOYEES 表,这种情况下需要添加表前缀来执行 查询。
  • 如果列名在两个表之间不相同,就不需要限定列。但是,使用表前缀可以改善性能,因为MySQL服 务器可以根据表前缀找到对应的列。
  • 必须限定不明确的列名也适用于在其它子句中可能引起混淆的那些列,例如 SELECT子句或 ORDER BY 子句。
使用表别名

表别名定义原则

  • 表别名不易过长,短一些更好。
  • 表别名应该是有意义的。
  • 表别名只对当前的 SELECT 语句有效。
多表连接

2, 非等值连接

 3,自连接(自连接的表别名非常重要)

图片中的例子连接 EMPLOYEES 表到它自己。为了在 FROM 子句中 模拟两个表,对于相同的表 EMPLOYEES,用两个别名,分别为 worker 和 manager。在该例中,WHERE 子句包含的连接意味着 “一个工人的经理号匹配该经理的雇员号”。

SQL99标准中的查询

SQL99中的交叉连接(CROSS JOIN)

1,创建交叉连接

SQL99中的自然连接(NATURAL JOIN)

2,创建自然连接

连接只能发生在两个表中有相同名字和数据类型的列上。如果列有相同的名字,但 数据类型不同,NATURAL JOIN 语法会引起错误。

 SQL99中的内连接(INNER JOIN)

 语法:

  • SELECT 查询列表;
  • FROM 表1 别名;
  • INNER JOIN 连接表(INNER关键字可省略);
  • ON 连接条件;

用ON子句指定连接条件

 用ON子句指定更多的连接条件

外连接查询(OUTER JOIN)

所谓的外连接指的是什么,就是当我们查询到匹配的结果集以外的数据,除了显示查到匹配的结果集,还能显示除了它以外的那些不匹配的数据,就叫外连接。到底显示谁的表当中不匹配的数据,那看你用的是左外还是右外,以及表示在左面还是右面。

1,孤儿数据(Orphan Data)

孤儿数据指被连接的列的值为空的数据。指的就是那些不匹配的数据,在外连接当中所查到的那些不匹配的数据。

2,左外连接

 

左边的表 (EMPLOYEES) 中即使没有与 DEPARTMENTS 表中匹配的 行,该查询也会取回 EMPLOYEES 表中所有的行。

3,右外连接(RIGTH OUTER JOIN)

 

右边的表 (DEPARTMENTS ) 中即使没有与 EMPLOYEES 表中匹配的 行,该查询也会取回 DEPARTMENTS 表中所有的行。

4,全外连接(FULL OUTER JOIN)

注意: MySQL 中不支持 FULL OUTER JOIN 连接

可以使用 union 实现全完连接。

  • UNION: 可以将两个查询结果集合并,返回的行都是唯一的,如同对整个结果集合使用了 DISTINCT,会对重复的数据做剔除。
  • UNION ALL: 只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数 据, 那么返回的结果集就会包含重复的数据了。

语法结构

(SELECT 投影列 FROM 表名 LEFT OUTER JOIN 表名 ON 连接条件)
UNION
(SELECT 投影列 FROM 表名 RIGHT OUTER JOIN 表名 ON 连接条件)

聚合函数

聚合函数也称之为多行函数,组函数或分组函数。聚合函数不象单行函数,聚合函数对行的分组进行操作,对每组给出一个结果。如 果在查询中没有指定分组,那么聚合函数则将查询到的结果集视为 一组。

1,聚合函数的类型

 

2,聚合函数说明

3,聚合函数使用方式 

 使用聚合函数的原则

  • DISTINCT 使得函数只考虑不重复的值;
  • 所有聚合函数忽略空值。为了用一个值代替空值,用 IFNULL 或 COALESCE 函数。

AVG 和 SUM 函数

AVG(arg)函数

对分组数据做平均值运算。 arg:参数类型只能是数字类型。

SUM(arg)函数

对分组数据求和。 arg:参数类型只能是数字类型。

MIN 和 MAX 函数

MIN(arg)函数

求分组中最小数据。 arg:参数类型可以是字符、数字、 日期。

MAX(arg)函数

求分组中最大数据。 arg:参数类型可以是字符、数字、 日期。

COUNT 函数

返回分组中的总行数。

COUNT 函数有三种格式:

  • COUNT(*):返回表中满足 SELECT 语句的所有列的行数,包括 重复行,包括有空值列 的行。
  • COUNT(expr):返回在列中的由 expr 指定的非空值的数。
  • COUNT(DISTINCT expr):返回在列中的由 expr 指定的唯一的非空值的数。

使用 DISTINCT 关键字

  • COUNT(DISTINCT expr) 返回对于表达式 expr 非空并且值不相同的行数
  • 显示 EMPLOYEES 表中不同部门数的值

组函数和 Null 值

在组函数中使用 IFNULL 函数

SELECT AVG(IFNULL(commission_pct, 0)) FROM employees;

数据分组(GROUP BY)

在没有进行数据分组之前,所有聚合函数是将结果集作为一个大的信息组进行处理。但是,有时,则需要将表的信息划分为较小的组,可以用 GROUP BY 子句实现。

1,GROUP BY 子句语法

 原则

  • 使用 WHERE 子句,可以在划分行成组以前过滤行。
  • 如果有WHERE子句,那么GROUP BY 子句必须在WHERE的子句后面。
  • 在 GROUP BY 子句中必须包含列。

2,使用 GROUP BY 子句

下面是包含一个 GROUP BY 子句 SELECT 语句的求值过程:

SELECT 子句指定要返回的列:

在 EMPLOYEES 表中的部门号

  • ----- GROUP BY 子句中指定分组的所有薪水的平均值
  • ----- FROM 子句指定数据库必须访问的表:EMPLOYEES 表。

WHERE 子句指定被返回的行。因为无 WHERE 子句默认情况下 所有行被返回。

GROUP BY 子句指定行怎样被分组。行用部门号分组,所以 AVG 函数被应用于薪水列,以计算每个部门的平均薪水。

 3,在多列上使用分组

 下面是图 片中的 SELECT 语句中包含一个 GROUP BY 子句时的求值过程:

SELECT 子句指定被返回的列:

  • 部门号在 EMPLOYEES 表中
  • Job ID 在 EMPLOYEES 表中 
  • 在 GROUP BY 子句中指定的组中所有薪水的合计

FROM 子句指定数据库必须访问的表:EMPLOYEES 表。

GROUP BY 子句指定你怎样分组行:

  • 首先,用部门号分组行。 
  • 第二,在部门号的分组中再用 job ID 分组行。

如此 SUM 函数被用于每个部门号分组中的所有 job ID 的 salary 列。

4,约束分组结果(HAVING)

HAVING 子句

HAVING 子句是对查询出结果集分组后的结果进行过滤。

约束分组结果

用 WHERE 子句约束选择的行,用 HAVING 子句约束组。为了找到 每个部门中的最高薪水,而且只显示最高薪水大于 $10,000 的那些 部门,可以像下面这样做:

  1. 用部门号分组,在每个部门中找最大薪水。
  2. 返回那些有最高薪水大于 $10,000 的雇员的部门
SELECT department_id, MAX(salary) FROM
employees GROUP BY department_id HAVING
MAX(salary)>10000 ;

HAVING子句语法

子查询(分而治之)

 子查询语法

子查询

子查询是一个 SELECT 语句,它是嵌在另一个 SELECT 语句中的子 句。使用子查询可以用简单的语句构建功能强大的语句。

可以将子查询放在许多的 SQL 子句中,包括:

  • WHERE 子句
  • HAVING 子句
  • FROM 子句

1,使用子查询

 2,使用子查询的原则

  •  子查询放在圆括号中。
  • 将子查询放在比较条件的右边。
  • 在单行子查询中用单行运算符,在多行子查询中用多行运算符。

单行子查询

 单行子查询是从内查询返回一行的查询。在该子查询类型中用一个 单行操作符。

多行子查询 

 子查询返回多行被称为多行子查询。对多行子查询要使用多行运算符而不是单行运算符。

1,使用ANY运算符

ANY 运算符

ANY 运算符比较一个值与一个子查询返回的每一个值。

  • < ANY 意思是小于最大值。
  • > ANY 意思是大于最小值。
  • = ANY 等同于 IN。

2,使用ALL运算符

 ALL 运算符比较一个值与子查询返回的每个值。

  • < ALL 意思是小于最小值。
  • > ALL 意思是大于最大值,

NOT 运算符可以与 IN运算符一起使用。

3,子查询中的空值

内查询返回的值含有空值,并因此整个查询无返回行,原因是用大 于、小于或不等于比较Null值,都返回null。所以,只要空值可能是 子查询结果集的一部分,就不能用 NOT IN 运算符。NOT IN 运算符 相当于 <> ALL。

注意,空值作为一个子查询结果集的一部分,如果使用 IN 操作符的 话,不是一个问题。IN 操作符相当于 =ANY。

SELECT emp.last_name FROM employees emp WHEREemp.employee_id 
IN (SELECT mgr.manager_id FROM employees mgr);

MySQL中的索引

MySQL中的索引类型

  • 普通索引: 最基本的索引,它没有任何限制。
  • 唯一索引: 索引列的值必须唯一,但允许有空值,如果是组合索引,则列值 的组合必须唯一。
  • 主键索引: 特殊的索引,唯一的标识一条记录,不能为空,一般用primary key来约束。(具有主键约束的列,会自动创建主键索引。)
  • 联合索引: 在多个字段上建立索引,能够加速查询到速度。

普通索引

是最基本的索引,它没有任何限制。在创建索引时,可以指定索引 长度。length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度,如果是 BLOB 和 TEXT 类型,必须指定 length。

创建索引时需要注意: 如果指定单列索引长度,length 必须小于这个字段所允许的最大字符个数。

1,查询索引

SHOW INDEX FROM table_name;

2,直接创建索引

CREATE INDEX index_name ON table(column(length));

 column是列名,如果想指定长度就table(column(n)),不知道长度就直接table(column)。

3,修改表添加索引

ALTER TABLE table_name ADD INDEX index_name(column(length));

4,创建表时指定索引列

CREATE TABLE `table` (
COLUMN TYPE ,
PRIMARY KEY (`id`),
INDEX index_name (column(length))
);

示例:

 5,删除索引

DROP INDEX indexname ON tablename;

唯一索引(当为一个表分配了唯一性约束时,这个表就自带唯一索引了)

唯一索引与普通索引类似,不同的就是: 索引列的值必须唯一,但 允许有空值。

1,创建唯一索引

CREATE UNIQUE INDEX indexName ON table(column(length));

2,修改表添加唯一索引

ALTER TABLE table_name ADD UNIQUE indexName(column(length));

3,创建表时指定唯一索引

CREATE TABLE `table` (
COLUMN TYPE ,
PRIMARY KEY (`id`),
UNIQUE index_name (column(length))
);

 

主键索引

不能为一个没有分配主键约束的列去创建主键索引。
在做数据查询时,有这样一句话,能用主键作为条件判断的,一定要用主键来作为条件判断。它的效率非常高,因为主键自带主键索引。

主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许 有空值。一般是在建表的时候同时创建主键索引。

1,修改表添加主键索引

ALTER TABLE 表名 ADD PRIMARY KEY(列名);

2,创建表时指定主键索引

CREATE TABLE `table` (
COLUMN TYPE ,
PRIMARY KEY(column)
);

 

组合索引

组合索引是指使用多个字段创建的索引,只有在查询条件中使用了 创建索引时的第一个字段,索引才会被使用(最左前缀原则)。

最左前缀原则 —— 就是最左优先。

如: 我们使用表中的 name ,address ,salary 创建组合索引,那 么想要组合索引生效, 我们只能使用如下组合:

name/address/salary

name/address

name/

如果使用 addrees/salary 或者是 salary 则索引不会生效。

1,添加组合索引

ALTER TABLE table_name ADD INDEX index_name
(column(length),column(length));

2,创建表时创建组合索引

CREATE TABLE `table` (
COLUMN TYPE ,
INDEX index_name
(column(length),column(length))
);

MySQL事务

事务四大特征(ACID)

原子性(ATOMICITY)

  • 事务中的操作要么都不做,要么就全做。

一致性(CONSISTENCY)

  • 一个事务应该保护所有定义在数据上的不变的属性(例如完整性 约束)。在完成了一个成功的事务时,数据应处于一致的状态。

隔离性(ISOLATION)

  • 一个事务的执行不能被其他事务干扰。

持久性(DURABILITY)

  • 一个事务一旦提交,它对数据库中数据的改变就应该是永久性 的。

事务类型

显式事务

需要我们手动的提交或回滚。 DML 语言中的所有操作都是显示事务操作。DML 语句当中,所有的操作都是显示事务操作。

隐式事务

数据库自动提交不需要我们做任何处理,同时也不具备回滚性。 DDL、DCL 语言都是隐式事务操作

使用事务

在mysql当中,他对于DML操作的默认的事务时自动提交的,也就是说,当你去执行一个inserti update delete,并没有在一个事务的范围内去控制,因为没有开启一个事务的话,它默认的都是提交的。都是默认自动commit的,那一旦被commit了说明什么,说明以及被持久化处理了。
如果不想自动提交怎么办?先关闭mysql对于DML操作的自动提交,把需要手动提交的DML语句放到一个事务当中就可以了。怎么放到事务当中?先开启一个事务 start transation,从它下面所有的DML语句都不会自动提交,都需要手动提交。

举例:

创建account账户表,包含id、卡号、用户名、余额。

create table account(
id int primary key auto_increment,
cardnum varchar(20) not null,
username varchar(30) not null,
balance double(10,2)
);

向account表中插入两条数据。

insert into account(cardnum,username,balance)
VALUES('123456789','张三',2000);
insert into account(cardnum,username,balance)
VALUES('987654321','李四',2000);

在一个事务中完成转账业务。

START TRANSACTION
update account set balance = balance-200
where cardnum = '123456789';
update account set balance = balance+200
where cardnum = '987654321';
select * from account; 

—— 当我们关闭数据库重新打开后,张三和李四的账户余额并没发生任何变化。

—— 这是因为当我们使用“START TRANSACTION”开启一个 事务后,该事务的提交方式不再是自动的,  

—— 而是需要手动提交,而在这里,我们并没有使用事务提交语句COMMIT,  

—— 所以对account表中数据的修改并没有永久的保存到数据库中,也就是说我们的转账事务并没有执行成功  

—— 提交转账事务

commit;

—— 事务的回滚让数据库恢复到了执行事务操作前的状态。  

—— 需要注意的是事务的回滚必须在事务提交之前,因为事务 一旦提交就不能再进行回滚操作。

rollback;

事务的并发问题

1,脏读(读取未提交数据)

指一个事务读取了另外一个事务未提交的数据。

A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行 回滚操作,那么A事务读取到的数据就是脏数据。

2,不可重复读(前后多次读取,数据内容不一致)

在一个事务内读取表中的某一行数据,多次读取结果不同。

3,幻读(前后多次读取,数据总量不一致)

是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。

事务的隔离级别

事务的隔离级别用于决定如何控制并发用户读写数据的操作。数据 库是允许多用户并发访问的,如果多个用户同时开启事务并对同一 数据进行读写操作的话,有可能会出现脏读、不可重复读和幻读问 题,所以MySQL中提供了四种隔离级别来解决上述问题。

事务的隔离级别从低到高依次为:

  • READ UNCOMMITTED
  • READ COMMITTED(其他关系型数据库,比如oracle ,默认的是读已提交。)
  • REPEATABLE READ(mysql 默认的是它,重复读)
  • SERIALIZABLE(串行化,级别最高,安全性最高,但是性能最低)

隔离级别越低,越能支持高并发的数据库操作。

1,查看MySQL默认事务隔离级别

SELECT @@transaction_isolation;

2,设置事务隔离级别

对当前session有效。

set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;

MySQL的用户管理

在公司里不能让所有人都是用root账号,这样会造成权限泛滥。对于mysql也是很不安全的,在真正的环境当中,mysql的root用户只给一个人,就是公司的DBA——数据库管理员。

MySQL 是一个多用户的数据库系统,按权限,用户可以分为两种: root 用户,超级管理员,和由 root 用户创建的普通用户。

用户管理

1,创建用户

CREATE USER username IDENTIFIED BY 'password';

2,查看用户

SELECT USER,HOST FROM mysql.user;

权限管理

新用户创建完后是无法登陆的,需要分配权限。

1,分配权限

GRANT 权限 ON 数据库.表 TO 用户名@登录主机 IDENTIFIED BY "密码"

登陆主机:

 %:创建用户时,如果没有指定登陆权限,那它默认的就百分号,表示可以匹配所有的主机,意思就是:我们的mysql服务端启动以后,如果这个用户的权限是%,那这个用户可以在任何使用ip地址的设备当中去链接mysql服务端,如果说现在要远程连接一个mysql,mysql服务器在一个设备当中,我现在要通过navicat去连接它,而这个navicat它不在这个mysql服务器中,是在另一个设备当中,他们ip不一样,那这样可不可以用navicat连接mysql呢?可以的。但是要求你连接的用户,它的登录主机必须得是%,因为%表示的是可以在任意的ip下去链接mysql的服务端。

localhost:表示现在你的客户段,只能链接本机的mysql服务端。现在我登录的是root账号,也就意味着,现在我想在另一个设备当中去连接我的本机的这个mysql,我用toot是连不了的。因为root的host权限是localhost,只能本机去连。
那如果我想用我的设备以外的设备能去连接这个用toot用户连接的mysql怎么办?必须要对root用户重新授权,把它的连接权限host改成%就可以了。

127.0.0.1:可以指定具体的id,来指定用户的连接mysql的具体连接权限。

权限列表

GRANT ALL PRIVILEGES ON *.* TO
'username'@'localhost' IDENTIFIED BY'password'

2,刷新权限

每当调整权限后,通常需要执行以下语句刷新权限。

FLUSH PRIVILEGES;

3,删除用户

DROP USER username@localhost;

MySQL分页查询

分页查询就是在查询的结果集当中去取固定的条数的数据,比如说我现在查询的数据有1000条,但是我不全取,我只取前十条,这就叫分页查询。为什么要这样做,为了我们的界面。

MySQL 分页查询原则:

  • 在 MySQL 数据库中使用 LIMIT 子句进行分页查询。
  • MySQL 分页中开始位置为 0。
  • 分页子句在查询语句的最后侧。

1,IMIT子句

SELECT 投影列 FROM 表名 WHERE 条件 ORDER BY LIMIT 开始位置,查询数量;

2,LIMIT OFFSET子句

SELECT 投影列 FROM 表名 WHERE 条件 ORDER BY LIMIT 查询数量 OFFSET 开始位置;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL中的DDL操作,MySQL中DML操作,MySQL查询数据,SQL函数,MySQL中的索引,MySQL事务,MySQL的用户管理,MySQL分页查询 的相关文章

  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • 无法在 selenium 和 requests 之间传递 cookie,以便使用后者进行抓取

    我用 python 结合 selenium 编写了一个脚本来登录网站 然后从driver to requests这样我就可以继续使用requests进行进一步的活动 I used item soup select one div class
  • 如何通过 python 多处理利用所有核心

    我一直在摆弄Python的multiprocessing现在已经使用了一个多小时的功能 尝试使用并行化相当复杂的图形遍历函数multiprocessing Process and multiprocessing Manager import
  • 创建上下文后将 jar 文件添加到 pyspark

    我正在笔记本上使用 pyspark 并且不处理 SparkSession 的创建 我需要加载一个包含一些我想在处理 rdd 时使用的函数的 jar 您可以使用 jars 轻松完成此操作 但在我的特定情况下我无法做到这一点 有没有办法访问sp
  • MySQL 两种日期格式之间的转换

    用户将以这种格式输入日期 2017 年 2 月 17 日 存储在 mysql 数据库中的日期格式如下 2015 02 17 00 00 00 我想做的是 SELECT FROM insurance where DATE FORMAT in
  • 协程从未被等待

    我正在使用一个简单的上下文管理器 其中包含一个异步循环 class Runner def init self self loop asyncio get event loop def enter self return self def e
  • Python Tkinter 模块不显示输出

    我正在尝试学习 Python 并尝试使用 Python 中的 GUI 并遇到了这个 Tkinter 模块 我的代码运行 但运行时窗口没有出现 我的代码如下 from Tkinter import to create a root windo
  • AttributeError:“模块”对象没有属性[重复]

    这个问题在这里已经有答案了 我有两个 python 模块 a py import b def hello print hello print a py print hello print b hi b py import a def hi
  • 批处理文件并与数据库比较

    目前我正在开发一个 Spring Boot 应用程序 该应用程序定期尝试处理包含用户数据的文件 其中每行都包含userId and departamentId隔开 例如123534 13 该文件将包含数百万条记录 我的要求是以这样的方式将此
  • 如何使用scrapy检查网站是否支持http、htts和www前缀

    我正在使用 scrapy 来检查某些网站是否工作正常 当我使用http example com https example com or http www example com 当我创建 scrapy 请求时 它工作正常 例如 在我的pa
  • 根据其他单元格值更改多个单元格值

    我想更改包含的单元格moving to movingToOpenor movingToClose基于下一个单元格中给出的状态 有时循环会被中断并且不会从open to close or close to open 这是我当前的数据框 Dat
  • 查找 Pandas DF 行中的最短日期并创建新列

    我有一个包含多个日期的表 有些日期将为 NaN 我需要找到最旧的日期 所以一行可能有 DATE MODIFIED WITHDRAWN DATE SOLD DATE STATUS DATE 等 因此 对于每一行 一个或多个字段中都会有一个日期
  • 如何在sql server 2008R2中将单个单元格拆分为多个列?

    我想将每个名称拆分为各个列 create table split test value integer Allnames varchar 40 insert into split test values 1 Vinoth Kumar Raj
  • Ubuntu systemd 自定义服务因 python 脚本而失败

    希望获得有关 Ubuntu 中的 systemd 守护进程服务的一些帮助 我写了一个 python 脚本来禁用 Dell XPS 上的触摸屏 这更像是一个问题 而不是一个有用的功能 该脚本可以工作 但我不想一直启动它 这就是为什么我想到编写
  • 如何将带有参数的Python装饰器实现为类?

    我正在尝试实现一个接受一些参数的装饰器 通常带有参数的装饰器被实现为双重嵌套闭包 如下所示 def mydecorator param1 param2 do something with params def wrapper fn def
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • 如何对字段数据进行分组?

    我有 sql 查询来显示数据 SELECT artikel foto naam fotografer id fotografer name fotografer customer first name customer last name
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某
  • 错误 1305 (42000):保存点...不存在

    我的 MYSQL 数据库中有这个 SQL 存储过程为空 所以我猜没有隐式提交 DROP PROCEDURE IF EXISTS doOrder DELIMITER CREATE PROCEDURE doOrder IN orderUUID
  • 如何(安全)将 Python 对象发送到我的 Flask API?

    我目前正在尝试构建一个 Flask Web API 它能够在 POST 请求中接收 python 对象 我使用 Python 3 7 1 创建请求 使用 Python 2 7 运行 API 该 API 设置为在我的本地计算机上运行 我试图发

随机推荐

  • 可以这样学习linux命令

    通过综合练习 可以强化linux命令的学习 带着问题学习linux命令及其相关知识 是十分有效的方法 我们通过查询当前目录下的子目录这个问题 学习与训练linux 中一些重要命令 综合练习强于单个命令的分散学习 知识的串联 可以打通知识结点
  • python数组(矩阵)乘法(点乘、叉乘)

    转载 https blog csdn net haiziccc article details 101361583 总结 1 tf matmul A C np dot A C A C都属于叉乘 而tf multiply A C A C A
  • STM32的IAP在线升级

    IAP简介 简介部分copy自正点原子 IAP In Application Programming 即在应用编程 IAP 是用户自己的程序在运行过程中对User Flash 的部分区域进行烧写 目的是为了在产品发布后可以方便地通过预留的通
  • redhat 6.4安装oracle11g RAC (三)

    为数据和快速恢复去创建ASM磁盘组 只在节点rac1执行即可 进入grid用户下 grid rac1 grid srvctl status asm a ASM is running on rac2 rac1 ASM is enabled g
  • 快速浮点开方运算

    二分法 浮点开方也就是给定一个浮点数x 求根号x 这个简单的问题有很多解 我们从最简单最容易想到的二分开始讲起 利用二分进行开平方的思想很简单 就是假定中值为最终解 假定下限为0 上限为x 然后求中值 然后比较中值的平方和x的大小 并根据大
  • FISCO BCOS(二十)——— FISCO BCOS多群组搭建

    1 创建文件夹 创建目录 root wyg virtual machine mkdir fisco 2 创建配置文件 root wyg virtual machine fisco vim ipconf 3 建链 root wyg virtu
  • 【C++】封装的详细介绍

    目录 1 封装的意义 2 struct和class的区别 3 成员属性设置为私有 1 封装的意义 封装是C 面向对象的三大特性之一 封装的意义 1 将属性和行为作为一个整体 表现生活中的事物 2 将属性和行为加以权限控制 public公共权
  • CTFshow-pwn入门-栈溢出pwn49(静态链接pwn-mprotect函数的应用)

    pwn49 首先我们先将pwn文件下载下来 然后赋上可执行权限 再来查看pwn文件的保护信息 chomd x pwn checksec pwn file pwn 我们可以看到这是一个32位的pwn文件 并且保护信息开启了NX和canary
  • idea运行SSM项目及启动(tomcat),详细图解

    1 导入进项目 配置maven 2 配置本地的tomcat 3 选择本地的Tomcat Server 选择Local 点击create 4 tomcat路径配置 名称配置 端口及访问配置 5 项目war包配置生成 进入项目配置 1 进入Ar
  • Vuebnb:一个用vue.js和Laravel构建的全栈应用

    今年我一直在写一本新书叫全栈Vue网站开发 Vue js Vuex和Laravel 它会在Packt出版社在2018年初出版 这本书是围绕着一个案例研究项目 Vuebnb 简单克隆Airbnb 在这篇文章中 我会把它如何工作做一个高层次的概
  • 机器学习 day22(ReLU激活函数,激活函数的种类,如何选择激活函数)

    1 ReLU激活函数 当问题的结果是二元的 则a的范围是 0 1 激活函数g z 可以用sigmoid激活函数 如果问题的结果是无穷多个 如让a的范围取 0 激活函数g z 可以选用ReLU激活函数 他在z 0时取0 在z 0时取z 2 常
  • CDN服务技术架构图

    为什么80 的码农都做不了架构师 gt gt gt 前言 在博文中 解读大型网站的演变过程 浅谈 举家搬迁静态文件到CDN 博文中都有涉及CDN 这次我们来详细讲解下CDN的架构 简介 CDN是构建在网络之上的内容分发网络 依靠部署在各地的
  • linux搭建ftp修改域名访问,linux下构建建设完美FTP服务器

    关键字 ubuntu linux Apache2 PHP5 Pure FTPD pureftpd MySQL5 linux下构建建设完美FTP服务器 可管理 WEB管理 管理界面 一 安装Ubuntu5 Desktop版 来源博客 url
  • 对遗留系统组织重构项目

    很多IT组织都面临一个难题 老系统的维护 升级越来越难做 特别是那些价值高 生命周期长 规模大的核心业务系统 越到后来 要修复一个缺陷或者新增一个功能就需要越大的工作量 这是为什么呢 软 件的质量体现在两方面 商业方面的质量 以及技术方面的
  • 线性链表和顺序表的基本操作

    线性链表和顺序表的基本操作 一 实验目的 线掌握线性表的逻辑特性以及在计算机内的两种存储结构 线性链表和顺序表存储结构下基本操作的实现 会灵活应用线性表结构解决某些实际问题 二 实验内容 1 线性表顺序存储结下的基本操作的实现 初始化 赋值
  • 【2022年研究生科研素养提升系列公益讲座】课程笔记2——一些有用的数据库和科研工具

  • mobx基本使用

    mobx是一个简单可扩展的状态管理库 基本概念 state 状态 状态是驱动应用的数据 像有数据的excel表格 2 derivations 衍生 任何源自状态并且不会再进一步相互作用的东西 比如用户界面 待办事件的数量 把变化发送到服务端
  • c语言利用公式sin x=,用泰勒公式求sin(x)的近似值

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 include include define PI 3 1415927 double FACT double x double fact int n int main int n i k fla
  • java小笔记,List实体类对象的去重

    java小笔记 List实体类对象的去重 去除重复的数据 ArrayList lt 实体类 gt collect orderPOList stream collect Collectors collectingAndThen Collect
  • MySQL中的DDL操作,MySQL中DML操作,MySQL查询数据,SQL函数,MySQL中的索引,MySQL事务,MySQL的用户管理,MySQL分页查询

    目录 MySQL中的DDL操作 一 创建表与删除表 1 创建表 2 查看已创建的表 3 删除表 二 修改表 1 修改表名 2 修改列名 3 修改列类型 4 添加新列 5 删除指定列 三 MySQL的约束 1 修改表添加主键约束 2 删除主键