Appearance
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 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数值类型
| 类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
|---|---|---|---|---|
| TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
| SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
| MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
| INT 或 INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
| BIGINT | 8 字节 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
| FLOAT | 4 字节 | (-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) | 单精度浮点数值 |
| DOUBLE | 8 字节 | (-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。
| 类型 | 大小(字节) | 范围 | 格式 | 用途 |
|---|---|---|---|---|
| DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
| TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
| YEAR | 1 | 1901/2155 | YYYY | 年份值 |
| DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
| TIMESTAMP | 4 | 1970-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。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
| 类型 | 大小 | 用途 |
|---|---|---|
| CHAR | 0-255 字节 | 定长字符串 |
| VARCHAR | 0-65535 字节 | 变长字符串 |
| TINYBLOB | 0-255 字节 | 不超过 255 个字符的二进制字符串 |
| TINYTEXT | 0-255 字节 | 短文本字符串 |
| BLOB | 0-65 535 字节 | 二进制形式的长文本数据 |
| TEXT | 0-65 535 字节 | 长文本数据 |
| MEDIUMBLOB | 0-16 777 215 字节 | 二进制形式的中等长度文本数据 |
| MEDIUMTEXT | 0-16 777 215 字节 | 中等长度文本数据 |
| LONGBLOB | 0-4 294 967 295 字节 | 二进制形式的极大文本数据 |
| LONGTEXT | 0-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