Skip to content

Mysql

  • 数据库: 数据库是一些关联表的集合。
  • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
  • 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
  • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
  • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
  • 外键:外键用于关联两个表。
  • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
  • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
  • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

创建数据库

mysql
## 创建数据库
create database 数据库名 charset=utf8;

## 删除数据库
drop database 数据库名;

## 查看所有数据库
show databases;

## 使用数据库
use 数据库名;

## 查看当前使用的数据库
select database();

数据表

mysql

## 查看当前数据库所有的表
show tables;

## 查看表结构
desc 表名;

## 创建数据表
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
   `runoob_id` INT UNSIGNED AUTO_INCREMENT,
   `runoob_title` VARCHAR(100) NOT NULL,
   `runoob_author` VARCHAR(40) NOT NULL,
   `submission_date` DATE,
   PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建数据库表:格式:creat table 表名(
字段名1 类型 约束,
字段名2 类型 约束,
...            ...      ...
);

## 删除数据表
DROP TABLE table_name ;

drop table if exists 表名;

插入

mysql
INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

删除

mysql
// 删除数据
delete from 表名 where 条件(物理删除,不用)
例:delete from students where id=1; --删除第一行
常用逻辑删除:通过设定一个字段来标识当前记录已经删除
truncate table 表名--(只删数据)
drop table 表名 --(删除所有数据和表结构)
说明:
delete --删除数据时,若新增数据,新增数据的id是删除的id号的后一个
truncate --删除数据后,若新增数据,是从id=1开始的

修改

msysql
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]

查询

msysql
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]

格式:select 字段1,字段2,...from 表名 where 条件;
说明:where 支持多种运算符进行条件处理
比较运算:=、>、>=、<、<=、!=
逻辑运算:and、or、not
模糊查询:关键字like、匹配任意多个字符%、 匹配一个任意字符:-
范围查询:连续范围内between、非连续范围in
空判断:判断为空is null、为非空is not null

例:
1、查询家乡是北京/南京/新疆的学生:
select * from 表名 where hometown in ('北京','南京','新疆');
2、查询年龄为18-20岁的学生:
select * from 表名 where age between 18 and 20;

格式:
select * from 表名 order by 字段名1 ase/desc,字段名2 ase/desc,...;
说明:ase:升序(默认可以不写)  desc:降序
例:查询所有学生信息,按年龄从小到大排序,年龄相同时,再按学号从小到大排:
select * from 表名 order by age,studentsNo;

聚合函数作用:方便进行数据统计       --注!不能在where中使用!!!
count()--查询总记录数
例:
1、查询学生总数:
select count(*)from students;
2、查询1班年龄小于18岁的同学有几个:
select count(*)from students where class='1班' and age<18;
max(字段名):--查询最大值
例:
查询女生的最大年龄:
select max(age)from st where sex='女';
min(字段名):--查询最小值
sum(字段名):--求和
avg(字段名):--求平均值
例:
1、查询所有学生的最大年龄、最小年龄、平均年龄:
select max(age),min(age),avg(age)from students;
2、查询1班年龄小于18岁的同学有几个:
select count(*)from st where class='1班' and age<18;

作用:按照字段分组,此字段相同的数据会放到同一个组中
目的:使用聚合函数,对每一组的数据进行统计
格式:
select 字段1,字段2,聚合函数...from 表名 group by 字段1,字段2,...;
例:
1、查询各种性别的人数:
select sex,count(*)from st group by sex;
2、查询每个班级中各种性别的人数:
select class,sex,count(*)from st group by class,sex;
3、查询各个性别中的总人数、最大年龄、平均年龄:
select sex,count(*),max(age),avg(age)from st group by class,sex;
注!分组后再过滤不能用where,要用having
区别:
1、where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
2、having是对group by的结果进行筛选
3、having后面的条件可以用聚合函数,where不能
例:
1、查询每个班级男生的总数:
select class,sex,count(*)from st group by class,sex having sex='男';
2、查询所有班级中不同性别的记录数大于1的信息:
select class,sex,count(*)from st group by class,sex having count(*)>1;

ORDER BY 排序

mysql
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]]

GROUP BY 分组

mysql
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

SELECT column_name, COUNT(*) AS "salesNum" FROM employee_tbl GROUP BY name;

使用 WITH ROLLUP

mysql
mysql> SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;

## 结果
+--------------------------+--------------+
| coalesce(name, '总数') | singin_count |
+--------------------------+--------------+
| 小丽                   |            2 |
| 小明                   |            7 |
| 小王                   |            7 |
| 总数                   |           16 |
+--------------------------+--------------+
4 rows in set (0.01 sec)

JOIN 联合多表查询

JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。 LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。 RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

mysql
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a
INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;

UNION 操作符

mysql
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
  • expression1, expression2, ... expression_n: 要检索的列。
  • tables: 要检索的数据表。
  • WHERE conditions: 可选, 检索条件。
  • DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
  • ALL: 可选,返回所有结果集,包含重复数据。

NULL 值处理

  • IS NULL: 当列的值是 NULL,此运算符返回 true。
  • IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
  • <=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。 关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。

在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回 false 。

MySQL 中处理 NULL 使用 IS NULL 和 IS NOT NULL 运算符。

ALTER 命令

需要修改数据表名或者修改数据表字段时,就需要使用到 MySQL ALTER 命令。

mysql
## 删除以上创建表的 field_name 字段
ALTER TABLE table_name  DROP field_name;

## 添加表字段
ALTER TABLE table_name ADD field_name INT FIRST; // 关键字 FIRST (设定位第一列)
ALTER TABLE table_name ADD field_name INT AFTER c; // 添加字段并设置在c字段之后的位置

## 修改表字段
ALTER TABLE table_name MODIFY field_name CHAR(10);
## 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。
ALTER TABLE table_name CHANGE field_name new_field_name BIGINT;

## 当你修改字段时,你可以指定是否包含值或者是否设置默认值。如不设置默认值,MySQL会自动设置该字段默认为 NULL。
ALTER TABLE table_name MODIFY field_name BIGINT NOT NULL DEFAULT 100;

## 修改表名
ALTER TABLE table_name RENAME TO new_table_name;

事务

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

事务是必须满足 4 个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

索引

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、UPDATE 和 DELETE。因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件。

建立索引会占用磁盘空间的索引文件。

普通索引

创建索引

mysql
CREATE INDEX indexName ON mytable(username(length));

修改表结构(添加索引)

mysql
ALTER table tableName ADD INDEX indexName(columnName)

创建表的时候直接指定

mysql
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);

删除索引的语法

mysql
DROP INDEX [indexName] ON mytable;

复制表

SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。

处理重复数据

在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。

删除重复数据

mysql
CREATE TABLE tmp SELECT last_name, first_name, sex FROM table_name  GROUP BY (last_name, first_name, sex);

DROP TABLE person_tbl;

ALTER TABLE tmp RENAME TO person_tbl;

过滤重复数据

mysql
SELECT DISTINCT last_name, first_name FROM table_name;

MySQL 数据类型

MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

数值类型

类型大小范围(有符号)范围(无符号)用途
TINYINT1 字节(-128,127)(0,255)小整数值
SMALLINT2 字节(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 字节(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT 或 INTEGER4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 字节(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
FLOAT4 字节(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度浮点数值
DOUBLE8 字节(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度浮点数值
DECIMAL对 DECIMAL(M,D) ,如果 M>D,为 M+2 否则为 D+2依赖于 M 和 D 的值依赖于 M 和 D 的值小数值

日期和时间类型

表示时间值的日期和时间类型为 DATETIME、DATE、TIMESTAMP、TIME 和 YEAR。

类型大小(字节)范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00/2038
结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038 年 1 月 19 日 凌晨 03:14:07
YYYYMMDD HHMMSS混合日期和时间值,时间戳

字符串类型

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

类型大小用途
CHAR0-255 字节定长字符串
VARCHAR0-65535 字节变长字符串
TINYBLOB0-255 字节不超过 255 个字符的二进制字符串
TINYTEXT0-255 字节短文本字符串
BLOB0-65 535 字节二进制形式的长文本数据
TEXT0-65 535 字节长文本数据
MEDIUMBLOB0-16 777 215 字节二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 字节中等长度文本数据
LONGBLOB0-4 294 967 295 字节二进制形式的极大文本数据
LONGTEXT0-4 294 967 295 字节极大文本数据

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

SQL 语句书写顺序和执行顺序

​ select->distinct->from->join->on->where->group by->having->order by->limit