目录
一、 RDBMS关系数据库管理系统的一些概念
1.聚集索引
2.非聚集索引
3.覆盖索引
二、数据类型
1.数值:
2.日期/时间
3.字符串(字符)类型
4.数据类型的属性
三、数据库
1.创建RUNOOB数据库
2.删除数据库
3.使用数据库
四、数据表 操作
1.创建表
2.删除表/删除表内数据
五、SQL语言
1. 数据查询语言DQL(Data Query Language)
2 .数据操纵语言DML(Data manipulation Language)
3. 数据定义语言DDL(Data Define Language)
4. 数据控制语言DCL
六、数据操作、子句
1.增 insert
2.查 select
3. 改 update
4.删delete
5. 过滤数据
(1)where 子句
(2) Like子句
7.UNION 操作符
8.MySQL 排序
9.GROUP BY 语句 可统计数量
10.aliasea别名
11. 连接
七、MySQL正则表达式
八、MySQL事务
1 MySQL事务 -
2. MySQL表锁定 - 了解如何使用MySQL锁来协调会话之间的表访问。
RDBMS | 表示 |
数据库 | 数据库是表的集合,具有相关数据 |
表 | 表是用数据矩阵。在一个数据库中的表看起来就像一个简单的电子表格 |
列 | 一列(数据元素)包含一个的数据和相同种类,例如,列邮政编码。行一行(元组,条目或记录)是一组相关的数据,例如一个订阅的数据。 |
冗余 |
存储数据两次,冗余使系统更快。 |
主键 | 主键是唯一的。不能在一个表中出现的一个键两次。使用键可以快速找到一行。 |
复合键 | 复合键是由多个列,因为有时一个列是不够唯一标识键的。 |
外键 | 外键是两个表之间的连接值。 |
索引 | 在数据库中的索引类似于索引在一本书(书的目录)。 |
参照完整性 | 参照完整性可以确保外键值总是指向现有的行。 |
其他都很容易理解,索引理解参考这篇文章 深入浅出数据库索引原理https://www.cnblogs.com/aspwebchh/p/6652855.html
大意是,如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是「平衡树」结构,换句话说,就是整个表就变成了一个索引。也就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键, 一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。
如运行下面代码时:
select * from table where id = 1256;
首先根据索引定位到1256这个值所在的叶结点,然后再通过叶结点取到id等于1256的数据行。从上图能看出,树一共有三层, 从根节点至叶节点只需要经过三次查找就能得到结果。
索引能让数据库查询数据的速度上升, 但会使写入数据的速度下降, 因为平衡树这个结构必须一直维持在一个正确的状态, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS(数据库管理系统)必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销,也就是为什么索引会给查询以外的操作带来副作用的原因。
非聚集所以就是我们平时经常提起和使用的常规索引,非聚集索引和聚集索引一样, 同样是采用平衡树作为索引的数据结构。索引树结构中各节点的值来自于表中的索引字段, 假如给user表的name字段加上索引 , 那么索引就是由name字段中的值构成,在数据改变时, DBMS需要一直维护索引结构的正确性。如果给表中多个字段加上索引 , 那么就会出现多个独立的索引结构,每个索引(非聚集索引)互相之间不存在关联。
每次给字段建一个新索引, 字段中的数据就会被复制一份出来, 用于生成索引。 因此,给表添加索引,会增加表的体积,占用磁盘存储空间。
非聚集索引和聚集索引的区别在于,通过聚集索引可以查到需要查找的数据,而通过非聚集索引可以查到记录对应的主键值 ,再使用主键的值通过聚集索引查找到需要的数据,如下图。
不管以任何方式查询表, 最终都会利用主键通过聚集索引来定位到数据, 聚集索引(主键)是通往真实数据所在的唯一路径。
然而, 有一种例外可以不使用聚集索引就能查询出所需要的数据, 这种非主流的方法 称之为「覆盖索引」查询, 也就是平时所说的复合索引或者多字段索引查询。 文章上面的内容已经指出, 当为字段建立索引以后, 字段中的内容会被同步到索引之中, 如果为一个索引指定两个字段, 那么这个两个字段的内容都会被同步至索引之中。
先看下面这个SQL语句
//建立索引
create index index_birthday on user_info(birthday);
//查询生日在1991年11月1日出生用户的用户名
select user_name from user_info where birthday = '1991-11-1'
这句SQL语句的执行过程如下
我们把birthday字段上的索引改成双字段的覆盖索引
create index index_birthday_and_user_name on user_info(birthday, user_name);
这句SQL语句的执行过程就会变为
通过这种覆盖索引直接查找的方式, 可以省略不使用覆盖索引查找的后面两个步骤, 提高了查询性能。
转载自:https://www.cnblogs.com/andy6/p/5789248.html
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。
这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。
通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
例如,如果你在研究大量的临时数据,你也许需要使用内存MySQL存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。
这些不同的技术以及配套的相关功能在 MySQL中被称作存储引擎(也称作表类型)。
MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。
你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。
show engines;
https://www.cnblogs.com/andy6/p/5789248.html
参考:
http://www.cnblogs.com/zbseoag/archive/2013/03/19/2970004.html
http://www.runoob.com/mysql/mysql-data-types.html
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的值 | 小数值 |
取值范围如果加了unsigned,则最大值翻倍,如 tinyint unsigned 的取值范围为(0~256)。
int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度,不知道这个m有什么用。
类型 | 大小 (字节) |
范围 | 格式 | 用途 |
---|---|---|---|---|
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 | 混合日期和时间值,时间戳 |
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
类型 | 大小 | 用途 |
---|---|---|
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字节 | 变长 极大文本数据 |
1、一个汉字占多少长度与编码有关:
UTF-8:一个汉字=3个字节
GBK:一个汉字=2个字节
2、varchar(n) 表示 n 个字符,无论汉字和英文,Mysql 都能存入 n 个字符,仅是实际字节长度有所区别
3、MySQL 检查长度,可用 SQL 语言来查看:
select LENGTH(fieldname) from tablename
char 和 varchar:
varchar 和 text:
MySQL关键字 | 含义 |
NULL | 数据列可包含NULL值 |
NOT NULL | 数据列不允许包含NULL值 |
DEFAULT | 默认值 |
PRIMARY KEY | 主键 |
AUTO_INCREMENT | 自动递增,适用于整数类型 |
UNSIGNED | 无符号 |
CHARACTER SET name | 指定一个字符集 |
DROP DATABASE IF EXISTS RUNOOB;
create DATABASE RUNOOB;
CREATE DATABASE IF NOT EXISTS RUNOOB DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
drop database RUNOOB;
use RUNOOB;
包括:
字段间用逗号,每个sql语句结束用分号
创建student表
CREATE TABLE IF NOT EXISTS student(
stu_id INT UNSIGNED auto_increment,
stu_name VARCHAR(100) NOT NULL,
stu_adress VARCHAR(100) NOT NULL,
stu_bir DATE,
PRIMARY KEY (stu_id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
参考:innodb存储引擎: https://www.cnblogs.com/Aiapple/p/5689634.html
注意当用到反单引号时:
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;
创建 MySql 的表时,表名和字段名外面的符号 ` 不是单引号,而是英文输入法状态下的反单引号,也就是键盘左上角 esc 按键下面的那一个 ~ 按键。反引号是为了区分 MySql 关键字与普通字符而引入的符号,一般的,表名与字段名都使用反引号。
(1)删除表和数据 drop
删除表全部数据和表结构,立刻释放磁盘空间,不管是 Innodb 和 MyISAM;
DROP TABLE IF EXISTS student;
(2) 删除表全部数据 truncate
关键字不区分大小写,表名和字段名等区分大小写。
删除表全部数据,保留表结构,立刻释放磁盘空间 ,不管是 Innodb 和 MyISAM;
truncate table student;
(3)删除表全部数据,表结构不变,对于 MyISAM 会立刻释放磁盘空间,InnoDB 不会释放磁盘空间;
delete from student;
(4) 部分删除、带条件的删除,表结构不变,不管是 innodb 还是 MyISAM 都不会释放磁盘空间;实例:
delete from student where T_name = "张三";
(5)delete 操作以后,使用optimize table table_name;会立刻释放磁盘空间,不管是 innodb 还是 myisam;
实例,删除学生表中姓名为 "张三" 的数据:
delete from student where T_name = "张三";
optimize table student;
delete from 表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分空间。
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。
参考:https://blog.csdn.net/weixin_42077001/article/details/80726055
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE
子句组成的查询块:
SELECT <字段名表>
FROM <表或视图名>
WHERE <查询条件>
数据操纵语言DML主要有三种形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 删除:DELETE
数据定义语言DDL用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等如:
CREATE TABLE/VIEW/INDEX/SYN/CLUSTER| | | | |表 视图 索引 同义词 簇
DDL操作是隐性提交的!不能rollback
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
1) GRANT:授权。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。
回滚---ROLLBACK
回滚命令使数据库状态回到上次最后提交的状态。其格式为:
SQL>ROLLBACK;
3) COMMIT [WORK]:提交。
在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成后才可以看到。提交数据有三种类型:显式提交、隐式提交及自动提交。下面分
别说明这三种类型。
(1) 显式提交
用COMMIT命令直接完成的提交为显式提交。其格式为:
SQL>COMMIT;
(2) 隐式提交
用SQL命令间接完成的提交为隐式提交。这些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
(3) 自动提交
若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,
系统将自动进行提交,这就是自动提交。其格式为:
SQL>SET AUTOCOMMIT ON;
具体来看,增删改查等SQL是如何实现的。
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
实例:
insert into student (stu_name,stu_adress,stu_bir) values ('wang5','beijing','1996-09-28');
添加数据的时候可以规定列进行添加,如上面的代码,
如果所有的列都要添加数据,可以不写出列名,按顺序添加即可。
insert into student values (null,'wang6','beijing','1996-09-28');
当添加过主键自增(PRINARY KEY AUTO_INCREMENT)第一列在增加数据的时候,可以写为0或者null,这样添加数据可以自增。
语法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
实例:
select * from student where stu_bir = '1996-09-28' limit 3;
DISTINCT去重
SELECT DISTINCT lastname FROM employees ORDER BY lastname;
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
update student set stu_name='xiaowen' where stu_id=1;
DELETE FROM table_name [WHERE Clause]
DELETE from student where stu_id=1;
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
LIKE - 提供基于特定模式匹配查询数据的技术示例,以执行一些模糊查询。
SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
'%a' //以a结尾的数据
'a%' //以a开头的数据
'%a%' //含有a的数据
'_a_' //三位且中间字母是a的
'_a' //两位且结尾字母是a的
'a_' //两位且开头字母是a的
(3)
AND
运算符以组合布尔表达式以形成用于过滤数据的复杂条件。OR
运算符,并展示如何将OR
运算符与AND
运算符组合以过滤数据。WHERE
子句中使用IN
运算符来确定值是否匹配列表或子查询中的指定值。BETWEEN
运算符来根据指定范围查询数据。LIMIT
来限制SELECT
语句返回的行数(4)IS NULL - 使用IS NULL
运算符测试值是否为NULL
。
关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。
在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回false 。
MySQL 中处理 NULL 使用 IS NULL 和 IS NOT NULL 运算符。
select * , columnName1+ifnull(columnName2,0) from tableName;
columnName1,columnName2 为 int 型,
当 columnName2 中,有值为 null 时,columnName1+columnName2=null, ifnull(columnName2,0) 把 columnName2 中 null 值转为 0。
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: 可选,返回所有结果集,包含重复数据。
UNION 语句:不包括重复数据
UNION ALL 语句:包括重复数据
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
MySQL 拼音排序
如果字符集采用的是 gbk(汉字编码字符集),直接在查询语句后边添加 ORDER BY:
SELECT *
FROM runoob_tbl
ORDER BY runoob_title;
如果字符集采用的是 utf8(万国码),需要先对字段进行转码然后排序:
SELECT *
FROM runoob_tbl
ORDER BY CONVERT(runoob_title using gbk);
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
实例:
SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
可以实现一个最简单的去重查询;
分组后的条件使用 HAVING 来限定,WHERE 是对原始数据进行条件限制。几个关键字的使用顺序为 where 、group by 、having、order by ,例如:
SELECT name, COUNT(*) FROM employee_tbl GROUP BY name HAVING count(*)>2 order by count(*) desc;
表的别名:
SELECT po.OrderID,p.LastName,p.FirstName
WHERE p.LastName=' Adams' AND p.FirstName='John'
FROM Persons AS p, Product_Orders AS po
列的别名:
SELECT LastName AS Family,FirstName AS Name FROM Persons;
连接参考:http://www.runoob.com/mysql/mysql-join.html
http://www.runoob.com/mysql/mysql-regexp.html
了解MySQL事务,以及如何使用COMMIT
和ROLLBACK
来管理MySQL中的事务。
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
mysql中的变量:https://www.cnblogs.com/gavin110-lgy/p/5772577.html
select @变量名
对用户变量赋值有两种方式,一种是直接用"="号,另一种是用":="号。
其区别在于使用set命令对用户变量进行赋值时,两种方式都可以使用;当使用select语句对用户变量进行赋值时,只能使用":="方式,因为在select语句中,"="号被看作是比较操作符。
易学教程:https://www.yiibai.com/mysql/transaction.html
start transaction;
select @orderNumber := max(orderNumber) from orders;
set @orderNumber =@orderNumber +1;
insert into orders(orderNumber,
orderDate,
requiredDate,
shippedDate,
status,
customerNumber)
values(@orderNumber,
now(),
date_add(now(), INTERVAL 5 DAY),
date_add(now(), INTERVAL 2 DAY),
'In Process',
145);
insert into orderdetails(orderNumber,
productCode,
quantityOrdered,
priceEach,
orderLineNumber)
values(@orderNumber,'S18_1749', 30, '136', 1),
(@orderNumber,'S18_2248', 50, '55.09', 2);
-- commit changes
commit;
select * from orders a
inner join orderdetails b on a.ordernumber = b.ordernumber
where a.ordernumber = @ordernumber;
菜鸟教程:http://www.runoob.com/mysql/mysql-transaction.html
到这里:http://www.runoob.com/mysql/mysql-alter.html
八、MySQL索引
九、MySQL约束
八、经典SQL语句
j
经典SQL语句大全(绝对的经典)https://www.cnblogs.com/1234abcd/p/5530314.html
参考资料:
https://www.2cto.com/database/201801/715205.html
https://www.yiibai.com/mysql/basic-mysql.html
-未完