基础
📖数据库概述
数据库(database)是按照数据结构组织、存储和管理数据的仓库,存放数据的仓库
SQL全称:Structured Query Language,即结构化查询语言
📖数据库的分类
数据库主要分为关系型数据库和非关系型数据库,关系型数据库又称为SQL数据库,非关系型数据库又称为NoSQL数据库或Not only SQL数据库
区分是否为关系数据库还是非关系数据库其实只需要查看是否可以使用 SQL语句,关系型数据库可以使用 SQL语句,而非关系型数据库无法使用
🥥举个栗子
# 从customer 表中 查询 name 为 朝霞 的同学
# sql语法
select * from customer where name = "朝霞"
# 返回结果
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | 朝霞 | 18 |
+------+----------+------+
# nosql 语法
db.customer.find( {name: "朝霞"} ).pretty()
# nosql 返回的结果是json格式的:
{
"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会发现有四个库,这四个库是默认就有的,下面是这四个库的解释:
- information_schema:
这是一个信息数据库,它保存着关于Mysql服务器所维护的所有其他数据库的信息,例如数据库名称、数据库的表、表栏的数据类型和访问权限等
- mysql:
这个主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息
- performance_schema:
这个主要用于收集数据库服务器性能参数,并且库里的表的存储引擎均为performance_schema,而用户是不能创建存储引擎为performance_schema的表的
- sys:
这个库的所有数据源来自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)
创建库,查看库信息
#创建数据库aaa
create database aaa;
#ok表示命令执行成功
Query OK, 1 row affected (0.00 sec)
# 查看所有数据库
show databases;
+--------------------+
| Database |
+--------------------+
| aaa |
+--------------------+
#选中(进入)aaa库
use aaa;
查看表,创建表🌟
#在当前库下创建一个新的表
create table aaa(id int,name char(10),sex char(10));
#查看表的详细信息,其实就是创建表时所使用的SQL语句的详细信息
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 |
+--------------------------------------------+
#查看表的项,可以看到创建表时的三个项id、name、sex都显示出来了
desc aaa;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
#在当前库下创建一个新的表bbb,设置存储引擎是myisam,使用字符是utf8,要注意的是,mysql创建表的默认存储引擎是innoDB
create table bbb(id int,name char(10),sex char(10)) engine=myisam charset=utf8;
#查看表
show tables;
+---------------+
| Tables_in_aaa |
+---------------+
| aaa |
| bbb |
+---------------+
表的重命名
#把aaa表重命名为ccc
rename table aaa to ccc;
#查看表
show tables;
+---------------+
| Tables_in_aaa |
+---------------+
| bbb |
| ccc |
+---------------+
修改表的属性、格式
#修改bbb表的存储引擎为innoDB,字符为gbk
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 |
+--------------------------------------------+
添加表的字段
#先查看bbb表的信息
desc bbb;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
#在bbb表的最后添加项,age类型是int形式的
alter table bbb add age int;
#查看bbb表的信息,发现成功添加
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 | |
+-------+----------+------+-----+---------+-------+
#在bbb表中的id项后面添加aaa项,类型是char
alter table bbb add aaa char(10) after id;
#添加bbb项类型为char,添加在bbb表中的第一个
alter table bbb add bbb char(10) first;
删除表的字段(项)
#先查看bbb表的信息
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 | |
+-------+----------+------+-----+---------+-------+
#删除bbb表中的bbb项
alter table bbb drop bbb;
#再次查看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 | |
+-------+----------+------+-----+---------+-------+
修改表的字段和类型
#先查看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 | |
+-------+----------+------+-----+---------+-------+
#修改bbb表中的aaa项为abc类型为varchar
alter table bbb change aaa abc varchar(10);
#再次查看bbb表的信息,发现成功修改
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 | |
+-------+-------------+------+-----+---------+-------+
#修改bbb表中的abc项的类型为char并且移动项到sex项的后面,这里也可以使用first移动到第一个
alter table bbb modify abc char(10) after sex;
删除表和库
#先查看当前库下的所有表
show tables ;
+---------------+
| Tables_in_aaa |
+---------------+
| bbb |
| ccc |
+---------------+
#删除ccc表
drop table ccc;
#查看所有库
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aaa |
| bbb |
| mysql |
| performance_schema |
| sys |
+--------------------+
#删除bbb库
drop database bbb;
给表中插入数据 🌟
#查看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 | |
+-------+----------+------+-----+---------+-------+
#插入数据,直接使用values的话,输入的值的顺序必须和项的顺序相同
insert into bbb values(1,"rzy","man","aaa","20");
#插入数据,这样插入可以指定想要插入值的项,后面的values输入值要和前面指定项的顺序相同
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");
查看表中数据🌟
#查看表是否成功添加,NULL表示为空
# bbb 表明后+as+自定义名称(别名)
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 |
+------+----------+------+------+------+
#只查看表中的abc项的数据
select abc from bbb;
+------+
| abc |
+------+
| aaa |
| NULL |
| bbb |
| ccc |
| NULL |
| NULL |
+------+
#只查看表中name为rzy的数据
select * from bbb as b where b.name="rzy";
+------+------+------+------+------+
| id | name | sex | abc | age |
+------+------+------+------+------+
| 1 | rzy | man | aaa | 20 |
+------+------+------+------+------+
#只查看表中的age和sex项,并且只查看name为rzy的数据
select age,sex from bbb where name="rzy";
+-------------+
| age | sex |
+-------------+
| 20 | man |
+-------------+
更新(修改)表中的数据🌟
#查看bbb表中的所有数据
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 |
+------+----------+------+------+------+
#修改bbb表中的age项全部为100
update bbb set age=100;
#再次查看bbb表的所有信息,发现成功修改
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 |
+------+----------+------+------+------+
#修改bbb表中的age项为10并且只限于name为rzy的行
update bbb set age=10 where name="rzy";
#再次查看bbb表的所有信息,发现成功修改
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 |
+------+----------+------+------+------+
#删除bbb表中id项为1的行
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 |
+------+----------+------+------+------+
#删除bbb表中abc项为null空的行
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 |
+------+--------+------+------+------+
#删除bbb表中的所有数据
delete from bbb;
#查看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 |
+------+----------+------+------+------+
# 查询以z开头的所有数据
select * from bbb where name LIKE 'z%';
+------+----------+------+------+------+
| id | name | sex | abc | age |
+------+----------+------+------+------+
| 2 | zhangsan | NULL | NULL | 100 |
| 6 | zhangqi | NULL | NULL | 300 |
+------+----------+------+------+------+
# 查询包含z的所有数据
select * from bbb where name LIKE '%z%';
# 查询z开头n结尾的所有数据
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 |
+------+----------+------+------+------+
# 查询bbb表,根据id降序展示
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 |
+------+----------+------+------+------+
# order by排序默认按asc升序来排列
# 也可指定desc降序排列
限制多少行
一般用于分页操作
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 |
+------+----------+------+------+------+
#取前3行
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 |
+------+----------+------+------+------+
# 查询3条数据,从索引为2的开始
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 |
+------+----------+------+------+------+
# limit限定显示前多少行,可与order by联合使用
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 |
+------+----------+------+------+------+
# limit n 等同于 limit 0,n
# limit i,n
# i:为查询结果的索引值(默认从0开始),当i=0时可省略i
# n:为查询结果返回的数量
聚合函数
聚合函数对组执行计算并返回每个组唯一的值。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 |
+-------------+
# 查询bbb表中的总年龄
select sum(age) from bbb
+----------+
| count(*) |
+----------+
| 1000 |
+----------+
...
JOIN
# a left join b a表全,用b表去匹配a表 (左连接)
# LEFT JOIN 关键字会从左表 (a) 那里返回所有的行,即使在右表 (b) 中没有匹配的行,匹配不到的列用NULL代替
# a right join b b表全,用a表去匹配b表(右连接)
# RIGHT JOIN 关键字会右表 (b) 那里返回所有的行,即使在左表 (a) 中没有匹配的行,匹配不到的列用NULL代替
# inner join 与join 效果一样(内连接)
# 在表中存在至少一个匹配时,INNER JOIN 关键字返回行
# 全连接 out join
# ON指定联结的条件
# bbb 表数据
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 |
+------+----------+------+------+------+
# aaa 表数据
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 # ON指定联结的条件
- 内连接,也就是交集
select * from aaa inner join bbb on aaa.b_id = bbb.id # ON指定联结的条件