数据库基础

第一章.数据库介绍

1.数据库介绍

1.什么是数据库:
  存储数据的仓库,数据库中要创建表,这些表是有特殊的格式,将数据永久性保存起来,对数据可以进行增删改查的操作
2.为什么要学数据库
  a.数组,集合临时存储
  c.IO流,可以将数据放到硬盘上,但是操作数据很麻烦

2.数据库管理系统

1.概述:用于管理和维护数据库以及数据库中的表,以及表中的数据的大型软件
2.作用:对数据库进行统一的管理和维护

image-20210925111324726.png

3.数据库表

1.数据库中要创建很多张表,而表才是我们真正存储数据的地方
2.表的组成部分:
  a.字段名
  b.每一个字段都有固定的数据类型
3.表就类似于一个Java类
    类名---表名
    类的属性---表的每一个字段
    对象---表中的一条记录

4.数据库表和Java类的对应关系

标准的javabean:
  私有属性
  构造
  get/set
  toString

image-20210925113350264.png

第二章.mysql5.7安装

1.mysql5.7版本卸载和安装

1.1.数据库卸载

学习网络编程时,TCP/IP协议程序有服务器端和客户端。mysql这个数据库管理软件是使用TCP/IP协议。我们现在要卸载的是mysql的服务器端,它没有界面。

【计算】-->右键-->【管理】-->【服务】-->【mysql的服务】-->【停止】

1.1.1.方式1:利用控制面板卸载

image-20210913223949724.png

1.1.2.方式2:360卸载

image-20210913224152679.png

image-20210913224203480.png

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

image-20210913224240763.png

或者:

image-20210913224333865-16315442170071.png

image-20210913224400223.png

image-20210913224409108.png

1.2.清除残留文件

1.2.1.正常删除残留文件

如果再次安装不成功,可以卸载后对残余文件进行清理后再安装。

(1)服务目录:mysql服务的安装目录

(2)数据目录:默认在C:\ProgramData\MySQL

如果自己单独指定过数据目录,就找到自己的数据目录,例如:

image-20210913224526333.png

注意:请在卸载前做好数据备份

在操作完以后,需要重启计算机,然后进行安装即可。**如果仍然安装失败,需要继续操作如下步骤

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.清理服务列表中的服务名

image-20210913224834637.png

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

命令:sc  delete  服务名

image-20210913224901975.png

1.2.4.清除原来mysql环境变量

找到path环境变量,将其中关于mysql的环境变量删除,**切记不要全部删除。**

例如:删除  D:\ProgramFiles\mysql\MySQLServer5.7\bin;  这个部分

image-20210913225018139.png

1.3.mysql服务端安装

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

image-20210913225128265.png

  • 在左侧目录中选择MySQL Server 5.7.28 -X64,点击加载到右侧,在选择一下要安装的产品名,在右下角会出现Advanced Options,单击它可以设置安装路径
    image-20210913225519430.png
  • 例如将安装路径数据路径修改到D:\develop\下,点击OK。注意,安装目录避免空格和中文
    image-20210913225527892.png
  • 点击Next下一步
    image-20210913225536327.png
  • 点击Execute执行安装
    有的可能会出现提示需要先安装C动态库等,那就先安装C动态库,没有提示说明操作系统中有你需要的动态库。
    image-20210913225545708.png
    image-20210913225555772.png
  • 安装完成,点击Next下一步
    image-20210913225604355.png
  • 点击Next下一步
    image-20210913225610925.png
  • 点击Next下一步
    image-20210913225618997.png
  • 将MySQL配置类型选择Development Computer开发电脑设置,点击Next下一步
    image-20210913225626998.png
  • 设置MySQL密码,因为管理员用户为root,学习初期建议将MySQL数据库密码也设置为root,设置完成后,点击Next下一步
    image-20210913225635121.png
  • 设置Windows Service 系统服务,设置完毕后点击Next下一步
    image-20210913225643261.png
  • 日志设置,不做任何修改,点击Next下一步
    image-20210913225651416.png
  • 高级设置,不做任何修改,点击Next下一步
    image-20210913225659057.png
  • 点击Execute执行设置
    image-20210913225708803.png
  • 安装完成,点击Finish完成
    image-20210913225719564.png

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_%';

image-20210913231100322.png

6.mysql客户端(可视化工具)安装

例如:Navicat Preminum,SQLyog 等工具

6.1.SQLyog

image-20210913231743884.png

6.2.Navicat

image-20210913231808531.png

第三章.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(长度) 字符类型

image-20210925153154609.png

第四章.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);

1608168337617.png

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)
)

1608171870336.png

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.注意:
  分组查询都和聚合函数联合起来使用

1608195466898.png

-- 求出表中相同商品的价格总和
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;  # 第四页

1608197892937.png