基础
📖数据库概述
数据库(database)是按照数据结构组织、存储和管理数据的仓库,存放数据的仓库
SQL全称:Structured Query Language,即结构化查询语言
📖数据库的分类
数据库主要分为关系型数据库和非关系型数据库,关系型数据库又称为SQL数据库,非关系型数据库又称为NoSQL数据库或Not only SQL数据库
区分是否为关系数据库还是非关系数据库其实只需要查看是否可以使用 SQL语句,关系型数据库可以使用 SQL语句,而非关系型数据库无法使用
🥥举个栗子
select * from customer where name = "朝霞"
+
| id | name | age |
+
| 1 | 朝霞 | 18 |
+
db.customer.find( {name: "朝霞"} ).pretty()
{
"id" : ObjectId("600c19d2289947de938c68ee"),
"name" : "朝霞",
"age" : 18,
}
-
关系型数据库 数据拥有固定的存储结构,通过库——表——数据的方式存储,存储时会有表的结构化关系,主要代表有Mysql 、mariadb 、oracle 、SQL Server 关系型数据库存储数据的过程:解析SQL语句——连接层——磁盘存取——结构化成表 -
非关系型数据库 非关系数据库的产生,就是为了加快客户端的访问速度才出现的。 非关系数据库是通过key:value的形式存储的,即键值对,例如name=rzy 键为name,值为rzy,主要代表Redis 、MongoDB
NoSQL的存储理念是以键值来存储,且结构不稳定,每一个元组都可以有不一样的字段,这种就不会局限于固定的结构,可以减少一些时间和空间的开销。使用这种方式,为了获取用户指定的不同信息,非关系型数据库不会像关系型数据库那样,进行多表查询,而实仅仅需要根据key来取出相应的value值即可,避免了关系型数据复杂的查询关系,可以增快查询的效率,这也意味着NoSQL中的键名是不能重复的,具有唯一性
| SQL | NOSQL |
---|
优点 | 容易理解 ,使用方便 ,易于维护,数据库的ACID属性 (原子性、一致性、隔离性、持久性) ,大大降低了数据冗余和数据不一致的概率, | 读写速度快(存的读写肯定是比硬盘快),以键值来存储,减少一些时间和空间的开销,更加灵活和可扩展 | 存储 | 存在特定结构的表中,数据放在硬盘 | 存储方式可以省是JSON文档、哈希表或者其他方式,将数据放到内存当中 | 缺点 | 海量数据的读写效率低,没有高扩展性和可用性 | 通用性差,学习成本高,数据结构相对复杂 | 适用 | 账号管理、地址、商品等 | 文章、微博、评论等 |
🧐Mysql的存储原理
用户输入SQL语句,MySQL处理然后进行存储的过程
-
连接器Connectors 即用户通过什么方式去访问数据库(也就类似登录网站用账号密码登录) -
连接池: 最上层负责和客户端进行连接,连接池可以同时处理很多个数据库请求 -
SQL接口: 当SQL语句进入MySQL后,会先到SQL接口中,这一层是封装层,将传过来的SQL语句拆散,将底层的结果封装成SQL的数据格式,就是把SQL语句拆散,然后重组成mysql系统认识的语言 -
解析器: 这一层负责将SQL语句进行拆分,验证,如果语句有问题那么就返回错误,如果没问题就继续向下执行,即写错SQL语句后会报错 -
优化器: 对SQL查询的结果优化处理,产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果。 -
缓存: 当用户查询数据库的数据时,缓存会对要查询的SQL语句进行hash后缓存,如果下一次是相同的查询语句,则在SQL接口之后直接返回结果,就像浏览器缓存一样,查询过一次后会进行缓存,下次用户再次查询相同数据就会直接返回,加快网页打开速度 -
存储引擎: MySQL有很多种存储引擎,每一种存储引擎有不同的特性,他们负责组织文件的存放形式,位置,访问文件的方法等等。比较常用的有innoDB,MyISAM,MEMORY等,默认的是innoDB存储引擎,存储引擎可以进行修改,但是不推荐,因为每个存储引擎都不一样,可能会导致某些字符不识别等问题 -
文件系统: 真正存放物理文件的单位,即硬盘
🍑SQL类型
语句分类
- DDL: 数据定义语言,用来建立数据库、数据对象和定义其列的项,命令有:create、alter、drop等
- DML: 数据操纵语言,用来查询、插入、删除、修改数据库中的数据,命令有:select、insert、update、delete等
- DCL: 数据控制语言,用来控制数据库组件的存取许可、存取权限等,赋权用户,命令有:commit、rollback、grant、revoke等
SQL语句的规格
- 每个命令要以
; 结尾 - 关键字之间要有空格,通常是一个空格,但是多个空格也不会报错
- SQL语句中可以换行,只要不输入
; 号,按回车就可以换行,直到有; 后就会执行 - SQL语句不区分大小写
- 在编写表的值的时,除了整数,基本上都要加
"" ,所以在写值时,直接加"" 就行了
数据类型
MySQL 支持所有标准 SQL 数值数据类型。
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|
tinyint | 1 Bytes | (-128,127) | (0,255) | 小整数值 | smallint | 2 Bytes | (-32 768,32 767) | (0,65 535) | 大整数值 | mediumint | 3 Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 | int或integer | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 | bigint | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 | float | 4 Bytes | (-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 Bytes | (-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的值 | 小数值 |
类型 | 大小( bytes) | 范围 | 格式 | 用途 |
---|
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到2037 年某时 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
类型 | 大小 | 用途 |
---|
char | 0-255 bytes | 定长字符串 | varchar | 0-65535 bytes | 变长字符串 | tinyblob | 0-255 bytes | 不超过 255 个字符的二进制字符串 | tinytext | 0-255 bytes | 短文本字符串 | blob | 0-65 535 bytes | 二进制形式的长文本数据 | text | 0-65 535 bytes | 长文本数据 | mediumblob | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 | mediumtext | 0-16 777 215 bytes | 中等长度文本数据 | longblob | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 | longtext | 0-4 294 967 295 bytes | 极大文本数据 |
Mysql自带的四个数据库 在mysql安装完成之后,进入mysql会发现有四个库,这四个库是默认就有的,下面是这四个库的解释:
这是一个信息数据库,它保存着关于Mysql服务器所维护的所有其他数据库的信息,例如数据库名称、数据库的表、表栏的数据类型和访问权限等
这个主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息
这个主要用于收集数据库服务器性能参数,并且库里的表的存储引擎均为performance_schema,而用户是不能创建存储引擎为performance_schema的表的
这个库的所有数据源来自performance_schema,目标是把performance_schema的复杂度降低,让DBA(数据库管理员)能够更好的阅读这个库中的内容,让DBA更快的了解DB(数据库)的运行情况
🍑SQL语法
连接数据库🌟
mysql -u root -p123123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.12 Source distribution
查看所有数据库
show databases
+
| Database |
+
| information_schema |
| mysql |
| performance_schema |
| sys |
+
4 rows in set (0.13 sec)
创建库,查看库信息
create database aaa;
Query OK, 1 row affected (0.00 sec)
show databases;
+
| Database |
+
| aaa |
+
use aaa;
查看表,创建表🌟
create table aaa(id int,name char(10),sex char(10));
show create table aaa;
+
| Table | Create Table|
+
| aaa | CREATE TABLE `aaa` (
`id` int(11) DEFAULT NULL,
`name` char(10) DEFAULT NULL,
`sex` char(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+
desc aaa;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
+
create table bbb(id int,name char(10),sex char(10)) engine=myisam charset=utf8;
show tables;
+
| Tables_in_aaa |
+
| aaa |
| bbb |
+
表的重命名
rename table aaa to ccc;
show tables;
+
| Tables_in_aaa |
+
| bbb |
| ccc |
+
修改表的属性、格式
alter table bbb engine=innoDB charset=gbk;
show create table bbb;
+
| Table | Create Table|
+
| bbb | CREATE TABLE `bbb` (
`id` int(11) DEFAULT NULL,
`name` char(10) CHARACTER SET utf8 DEFAULT NULL,
`sex` char(10) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+
添加表的字段
desc bbb;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
+
alter table bbb add age int;
desc bbb;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+
alter table bbb add aaa char(10) after id;
alter table bbb add bbb char(10) first;
删除表的字段(项)
desc bbb;
+
| Field | Type | Null | Key | Default | Extra |
+
| bbb | char(10) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
| aaa | char(10) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+
alter table bbb drop bbb;
desc bbb;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | YES | | NULL | |
| aaa | char(10) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+
修改表的字段和类型
desc bbb;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | YES | | NULL | |
| aaa | char(10) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+
alter table bbb change aaa abc varchar(10);
desc bbb;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | YES | | NULL | |
| abc | varchar(10) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+
alter table bbb modify abc char(10) after sex;
删除表和库
show tables ;
+
| Tables_in_aaa |
+
| bbb |
| ccc |
+
drop table ccc;
show databases;
+
| Database |
+
| information_schema |
| aaa |
| bbb |
| mysql |
| performance_schema |
| sys |
+
drop database bbb;
给表中插入数据 🌟
desc bbb;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
| abc | char(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+
insert into bbb values(1,"rzy","man","aaa","20");
insert into bbb (id,name) values(2,"zhangsan");
insert into bbb values(3,"lisi","girl","bbb","18"),(4,"wangwu","man","ccc","22");
insert into bbb (id,name) values(5,"renliu"),(6,"zhangqi");
查看表中数据🌟
select * from bbb as b;
+
| id | name | sex | abc | age |
+
| 1 | rzy | man | aaa | 20 |
| 2 | zhangsan | NULL | NULL | NULL |
| 3 | lisi | girl | bbb | 18 |
| 4 | wangwu | man | ccc | 22 |
| 5 | renliu | NULL | NULL | NULL |
| 6 | zhangqi | NULL | NULL | NULL |
+
select abc from bbb;
+
| abc |
+
| aaa |
| NULL |
| bbb |
| ccc |
| NULL |
| NULL |
+
select * from bbb as b where b.name="rzy";
+
| id | name | sex | abc | age |
+
| 1 | rzy | man | aaa | 20 |
+
select age,sex from bbb where name="rzy";
+
| age | sex |
+
| 20 | man |
+
更新(修改)表中的数据🌟
select * from bbb;
+
| id | name | sex | abc | age |
+
| 1 | rzy | man | aaa | 20 |
| 2 | zhangsan | NULL | NULL | NULL |
| 3 | lisi | girl | bbb | 18 |
| 4 | wangwu | man | ccc | 22 |
| 5 | renliu | NULL | NULL | NULL |
| 6 | zhangqi | NULL | NULL | NULL |
+
update bbb set age=100;
select * from bbb;
+
| id | name | sex | abc | age |
+
| 1 | rzy | man | aaa | 100 |
| 2 | zhangsan | NULL | NULL | 100 |
| 3 | lisi | girl | bbb | 100 |
| 4 | wangwu | man | ccc | 100 |
| 5 | renliu | NULL | NULL | 100 |
| 6 | zhangqi | NULL | NULL | 100 |
+
update bbb set age=10 where name="rzy";
select * from bbb;
+
| id | name | sex | abc | age |
+
| 1 | rzy | man | aaa | 10 |
| 2 | zhangsan | NULL | NULL | 100 |
| 3 | lisi | girl | bbb | 100 |
| 4 | wangwu | man | ccc | 100 |
| 5 | renliu | NULL | NULL | 100 |
| 6 | zhangqi | NULL | NULL | 100 |
+
删除表中的数据🌟
select * from bbb;
+
| id | name | sex | abc | age |
+
| 1 | rzy | man | aaa | 10 |
| 2 | zhangsan | NULL | NULL | 100 |
| 3 | lisi | girl | bbb | 100 |
| 4 | wangwu | man | ccc | 100 |
| 5 | renliu | NULL | NULL | 100 |
| 6 | zhangqi | NULL | NULL | 100 |
+
delete from bbb where id="1";
select * from bbb;
+
| id | name | sex | abc | age |
+
| 2 | zhangsan | NULL | NULL | 100 |
| 3 | lisi | girl | bbb | 100 |
| 4 | wangwu | man | ccc | 100 |
| 5 | renliu | NULL | NULL | 100 |
| 6 | zhangqi | NULL | NULL | 100 |
+
delete from bbb where abc is NULL;
select * from bbb;
+
| id | name | sex | abc | age |
+
| 3 | lisi | girl | bbb | 100 |
| 4 | wangwu | man | ccc | 100 |
+
delete from bbb;
select * from bbb;
Empty set (0.00 sec)
🌟进阶
查询
#####模糊查询
select * from bbb;
+
| id | name | sex | abc | age |
+
| 2 | zhangsan | NULL | NULL | 100 |
| 3 | lisi | girl | bbb | 150 |
| 4 | wangwu | man | ccc | 200 |
| 5 | renliu | NULL | NULL | 250 |
| 6 | zhangqi | NULL | NULL | 300 |
+
select * from bbb where name LIKE 'z%';
+
| id | name | sex | abc | age |
+
| 2 | zhangsan | NULL | NULL | 100 |
| 6 | zhangqi | NULL | NULL | 300 |
+
select * from bbb where name LIKE '%z%';
select * from bbb where name LIKE 'z%n';
排序
select * from bbb;
+
| id | name | sex | abc | age |
+
| 2 | zhangsan | NULL | NULL | 100 |
| 3 | lisi | girl | bbb | 150 |
| 4 | wangwu | man | ccc | 200 |
| 5 | renliu | NULL | NULL | 250 |
| 6 | zhangqi | NULL | NULL | 300 |
+
select * from bbb order by id desc;
+
| id | name | sex | abc | age |
+
| 6 | zhangqi | NULL | NULL | 300 |
| 5 | renliu | NULL | NULL | 250 |
| 4 | wangwu | man | ccc | 200 |
| 3 | lisi | girl | bbb | 150 |
| 2 | zhangsan | NULL | NULL | 100 |
+
限制多少行
一般用于分页操作
select * from bbb;
+
| id | name | sex | abc | age |
+
| 2 | zhangsan | NULL | NULL | 100 |
| 3 | lisi | girl | bbb | 150 |
| 4 | wangwu | man | ccc | 200 |
| 5 | renliu | NULL | NULL | 250 |
| 6 | zhangqi | NULL | NULL | 300 |
+
select * from bbb limit 3;
+
| id | name | sex | abc | age |
+
| 2 | zhangsan | NULL | NULL | 100 |
| 3 | lisi | girl | bbb | 150 |
| 4 | wangwu | man | ccc | 200 |
+
select * from bbb limit 2,3;
+
| id | name | sex | abc | age |
+
| 4 | wangwu | man | ccc | 200 |
| 5 | renliu | NULL | NULL | 250 |
| 6 | zhangqi | NULL | NULL | 300 |
+
select * from bbb order by id desc limit 3;
+
| id | name | sex | abc | age |
+
| 6 | zhangqi | NULL | NULL | 300 |
| 5 | renliu | NULL | NULL | 250 |
| 4 | wangwu | man | ccc | 200 |
+
聚合函数
聚合函数对组执行计算并返回每个组唯一的值。GROUP BY子句通常与聚合函数一起用于统计数据。GROUP BY子句将行排列成组,聚合函数返回每个组的统计量。
常用的聚合函数有:COUNT(),SUM(),AVG(),MIN(),MAX()。
- count(),其作用主要是返回每个组的行数,也会返回有NULL值的列,可用于数字和字符列。
- sum(),主要用于返回表达式中所有的总和,忽略NULL值,仅用于数字列。
- avg(),返回表达式所有的平均值,仅用于数字列并且自动忽略NULL值。
- min(),返回表达式中的最小值,忽略NULL值,可用于数字、字符和日期时间列。
- max(),返回表达式中的最大值,忽略NULL值,可用于数字、字符和日期时间列。
select * from bbb;
+
| id | name | sex | abc | age |
+
| 2 | zhangsan | NULL | NULL | 100 |
| 3 | lisi | girl | bbb | 150 |
| 4 | wangwu | man | ccc | 200 |
| 5 | renliu | NULL | NULL | 250 |
| 6 | zhangqi | NULL | NULL | 300 |
+
select count(*) from bbb
+
| count(*) |
+
| 5 |
+
select sum(age) from bbb
+
| count(*) |
+
| 1000 |
+
...
JOIN
select * from bbb;
+
| id | name | sex | abc | age |
+
| 1 | zhangsan | NULL | NULL | 100 |
| 2 | lisi | girl | bbb | 150 |
| 3 | wangwu | man | ccc | 200 |
| 4 | renliu | NULL | NULL | 250 |
| 5 | zhangqi | NULL | NULL | 300 |
+
select * from aaa;
+
| id | note | b_id |
+
| 1 | note1 | 1 |
| 2 | note2 | 2 |
| 3 | note3 | 3 |
| 4 | note7 | 7 |
+
+
| id | note | b_id |
+
| 1 | note1 | 1 |
| 2 | note2 | 2 |
| 3 | note3 | 3 |
| 4 | note7 | 7 |
+
- 左连接, 用bbb表去匹配aaa表,也称,aaa表全
select * from aaa left join bbb on aaa.b_id = bbb.id
select * from aaa inner join bbb on aaa.b_id = bbb.id
|