数据库基础
第一章.数据库介绍
1.数据库介绍
1.什么是数据库:
存储数据的仓库,数据库中要创建表,这些表是有特殊的格式,将数据永久性保存起来,对数据可以进行增删改查的操作
2.为什么要学数据库
a.数组,集合临时存储
c.IO流,可以将数据放到硬盘上,但是操作数据很麻烦
2.数据库管理系统
1.概述:用于管理和维护数据库以及数据库中的表,以及表中的数据的大型软件
2.作用:对数据库进行统一的管理和维护

3.数据库表
1.数据库中要创建很多张表,而表才是我们真正存储数据的地方
2.表的组成部分:
a.字段名
b.每一个字段都有固定的数据类型
3.表就类似于一个Java类
类名---表名
类的属性---表的每一个字段
对象---表中的一条记录
4.数据库表和Java类的对应关系
标准的javabean:
私有属性
构造
get/set
toString

第二章.mysql5.7安装
1.mysql5.7版本卸载和安装
1.1.数据库卸载
学习网络编程时,TCP/IP协议程序有服务器端和客户端。mysql这个数据库管理软件是使用TCP/IP协议。我们现在要卸载的是mysql的服务器端,它没有界面。
【计算】-->右键-->【管理】-->【服务】-->【mysql的服务】-->【停止】
1.1.1.方式1:利用控制面板卸载

1.1.2.方式2:360卸载


1.1.3.方式3:mysql安装包自带卸载功能

或者:



1.2.清除残留文件
1.2.1.正常删除残留文件
如果再次安装不成功,可以卸载后对残余文件进行清理后再安装。
(1)服务目录:mysql服务的安装目录
(2)数据目录:默认在C:\ProgramData\MySQL
如果自己单独指定过数据目录,就找到自己的数据目录,例如:

注意:请在卸载前做好数据备份
在操作完以后,需要重启计算机,然后进行安装即可。**如果仍然安装失败,需要继续操作如下步骤
1.2.2.清除注册表
如何打开注册表编辑器:在系统的搜索框中输入regedit
* HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL服务 目录删除
* HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\MySQL服务 目录删除
* HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL服务 目录删除
* HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\MySQL服务 目录删除
* HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL服务目录删除
* HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL服务删除
1.2.3.清理服务列表中的服务名

如果在windows操作系统,删除注册表后,在服务列表中仍然存在原来的服务名,可以通过如下命令删除。
命令:sc delete 服务名

1.2.4.清除原来mysql环境变量
找到path环境变量,将其中关于mysql的环境变量删除,**切记不要全部删除。**
例如:删除 D:\ProgramFiles\mysql\MySQLServer5.7\bin; 这个部分

1.3.mysql服务端安装
双击mysql-installer-community-5.7.28.0.msi,进入安装界面后选择Custom自定义安装,点击Next

- 在左侧目录中选择MySQL Server 5.7.28 -X64,点击
→加载到右侧,在选择一下要安装的产品名,在右下角会出现Advanced Options,单击它可以设置安装路径
- 例如将安装路径和数据路径修改到
D:\develop\下,点击OK。注意,安装目录避免空格和中文
- 点击Next下一步
- 点击Execute执行安装
有的可能会出现提示需要先安装C动态库等,那就先安装C动态库,没有提示说明操作系统中有你需要的动态库。
- 安装完成,点击Next下一步
- 点击Next下一步
- 点击Next下一步
- 将MySQL配置类型选择Development Computer开发电脑设置,点击Next下一步
- 设置MySQL密码,因为管理员用户为root,学习初期建议将MySQL数据库密码也设置为root,设置完成后,点击Next下一步
- 设置Windows Service 系统服务,设置完毕后点击Next下一步
- 日志设置,不做任何修改,点击Next下一步
- 高级设置,不做任何修改,点击Next下一步
- 点击Execute执行设置
- 安装完成,点击Finish完成
2.数据库服务启动和停止
MySQL软件的服务器端必须先启动,客户端才可以连接和使用使用数据库。
2.1.方式1:图形化方式
* 计算机(点击鼠标右键)==》管理(点击)==》服务和应用程序(点击)==》服务(点击)==》MySQL57(点击鼠标右键)==》启动或停止(点击)
* 控制面板(点击)==》系统和安全(点击)==》管理工具(点击)==》服务(点击)==》MySQL57(点击鼠标右键)==》启动或停止(点击)
* 任务栏(点击鼠标右键)==》启动任务管理器(点击)==》服务(点击)==》MySQL57(点击鼠标右键)==》启动或停止(点击)
快速打开服务页面的方式:services.msc
2.2.方式2:命令方式
启动 MySQL 服务命令:
net start MySQL57
停止 MySQL 服务命令:
net stop MySQL57
3.配置数据库环境变量
3.1.方式1:使用MYSQL_HOME
| 环境变量名 | 操作 | 环境变量值 |
|---|---|---|
| MYSQL_HOME | 新建 | D:\ProgramFiles\mysql\MySQLServer5.7 |
| path | 编辑 | %MYSQL_HOME%\bin |
3.2.方式2:直接配置mysql的bin路径
| 环境变量名 | 操作 | 环境变量值 |
|---|---|---|
| path | 编辑 | D:\ProgramFiles\mysql\MySQLServer5.7\bin |
4.数据库服务端安装之后登陆
1.win+R-->调出黑窗口
2.登录命令:
a.mysql -u用户名 -p密码->回车 -> 缺点,在登录的时候密码显示出来了
b.mysql -u 用户名 -p ->回车 ->推荐
输入密码(密码将显示成小星星)
问题:输入mysql命令出现"不是内部或外部命令"
原因:环境变量没配置
解决:将mysql安装路径下的bin目录复制到环境变量下的path中
如果path下有,还出现了"不是内部或者外部命令",干掉重新配置一下
问题:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
原因:输入的mysql用户名或者密码有问题
问题:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
原因:mysql服务没有启动
5.黑窗口乱码问题
1.在黑窗口中默认编码为GBK,而我们mysql为UTF-8,所以在黑窗口中操作中文就会乱码
2.解决:
a.在黑窗口中输入:set names gbk ->临时将mysql编码修改成gbk
b.在mysql安装路径下修改my.ini文件,将涉及到编码的地方都修改了,重启服务所有地方生效。
在路径:D:\ProgramFiles\mysql\MySQLServer5.7Data 找到my.ini文件
修改内容1:
找到[mysql]命令,大概在63行左右,在其下一行添加
default-character-set=utf8
修改内容2:
找到[mysqld]命令,大概在76行左右,在其下一行添加
character-set-server=utf8
collation-server=utf8_general_ci
修改完毕后,重启MySQL57服务
show variables like 'character_%';
show variables like 'collation_%';

6.mysql客户端(可视化工具)安装
例如:Navicat Preminum,SQLyog 等工具
6.1.SQLyog

6.2.Navicat

第三章.sql语句
1.sql语句介绍
1.概述:是一种数据库认识的语言,是所有关系型数据的一个标准->sql语句
2.注意:关系型数据库都要遵循这个sql语句规范,但是每一款关系型数据库都有自己的特点
这种具有自己特有的sql语法,叫做数据库方言
2.sql语句分类
- 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等
- 数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行操作。关键字:insert,delete,update等
- 数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户。
- 数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等
3.sql语句的通用语法
1.- SQL语句可以单行或多行书写,以分号结尾
2.- 可使用空格和缩进来增强语句的可读性
3.- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
- 例如:SELECT * FROM user。
4.- 同样可以使用/**/的方式完成注释 #
/*
我是一个注释
*/
#我也是一个注释
-- 我特么也是一个注释
4.sql中的数据类型
| 类型名称 | 说明 |
|---|---|
| int(整数长度) | 整数类型 |
| double | 小数类型 |
| decimal(m,d) | 指定整数位与小数位长度的小数类型 表示最长有m位,其中小数后数据有d位 |
| date | 日期类型,格式为yyyy-MM-dd,包含年月日,不包含时分秒 |
| datetime | 日期类型,格式为 YYYY-MM-DD HH:MM:SS,包含年月日时分秒 |
| timestamp | 日期类型,时间戳 |
| varchar(字符串长度) | 文本类型, M为0~65535之间的整数 varchar(10) |
| char(长度) | 字符类型 |

第四章.mysql中语句
1.DDL之数据库操作:database
1.1 创建数据库
1.语法:
create database 数据库名字 character set 字符集
create database 数据库名字 charset 字符集
2.注意:
如果自己取的表名,列名,库名和关键字冲突了,我们可以用``
如果自己取的表名,列名,库名没有和关键字冲突了,我们不用``
/*
create database 数据库名字 character set 字符集
create database 数据库名字 charset 字符集
注意: 如果自己取的表名,列名,库名和关键字冲突了,我们可以用``
如果自己取的表名,列名,库名没有和关键字冲突了,我们不用``
*/
CREATE DATABASE `210823_java` CHARSET utf8;
1.2 查看数据库
1.语法:show databases;->查看所有的数据库
2.语法:show create database 数据库名;->查看某一个库的信息
1.3 删除数据库
1.语法:drop database 数据库名字;
-- 1.语法:drop database 数据库名字;
DROP DATABASE 210823_java;
1.4 使用数据库(切换数据库)
1.语法:use 数据库名字
USE 210823_java;
1.5 修改数据库(了解)
-- 修改数据库编码
alter database 数据库名字 character set utf8;
注意:是utf8 不是utf-8
2.DDL之表操作->table
2.1 创建表
1.语法:
create table 表名(
字段名 数据类型 长度 [约束],
字段名 数据类型 长度 [约束]
)
2.注意:
当我们定义到最后一个字段时,最后就不要加,
/*
1.语法:
create table 表名(
字段名 数据类型 长度 [约束],
字段名 数据类型 长度 [约束]
)
2.注意:
当我们定义到最后一个字段时,最后就不要加,
*/
CREATE TABLE `category`(
cid INT,
cname VARCHAR(100)
);
2.3 查看表
查看所有表
show tables;
查看表结构
desc 表名;
-- 查看所有表
show tables;
-- 查看表结构
desc category;
2.4 删除表
1.语法:
drop table 表名
-- drop table 表名
DROP TABLE category;
2.5修改表结构(不推荐随意修改表结构)
alter table 表名 add 列名 类型(长度) [约束];
作用:修改表_添加列.
ALTER TABLE category ADD price DOUBLE;
alter table 表名 modify 列名 类型(长度) 约束;
作用:修改表_修改列的类型,长度及约束.
alter table category modify price int;
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
作用:修改表_修改列名.
ALTER TABLE category CHANGE price money INT;
alter table 表名 drop 列名;
作用:修改表_删除列.
ALTER TABLE category DROP money;
rename table 表名 to 新表名;
作用:修改表名
rename table category to kind;
3.DML之数据操作语言
3.1 插入数据
1.语法:
insert into 表名(列名,列名) values (数据,数据);
2.注意:
在数据库中,我们操作varchar类型的数据时,可以用"",但是不推荐
推荐使用''
3.为什么推荐使用单引号:
因为将来我们是需要用java代码去结合sql语句去操作数据库的
用java代码表示一个sql语句怎么写:
String sql = "INSERT INTO category (cid,cname) VALUES (1,"箱包");"-->不对,双引号没对上
String sql = "INSERT INTO category (cid,cname) VALUES (1,'箱包');"->对的
4.其他添加语句写法:
a.批量添加数据:
insert into 表名(列名,列名) values (数据,数据),(数据,数据),(数据,数据),(数据,数据);
-- insert into 表名(列名,列名) values (数据,数据);
INSERT INTO category (cid,cname) VALUES (1,"箱包");
INSERT INTO category (cid,cname) VALUES (2,'手机');
-- 批量添加
INSERT INTO category (cid,cname) VALUES (3,'电脑'),(4,'相机'),(5,'食品');
INSERT INTO category VALUES (6,'化妆品'),(7,'鞋子'),(8,'服装');
3.2 删除数据
delete from 表名 [where 条件];
java mysql
> >
< <
>= >=
<= <=
!= != <>
/*
delete from 表名;-- 删除表中的所有数据
delete from 表名 [where 条件];
java mysql
> >
< <
>= >=
<= <=
!= != <>
*/
delete from category;
-- 删除cid为1的记录
delete from category where cid = 1;
-- 删除cid>=5的记录
delete from category where cid>=5;
-- 删除cid不等于3的记录
delete from category where cid<>3;
DELETE FROM category WHERE not(cid=3);
3.3 修改数据
update 表名 set 字段名 = 值; -- 将指定的列中的值全部修改了
update 表名 set 字段名 = 值 where 条件 -- 按照指定的条件修改表数据
-- 将cname列中的数据修改成 钱包
update category set cname = '钱包';
-- 将表中的蔬菜改成家具
update category set cname = '家具' where cname = '蔬菜';
-- 将cid为2的改成电脑
update category set cname = '电脑' where cid = 2;
-- 将cid不等于1的cname都改成"涛哥"
update category set cname = '涛哥' where cid != 1;
update category set cname = '涛哥' where cid <> 1;
update category set cname = '涛哥' where not (cid = 1);
第五章.约束
1.主键约束
1.关键字:primary key
2.特点:
a.主键列不能是NULL
b.主键列的数据要唯一,不能重复
3.注意:
我们的每一张表,都应该有一个主键
一个主键可以代表一行数据:
比如:学号可以代表一个学生
身份证号可以代表一个人
1.1.添加方式1:在创建表时,在字段后面直接指定
-- 在创建表的时候直接添加
create table person(
id int primary key,
pname varchar(100),
page int
);
1.2.添加方式2:在constraint约束区域,去指定主键约束
1.什么是constraint域:就是创建表时,最后一个字段和右半个小括号之间的区域
2.格式:[constraint 名称] primary key (字段列表)
3.注意:[constraint 名称]可以省略
create table person(
id int,
pname varchar(100),
page int,
primary key (id)
);
1.3.添加方式3:通过修改表结构的方式
1.格式:ALTER TABLE 表名 ADD [CONSTRAINT 名称] PRIMARY KEY (字段列表)
2.注意:[CONSTRAINT 名称]可以省略不写
create table person(
id int,
pname varchar(100),
page int
);
alter table person add primary key (id);
insert into person (id,pname,page) values (1,'张三',18);
INSERT INTO person (id,pname,page) VALUES (1,'李四',20);-- 错误,因为id为主键,数据不能重复
INSERT INTO person (id,pname,page) VALUES (null,'王五',20);-- 错误,因为id为主键,数据不能为NULL
1.4.联合主键
1.概述:多个列并称为一个主键
2.特点:
多个列中数据不能完全一样
CREATE TABLE persons
(
firstname varchar(255),
lastname varchar(255),
address varchar(255),
city varchar(255)
)
# 要将firstname和lastname设置成联合主键
alter table persons add primary key (firstname,lastname);

1.5.删除主键约束
ALTER TABLE persons DROP PRIMARY KEY->删除主键约束
#ALTER TABLE persons DROP PRIMARY KEY->删除主键约束
alter table persons drop primary key;
2.自增长约束
2.1.基本操作
自动增长列
1.关键字:auto_increment
2.使用:一般和primary key 一起使用
3.注意:
a.主键是能代表一条数据
b.自增长列只能自动维护数据,不能代表一条数据
c.如果一个主键列设置成自增长,那么删除之后,自增长的数据不会重新编号
如果一个主键列没有设置自增长,那么删除之后,数据可以挨着编号
create table category(
cid int primary key auto_increment,
cname varchar(100)
);
-- 添加数据
insert into category (cid,cname) values (3,'家具');
-- 主键都自动维护了,所以我们添加数据时,就不用特意指定主键列了
INSERT INTO category (cname) VALUES ('手机'),('玩具'),('电脑');
truncate table 表名 ->清空表数据
TRUNCATE TABLE `category`;
/*
truncate table 表名 ->清空表数据
*/
DELETE FROM category;
INSERT INTO category (cname) VALUES ('手机'),('玩具'),('电脑');
TRUNCATE TABLE category;
/*
自增长是一个约束,操作起来和其他约束不太一样
如果自增长约束和主键约束合起来使用想删除
先删除自增长约束
再删除主键约束
*/
drop table category;
create table category(
cid int primary key auto_increment,
cname varchar(100)
);
alter table category modify cid int;
alter table category drop primary key;
2.2.truncate和delete区别
在自增长的情况下:
delete之后,自增长列不会重新编号
truncate之后,摧毁表结构,删除表记录,编号将重新开始
3.非空约束
1.关键字:NOT NULL
2.特点:如果一个列设置为非空约束,此列中的数据不能是NULL
create table `category`(
cid int primary key auto_increment,
cname varchar(100) not null
);
/*
非空约束:NOT NULL
被此约束约束的列,数据不能为NULL
category (cname) VALUES ('null') --> 相当于 String s = "null"
category (cname) VALUES ('') --> 相当于 String s = ""
category (cname) VALUES (NULL) --> 相当于 String s = null
*/
CREATE TABLE `category`(
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(100) NOT NULL
);
-- 添加数据
INSERT INTO category (cname) VALUES ('蔬菜');
INSERT INTO category (cname) VALUES ('null');-- 名字为null的字符串
INSERT INTO category (cname) VALUES ('');-- 也是一个字符串,只不过没有内容
INSERT INTO category (cname) VALUES (NULL);-- 这才是我们所说的NULL
4.唯一约束
1.关键字:UNIQUE
2.特点:
a.数据唯一
drop table `persons`;
CREATE TABLE persons
(
id_p int UNIQUE, #唯一约束
lastname varchar(255) NOT NULL, #非空约束
firstname varchar(255),
address varchar(255),
city varchar(255)
)

primary key(主键约束) 和 unique(唯一约束)有啥区别:
相同点:
数据都是唯一的
不同点:
主键约束不能为NULL,能代表一条记录,而且一个表中只能有一个主键
唯一约束,一个表中可以有多个唯一约束,可以为NULL
删除唯一约束:
ALTER TABLE persons DROP INDEX 名称 [名称是CONSTRAINT后面的名称]
第六章.简单查询
1.数据准备
#创建商品表:
create table product(
pid int primary key,
pname varchar(20),
price double
);
INSERT INTO product(pid,pname,price) VALUES(1,'联想',5000);
INSERT INTO product(pid,pname,price) VALUES(2,'海尔',3000);
INSERT INTO product(pid,pname,price) VALUES(3,'雷神',5000);
INSERT INTO product(pid,pname,price) VALUES(4,'JACK JONES',800);
INSERT INTO product(pid,pname,price) VALUES(5,'真维斯',200);
INSERT INTO product(pid,pname,price) VALUES(6,'花花公子',440);
INSERT INTO product(pid,pname,price) VALUES(7,'劲霸',2000);
INSERT INTO product(pid,pname,price) VALUES(8,'香奈儿',800);
INSERT INTO product(pid,pname,price) VALUES(9,'相宜本草',200);
INSERT INTO product(pid,pname,price) VALUES(10,'面霸',5);
INSERT INTO product(pid,pname,price) VALUES(11,'好想你枣',56);
INSERT INTO product(pid,pname,price) VALUES(12,'香飘飘奶茶',1);
INSERT INTO product(pid,pname,price) VALUES(13,'果9',1);
2.简单查询
语法格式:
1.关键字select from where
2.格式:select 列名,列名 from 表名 where 条件
3.注意:
查询出来的结果,是一张表,这张表是一个伪表,是只读的,不能改的
#查询所有的商品.
select * from product;
#查询商品名和商品价格.
select pname,price from product;
/*
别名查询.使用的关键字是as(as可以省略的).表别名:
给表或者列起别名
as 别名
as可以省略
*/
SELECT * FROM product as p;
#别名查询.使用的关键字是as(as可以省略的).列别名:
select pname as `商品名`,price as `价格` from product;
select pname `商品名`,price `价格` from product;
/*
#去掉重复值
关键字:distinct (列名)
*/
select distinct (price) from product;
#查询结果是表达式(运算查询):将所有商品的价格+10元进行显示 取别名.
select pname,price+10 `newPrice` from product;
3.条件查询
| 比较运算符 | < <= = = <> | 大于、小于、大于(小于)等于、不等于 |
|---|---|---|
| BETWEEN …AND… | 显示在某一区间的值(含头含尾) | |
| IN(set) | 显示在in列表中的值,例:in(100,200) 查询1,3,7的商品 in(1,3,7) | |
| LIKE ‘张pattern’ | 模糊查询,Like语句中,% 代表零个或多个任意字符, 代表一个字符, 例如:_first_name like '_a%';_比如:查询姓张的人: like ‘张%’ 查询商品名中带香的商品:like’%香%’ 查询第二个字为想的商品名:like’想%’ 查询商品名为四个字的商品:like’’ |
|
| IS NULL | 判断是否为空 | |
| 逻辑运行符 | and (与) | 多个条件同时成立 全为true,整体才为true |
| or(或) | 多个条件任一成立 有真则真 | |
| not(非) | 不成立,例:where not(salary>100); ! |
/*
格式:select 列名 from 表名 where 条件
*/
#查询商品名称为“花花公子”的商品所有信息:
SELECT * FROM product WHERE pname = '花花公子';
#查询价格为800商品
SELECT * FROM product WHERE price = 800;
#查询价格不是800的所有商品
SELECT * FROM product WHERE price != 800;
SELECT * FROM product WHERE price <> 800;
SELECT * FROM product WHERE NOT(price = 800);
#查询商品价格大于60元的所有商品信息
SELECT * FROM product WHERE price > 60;
#查询商品价格在200到1000之间所有商品
SELECT * FROM product WHERE price >= 200 AND price <= 1000;
SELECT * FROM product WHERE price BETWEEN 200 AND 1000;
SELECT * FROM product WHERE price BETWEEN 1000 AND 200; -- between and 小的在前,大的在后
#查询商品价格是200或800的所有商品
SELECT * FROM product WHERE price = 200 OR price = 800;
SELECT * FROM product WHERE price IN (200,800);
#查询含有'霸'字的所有商品
SELECT * FROM product WHERE pname LIKE '%霸%';
#查询以'香'开头的所有商品
SELECT * FROM product WHERE pname LIKE '香%';
#查询第二个字为'想'的所有商品
SELECT * FROM product WHERE pname LIKE '_想%';
#查询商品名为4个字的商品
SELECT * FROM product WHERE pname LIKE '____';
#查询商品名为NULL的
SELECT * FROM product WHERE pname IS NULL;
#查询商品名不为NULL的
SELECT * FROM product WHERE pname IS NOT NULL;
4.排序查询
1.关键字:order by
2.格式: SELECT * FROM 表名 ORDER BY 排序字段 ASC|DESC;->要指明对哪一列进行排序
asc:升序(默认)
desc:降序
3.注意:
书写的时候order by要写在sql最后面
先查询,还是先排序?
先查询
书写sql语句关键字的顺序
select
from
where
group by
having
order by
执行顺序:
from
where
group by
having
select
order by
先定位到要查询哪个表,然后根据什么条件去查,表确定好了,条件也确定好了,开始利用select查询
查询得出一个结果,在针对这个结果进行一个排序
/*
格式:select 列名 from 表名 order by 排序列名 排序规则
*/
#使用价格排序(降序)
select * from product order by price desc;
#使用价格排序(升序)
select * from product order by price asc;
select * from product order by price;
#显示商品的价格(去重复)(distinct),并排序(降序)
select distinct price from product order by price desc;
5.聚合查询
1.聚合函数:针对于纵向查询的
sum(列名):针对指定的列进行求和
avg(列名):针对指定的列进行求平均值
count(列名):统计指定列不为NULL的记录行数;
max(列名):求指定列中的最大值
min(列名):求指定列中的最小值
2.格式:
select 聚合函数(列名) from 表名 [where 条件]
3.注意:
聚合函数和后面的列名不要加空格
count(列名)->如果指定的列为NULL,不统计
count(1)->都统计 包括NULL
count(0)->都统计 包括NULL
count(*)->都统计 包括NULL
-- 查询product的总条数
select count(pid) from product;
select count(pid) `总条数` from product;
select count(*) `总条数1` from product;
drop table student;
create table student(
sid int,
firstname varchar(100),
lastname varchar(100)
);
-- 扩展
select count(sid) from student;-- 统计不为null的
select count(*) `总条数1` from student;-- 包括null
select count(1) `总条数2` from student;-- 包括null
select count(0) `总条数3` from student;-- 包括null
-- 查询所有商品价格的总和
select sum(price) from product;
-- 查询pid 为 1,3,7的商品价格平均值
select avg(price) `平均价格` from product where pid in (1,3,7);
-- 查询商品的最高价格以及最低价格
select max(price),min(price) from product;
6.分组查询
1.关键字:group by 按照哪一列分组的列名
2.格式:SELECT 字段1,字段2… FROM 表名 GROUP BY 分组字段 HAVING 分组条件;
3.分组的小诀窍:相同的为一组,不同的单独为一组
4.在分组之后做筛选的关键字:having
having后面跟的也是筛选条件,并且是在分组之后进行筛选
5.问题:where和having的区别
where跟在分组之前
having跟在分组之后
6.注意:
分组查询都和聚合函数联合起来使用

-- 求出表中相同商品的价格总和
select pname,sum(price) from product group by pname;
-- 查询相同商品的价格总和 并 排序
/*
按照sql的执行顺序来看,先查询,后排序
我们需要先将结果查询出来,对查询结果(伪表)进行最后的排序
但是查询出来之后价格对应的列名叫sum(price) 所以我们最后排序时,也应该用改变之后的列名
*/
SELECT pname,SUM(price) newprice FROM product GROUP BY pname order by newprice;
-- 查询相同商品的价格总和 再查询价格的总和大于等于2000的
-- 错误,按照sql关键字的书写顺序来看,where关键字应该写在group by 前面
SELECT pname,SUM(price) newprice FROM product GROUP BY pname where newprice >= 2000;
/*
如果按照关键字的书写顺序来看,没啥问题
按照执行顺序来看:执行from 以及 where的时候 select还没执行呢
所以where直接用列(price)的别名,是找不到的,所以报错
*/
SELECT pname,SUM(price) newprice FROM product WHERE newprice >= 2000 GROUP BY pname;
/*
下面的代码能查询出结果来,但是 结果不对 因为果9总和是2000,我们应该将果9也查询出来
那么为啥没有查询出来果9呢?
因为where优先于group by执行,所以先按照原表进行where筛选
由于果9刚开始都没有超过2000的,所以直接筛掉,所以最后结果没有果9->结果不对
*/
SELECT pname,SUM(price) newprice FROM product WHERE price >= 2000 GROUP BY pname;
/*
解决思想:
找一个关键字作为筛选条件
此关键字书写时应该在group by 后面,执行时也要在group by后面
*/
SELECT pname,SUM(price) newprice FROM product GROUP BY pname having newprice >= 2000;
7.分页查询
1.语法
select * from 表名 limit m,n
m:代表起始位置->从0开始
n:每页显示的条数
分页查询中起始位置的计算方式:
(当前页-1)*每页显示条数
-- 后台计算出页码、页数(页大小)
-- 分页需要的相关数据结果分析如下,
-- 注意:下面是伪代码不用于执行
int curPage = 2; -- 当前页数
int pageSize = 5; -- 每页显示数量
int startRow = (curPage - 1) * pageSize; -- 当前页, 记录开始的位置(行数)计算
int totalSize = select count(*) from products; -- 记录总数量
int totalPage = Math.ceil(totalSize * 1.0 / pageSize); -- 总页数
总页数 = (总记录数/每页显示条数)向上取整
select * from product limit 0,5; # 第一页
select * from product limit 5,5; # 第二页
select * from product limit 10,5; # 第三页
select * from product limit 15,5; # 第四页

