黑马Tlias JavaWeb后台管理系统 05 数据库基础

前言

web分为MVC三层,但是项目开发中Dao解析的数据一般不会用文本文件形式储存,而是储存在数据库。

数据库:DataBase,DB。存储和管理数据的仓库。

数据库管理系统:DataBase Management System,DBMS。操作和管理数据库的大型软件。

SQL:Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准。


主流数据库

  • Oracle:大型的收费数据库,Oracle公司产品,价格昂贵。(通常是不差钱的公司会选择使用这个数据库)
  • MySQL:开源免费的中小型数据库,后来Sun公司收购了MySQL,而Oracle又收购了Sun公司。目前Oracle推出两个版本的Mysql:社区版(开源免费)、商业版(收费)。
  • SQL Server:Microsoft 公司推出的收费的中型数据库,C#、.net等语言常用。
  • PostgreSQL:开源免费的中小型数据库。
  • DB2:IBM公司的大型收费数据库产品。
  • SQLLite:嵌入式的微型数据库。Android内置的数据库采用的就是该数据库。
  • MariaDB:开源免费的中小型数据库。是MySQL数据库的另外一个分支、另外一个衍生产品,与MySQL数据库有很好的兼容性。

SQL概述

安装与连接

官网:https://dev.mysql.com/

安装:https://downloads.mysql.com/archives/community/

连接

mysql -u用户名 -p密码 [-h数据库服务器的IP地址 -P端口号]

mysql -u root -p password

数据模型

关系型数据库(RDBMS)

建立在关系模型的基础上,由多张相互连接的二维表组成的数据库。

二维表:使用表存储数据,使用SQL语言操作数据,格式统一,便于维护,可用于复杂查询。

:::info
基于二维表存储数据的数据库就称为关系型数据库,如上文提到的主流数据库。

后面要学习的Redis就是非关系型数据库,不是基于二维表存储数据的。

:::

数据模型

SQL语句

按照功能分为四大类:

分类全称说明
DDLData Definition Language数据定义语言,用来定义数据库对象(数据库,表,字段)
DMLData Manipulation Language数据操作语言,用来对数据库表中的数据进行增删改
DQLData Query Language数据查询语言,用来查询数据库中表的记录
DCLData Control Language数据控制语言,用来创建数据库用户、控制数据库的访问权限

DDL

定义数据库对象(数据库、表)

常见操作:查询、创建、使用、删除。

数据库操作

-- 查询数据库
show databases; -- 查询所有数据库
select database(); -- 查询当前数据库
-- 创建数据库
create database [ if not exists ] 数据库名  [default charset utf8mb4];
create database itcast;
create database if not exists itcast; -- 同一个数据库服务器不能创建两个相同的数据库
-- 使用数据库
use 数据库名 ;
use itcast;
-- 删除数据库
drop database [ if exists ] 数据库名 ;
drop database if exists itcast; -- itcast数据库存在时删除

图形化工具

DataGrip是JetBrains旗下的一款数据库管理工具,是管理和开发MySQL、Oracle、PostgreSQL的理想解决方案。

官网: https://www.jetbrains.com/zh-cn/datagrip/

IDEA已经集成了DataGrip,所以我们可以直接使用IDEA来操作MySQL数据库。

右侧选择Database,添加Data Source,选择MySQL

默认本地,输入用户名和密码

下载连接数据库的驱动

选择展示所有数据库

表操作

创建

创建表

create table  表名(
        字段1  字段1类型 [约束]  [comment  字段1注释 ],
        字段2  字段2类型 [约束]  [comment  字段2注释 ],
        ......
        字段n  字段n类型 [约束]  [comment  字段n注释 ] 
) [ comment  表注释 ] ;

create table tb_user (
    id int comment 'ID,唯一标识',   # id是一行数据的唯一标识(不能重复)
    username varchar(20) comment '用户名',
    name varchar(10) comment '姓名',
    age int comment '年龄',
    gender char(1) comment '性别'
) comment '用户表';

空表

可视化操作

+添加 ↑提交

id可以重复,因为我们没有在数据库层面去限制字段存储的数据。

约束

保证数据库当中数据的正确性、有效性和完整性

约束描述关键字
非空约束限制该字段值不能为nullnot null
唯一约束保证字段的所有数据都是唯一、不重复的unique
主键约束主键是一行数据的唯一标识,要求非空且唯一primary key
默认约束保存数据时,如果未指定该字段值,则采用默认值default
外键约束让两张表的数据建立连接,保证数据的一致性和完整性foreign key

案例:

在上述的表结构中:

  • id 是一行数据的 唯一标识
  • username 用户名字段是非空唯一
  • name 姓名字段是不允许存储空值
  • gender 性别字段是有默认值,默认为男

创建表

create table tb_user (
    id int primary key comment 'ID,唯一标识', 
    username varchar(20) not null unique comment '用户名',
    name varchar(10) not null comment '姓名',
    age int comment '年龄',
    gender char(1) default '男' comment '性别'
) comment '用户表';

主键约束,不能重复

唯一约束,不能重复

发现id字段下存储的值,由自己来维护会很麻烦(必须保证值的唯一性)。

MySQL提供了一个关键字:auto_increment(自动增长)。

:::info
每次插入新的行记录时,自动生成id字段(主键)下的值

数据列是一个正数序列开始增长(从1开始自增)

:::

create table tb_user (
    id int primary key auto_increment comment 'ID,唯一标识', #主键自动增长
    username varchar(20) not null unique comment '用户名',
    name varchar(10) not null comment '姓名',
    age int comment '年龄',
    gender char(1) default '男' comment '性别'
) comment '用户表';

未提交前,id显示

提交后

数据类型
  1. 时间类型
类型大小有符号(SIGNED)范围无符号(UNSIGNED)范围描述
TINYINT1byte(-128,127)(0,255)小整数值
SMALLINT2bytes(-32768,32767)(0,65535)大整数值
MEDIUMINT3bytes(-8388608,8388607)(0,16777215)大整数值
INT/INTEGER4bytes(-2147483648,2147483647)(0,4294967295)大整数值
BIGINT8bytes(-263,263-1)(0,2^64-1)极大整数值
FLOAT4bytes(-3.402823466 E+38,3.402823466351 E+38)0 和 (1.175494351 E-38,3.402823466 E+38)单精度浮点数值
DOUBLE8bytes(-1.7976931348623157 E+308,1.7976931348623157 E+308)0 和 (2.2250738585072014 E-308,1.7976931348623157 E+308)双精度浮点数值
DECIMAL依赖于M(精度)和D(标度)的值依赖于M(精度)和D(标度)的值小数值(精确定点数)

示例

-- 年龄 不会出现负数,并且不会太大
age tinyint unsigned
-- 分数 总分100分,最多出现一位小数
score double
  1. 字符串类型
类型大小描述
CHAR0-255 bytes定长字符串(需要指定长度)
VARCHAR0-65535 bytes变长字符串(需要指定长度)
TINYBLOB0-255 bytes不超过255个字符的二进制数据
TINYTEXT0-255 bytes短文本字符串
BLOB0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据
LONGTEXT0-4 294 967 295 bytes极大文本数据

char与varchar都可以描述字符串,char是定长字符串,制定多长就占用多少个字符,和字段值的长度无关;varchar是变长字符串,指定长度为最大占用长度。相对来说,char的性能会更高一些。

示例:

-- 用户名 长度不定,最长不会超过50
username varchar(50)
-- 手机号 固定长度为11
phone char(11)
  1. 日期时间类型
类型大小范围格式描述
DATE31000-01-01 至 9999-12-31YYYY-MM-DD日期值
TIME3-838:59:59 至 838:59:59HH:MM:SS时间值或持续时间
YEAR11901 至 2155YYYY年份值
DATETIME81000-01-01 00:00:00 至 9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:01 至 2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS混合日期和时间值,时间戳

示例:

-- 生日 只需要年月日
birthday date;
-- 创建时间 精确到时分秒
createtime datetime;
表结构设计

需求:根据产品原型/需求创建表

列表展示

新增员工

需求说明及字段限制

create table emp(
    id int unsigned primary key auto_increment comment 'ID,主键',
    username varchar(20) not null unique comment '用户名',
    password varchar(32) not null comment '密码',
    name varchar(10) not null comment '姓名',
    gender tinyint unsigned not null comment '性别, 1:男, 2:女',
    phone char(11) not null unique comment '手机号',
    job tinyint unsigned comment '职位, 1:班主任,2:讲师,3:学工主管,4:教研主管,5:咨询师',
    salary int unsigned comment '薪资',
    image varchar(255) comment '头像',
    entry_date date comment '入职日期',
    create_time datetime comment '创建时间',
    update_time datetime comment '修改时间'
) comment '员工表';

设计流程:

  1. 阅读页面原型以及需求文档
  2. 确定原型字段(类型、长度限制、约束)
  3. 再增加表设计所需要的业务基础字段(id、create_time、update_time)
其他操作
-- 查询
show tables; -- 查询当前数据库的所有表
desc 表名 ; -- 查看指定的表结构
show create table 表名 ; -- 查询指定表的建表语句

-- 修改
alter table 表名 modify  字段名  新数据类型(长度); -- 修改字段类型
-- 比如: 修改qq字段的字段类型,将其长度由11修改为13
alter table tb_emp modify qq varchar(13) comment 'QQ号码';

-- 修改字段名,字段类型
alter table 表名 change  旧字段名  新字段名  类型(长度)  [comment 注释]  [约束];
-- 比如: 修改qq字段名为 qq_num,字段类型varchar(13)
alter table tb_emp change qq qq_num varchar(13) comment 'QQ号码';

-- 删除
-- 删除字段
alter table 表名 drop 字段名;
-- 比如: 删除tb_emp表中的qq_num字段
alter table tb_emp drop qq_num;

-- 修改表名
rename table 表名 to  新表名;
-- 比如: 将当前的emp表的表名修改为tb_emp
rename table emp to tb_emp;

-- 删除表
drop  table [ if exists ]  表名;
-- 比如:如果tb_emp表存在,则删除tb_emp表
drop table if exists tb_emp;  -- 在删除表时,表中的全部数据也会被删除。

DML

增加 insert

语法
-- 向指定字段添加数据
insert into 表名 (字段名1, 字段名2) values (1,2);
-- 全部字段添加数据
insert into 表名 values (1,2, ...);
-- 批量添加数据(指定字段)
insert into 表名 (字段名1, 字段名2) values (1,2), (1,2);
-- 批量添加数据(全部字段)
insert into 表名 values (1,2, ...), (1,2, ...);
案例
  1. 向emp表的某些字段中插入数据
-- 因为设计表时create_time, update_time两个字段不能为NULL,所以也做为要插入的字段
insert into emp(username, name, gender, phone, create_time, update_time)
values ('wuji', '张无忌', 1, '13309091231', now(), now());
  1. 向emp表的所有字段插入数据
insert into emp2(id, username, password, name, gender, phone, job, salary, image, entry_date, create_time, update_time)
                  values (1,'shinaian','123456','施耐庵',1,'13309090001',4,15000,'1.jpg','2000-01-01',now(),now());
  1. 批量向emp表的某些字段插入数据
insert into emp(username, name, gender, phone, create_time, update_time)
values ('Tom1', '汤姆1', 1, '13309091231', now(), now()),
       ('Tom2', '汤姆2', 1, '13309091232', now(), now());

:::info

  1. 字段的顺序与值的顺序一一对应
  2. 字符串和日期型数据应该包含在引号中
  3. 插入的数据大小要符合字段的规定范围

:::

修改 update

语法
update 表名 set 字段名1 =1 , 字段名2 =2 , .... [where 条件] ;
案例
  1. 更新 id=1 的员工的姓名name为’张三’
update emp set name='张三', update_time=now() where id=1;
  1. 将表中所有员工的入职日期更新为’2010-01-01’
update emp set entry_date='2010-01-01', update_time=now();

:::info

  • 没有where限制条件则会修改整张表的数据
  • 一般要同时修改update_time,修改为当前操作时间

:::

删除delete

语法
delete from 表名  [where  条件] ;
案例
delete from emp where id = 1; -- 删除id=1的员工
delete from tb_emp; -- 删除所有员工

DQL

介绍

SELECT

语法

SELECT
        字段列表
FROM
        表名列表
WHERE
        条件列表
GROUP  BY
        分组字段列表
HAVING
        分组后条件列表
ORDER BY
        排序字段列表
LIMIT
        分页参数

准备测试数据

create table emp(
    id int unsigned primary key auto_increment comment 'ID,主键',
    username varchar(20) not null unique comment '用户名',
    password varchar(32) not null comment '密码',
    name varchar(10) not null comment '姓名',
    gender tinyint unsigned not null comment '性别, 1:男, 2:女',
    phone char(11) not null unique comment '手机号',
    job tinyint unsigned comment '职位, 1:班主任,2:讲师,3:学工主管,4:教研主管,5:咨询师',
    salary int unsigned comment '薪资',
    image varchar(300) comment '头像',
    entry_date date comment '入职日期',
    create_time datetime comment '创建时间',
    update_time datetime comment '修改时间'
) comment '员工表';


-- 准备测试数据
INSERT INTO emp(id, username, password, name, gender, phone, job, salary, image, entry_date, create_time, update_time)
VALUES (1,'shinaian','123456','施耐庵',1,'13309090001',4,15000,'1.jpg','2000-01-01','2024-04-11 16:35:33','2024-04-11 16:35:35'),
     (2,'songjiang','123456','宋江',1,'13309090002',2,8600,'2.jpg','2015-01-01','2024-04-11 16:35:33','2024-04-11 16:35:37'),
     (3,'lujunyi','123456','卢俊义',1,'13309090003',2,8900,'3.jpg','2008-05-01','2024-04-11 16:35:33','2024-04-11 16:35:39'),
     (4,'wuyong','123456','吴用',1,'13309090004',2,9200,'4.jpg','2007-01-01','2024-04-11 16:35:33','2024-04-11 16:35:41'),
     (5,'gongsunsheng','123456','公孙胜',1,'13309090005',2,9500,'5.jpg','2012-12-05','2024-04-11 16:35:33','2024-04-11 16:35:43'),
     (6,'huosanniang','123456','扈三娘',2,'13309090006',3,6500,'6.jpg','2013-09-05','2024-04-11 16:35:33','2024-04-11 16:35:45'),
     (7,'chaijin','123456','柴进',1,'13309090007',1,4700,'7.jpg','2005-08-01','2024-04-11 16:35:33','2024-04-11 16:35:47'),
     (8,'likui','123456','李逵',1,'13309090008',1,4800,'8.jpg','2014-11-09','2024-04-11 16:35:33','2024-04-11 16:35:49'),
     (9,'wusong','123456','武松',1,'13309090009',1,4900,'9.jpg','2011-03-11','2024-04-11 16:35:33','2024-04-11 16:35:51'),
     (10,'lichong','123456','林冲',1,'13309090010',1,5000,'10.jpg','2013-09-05','2024-04-11 16:35:33','2024-04-11 16:35:53'),
     (11,'huyanzhuo','123456','呼延灼',1,'13309090011',2,9700,'11.jpg','2007-02-01','2024-04-11 16:35:33','2024-04-11 16:35:55'),
     (12,'xiaoliguang','123456','小李广',1,'13309090012',2,10000,'12.jpg','2008-08-18','2024-04-11 16:35:33','2024-04-11 16:35:57'),
     (13,'yangzhi','123456','杨志',1,'13309090013',1,5300,'13.jpg','2012-11-01','2024-04-11 16:35:33','2024-04-11 16:35:59'),
     (14,'shijin','123456','史进',1,'13309090014',2,10600,'14.jpg','2002-08-01','2024-04-11 16:35:33','2024-04-11 16:36:01'),
     (15,'sunerniang','123456','孙二娘',2,'13309090015',2,10900,'15.jpg','2011-05-01','2024-04-11 16:35:33','2024-04-11 16:36:03'),
     (16,'luzhishen','123456','鲁智深',1,'13309090016',2,9600,'16.jpg','2010-01-01','2024-04-11 16:35:33','2024-04-11 16:36:05'),
     (17,'liying','12345678','李应',1,'13309090017',1,5800,'17.jpg','2015-03-21','2024-04-11 16:35:33','2024-04-11 16:36:07'),
     (18,'shiqian','123456','时迁',1,'13309090018',2,10200,'18.jpg','2015-01-01','2024-04-11 16:35:33','2024-04-11 16:36:09'),
     (19,'gudasao','123456','顾大嫂',2,'13309090019',2,10500,'19.jpg','2008-01-01','2024-04-11 16:35:33','2024-04-11 16:36:11'),
     (20,'ruanxiaoer','123456','阮小二',1,'13309090020',2,10800,'20.jpg','2018-01-01','2024-04-11 16:35:33','2024-04-11 16:36:13'),
     (21,'ruanxiaowu','123456','阮小五',1,'13309090021',5,5200,'21.jpg','2015-01-01','2024-04-11 16:35:33','2024-04-11 16:36:15'),
     (22,'ruanxiaoqi','123456','阮小七',1,'13309090022',5,5500,'22.jpg','2016-01-01','2024-04-11 16:35:33','2024-04-11 16:36:17'),
     (23,'ruanji','123456','阮籍',1,'13309090023',5,5800,'23.jpg','2012-01-01','2024-04-11 16:35:33','2024-04-11 16:36:19'),
     (24,'tongwei','123456','童威',1,'13309090024',5,5000,'24.jpg','2006-01-01','2024-04-11 16:35:33','2024-04-11 16:36:21'),
     (25,'tongmeng','123456','童猛',1,'13309090025',5,4800,'25.jpg','2002-01-01','2024-04-11 16:35:33','2024-04-11 16:36:23'),
     (26,'yanshun','123456','燕顺',1,'13309090026',5,5400,'26.jpg','2011-01-01','2024-04-11 16:35:33','2024-04-11 16:36:25'),
     (27,'lijun','123456','李俊',1,'13309090027',5,6600,'27.jpg','2004-01-01','2024-04-11 16:35:33','2024-04-11 16:36:27'),
     (28,'lizhong','123456','李忠',1,'13309090028',5,5000,'28.jpg','2007-01-01','2024-04-11 16:35:33','2024-04-11 16:36:29'),
     (29,'songqing','123456','宋清',1,'13309090029',5,5100,'29.jpg','2020-01-01','2024-04-11 16:35:33','2024-04-11 16:36:31'),
     (30,'liyun','123456','李云',1,'13309090030',NULL,NULL,'30.jpg','2020-03-01','2024-04-11 16:35:33','2024-04-11 16:36:31');

基本查询

语法

select 字段1, 字段2, 字段3 from  表名; -- 查询多个字段
select *  from  表名; -- 查询所有字段 通配符
select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ]  from  表名; -- 设置别名
select distinct 字段列表 from  表名; -- 去除重复记录

案例

select name,entry_date from emp; -- 查询指定字段
select * from emp; -- 查询所有字段

:::info
*号代表查询所有字段,在实际开发中尽量少用(不直观,影响效率)

:::

-- 方式1:
select name AS 姓名, entry_date AS 入职日期 from emp;

-- 方式2: 别名中有特殊字符时,使用''或""包含
select name AS '姓 名', entry_date AS '入职日期' from emp;

-- 方式3:
select name AS "姓名", entry_date AS "入职日期" from emp;
select distinct job from emp; -- 查询已有的员工关联了哪几种岗位

条件查询

语法

select  字段列表  from   表名   where   条件列表 ; -- 条件列表:意味着可以有多个条件
比较运算符功能
>大于
>=大于等于
<小于
<=小于等于
=等于
<> 或 !=不等于
between … and …在某个范围之内(含最小、最大值)
in(…)在in之后的列表中的值,多选一
like 占位符模糊匹配(_匹配单个字符, %匹配任意个字符)
is null是null
逻辑运算符功能
and 或 &&并且 (多个条件同时成立)
or 或
not 或 !非 , 不是

案例:

查询姓名为’杨逍’的员工

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where name = '杨逍'; -- 字符串使用''或""包含

查询薪资小于等于5000的员工信息

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where salary <=5000;

查询没有分配职位的员工信息

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where job is null ;

查询有职位的员工信息

:::info
查询为NULL的数据时,不能使用= 或 !=,要使用is null 或 is not null关键字

:::

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where job is not null ;

查询密码不等于’123456’的员工信息

-- 方式1:
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where password <> '123456';
-- 方式2:
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where password != '123456';

查询入职日期在某个时间段内的员工信息

-- 方式1:
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where entry_date >= '2000-01-01' and entry_date <= '2010-01-01';

-- 方式2: between...and
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where entry_date between '2000-01-01' and '2010-01-01';
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where entry_date between '2000-01-01' and '2010-01-01';
      and gender = 2; -- 性别限制为女

查询某些职位对应的员工信息

-- 方式1:使用or连接多个条件
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where job=2 or job=3 or job=4;

-- 方式2:in关键字
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where job in (2,3,4);

查询 姓名 为两个字的员工信息

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where name like '__';  # 通配符 "_" 代表任意1个字符

查询 姓张的员工信息

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where name like '张%'; # 通配符 "%" 代表任意个字符(0个 ~ 多个)

查询 姓名 中包含 二 的员工信息

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where name like '%二%'; # 通配符 "%" 代表任意个字符(0个 ~ 多个)

聚合函数

将一列的数据进行计算,然后返回一个结果值。

函数功能
count统计数量
max最大值
min最小值
avg平均值
sum求和

:::info
聚合函数会忽略空值,对NULL值不作为统计

:::

  • count:指定列中有null值的行不会被统计在其中
  • sum:计算指定列的数值和,如果不是数值类型,那么计算结果为0

案例:

统计该企业员工数量

-- count(字段)
select count(id) from emp;-- 结果:30
select count(job) from emp;-- 结果:29 (聚合函数对NULL值不做计算)

-- count(常量)
select count(0) from emp;
select count('A') from emp;
-- 这里'A'被视为一个非空值,并统计所有非空值的行

-- count(*)  推荐此写法(MySQL底层进行了优化)
select count(*) from emp;

统计薪资

select avg(salary) from emp; -- 平均薪资
select min(salary) from emp; -- 最低薪资
select max(salary) from emp; -- 最高薪资
select sum(salary) from emp; -- 薪资总和

分组查询

语法

select  字段列表  from  表名  [where 条件]  group by 分组字段名  [having 分组后过滤条件];

案例:

根据性别分组,统计男员工和女员工的数量

select gender, count(*)
from emp
group by gender; -- 按照gender字段进行分组(gender字段下相同的数据归为一组)

查询入职时间在某个时间点以前的员工,并对结果根据职位分组,获取员工数量大于等于2的职位

select job, count(*)
from emp
where entry_date <= '2015-01-01'   -- 分组前条件
group by job                      -- 按照job字段分组
having count(*) >= 2;             -- 分组后条件

:::info

  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
  • 执行顺序:where > 聚合函数 > having

:::

:::info
where与having的区别

  • 执行时机不同:where是分组之前进行过滤,不满足条件不参与分组,having是分组之后对结果进行过滤
  • 判断条件不同:where不能对聚合函数进行判断,而having可以

:::

排查查询

语法

select  字段列表  
from   表名   
[where  条件列表] 
[group by  分组字段 ] 
order  by  字段1  排序方式1 , 字段2  排序方式2;

排序方式:

ASC:升序(默认值)

DESC:降序

案例:

根据入职时间,对员工进行升序排序

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
order by entry_date ASC; -- 按照entrydate字段下的数据进行升序排序

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
order by  entry_date; -- 默认就是ASC(升序)

根据入职时间,对员工进行降序排序

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
order by entry_date DESC; -- 按照entrydate字段下的数据进行降序排序

根据入职时间对公司的员工进行升序排序,入职时间相同,再按照更新时间进行降序排序

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
order by entry_date ASC , update_time DESC;

:::info
多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序

:::

分页查询

语法:

select  字段列表  from  表名  limit  起始索引, 查询记录数 ;

案例:

从起始索引0开始查询员工数据,每页展示5条记录

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
limit 0 , 5; -- 从索引0开始,向后取5条记录

查询第一页员工数据,每页展示5条记录

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
limit 5; -- 如果查询的是第1页数据,起始索引可以省略,直接简写为:limit 条数

查询第二页员工数据,每页展示5条记录

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
limit 5 , 5; -- 从索引5开始,向后取5条记录

查询第三页员工数据,每页展示5条记录

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
limit 10 , 5; -- 从索引10开始,向后取5条记录

:::info

  • 起始索引从0开始。计算公式:起始索引 = (查询页码 -1)* 每页显示记录数
  • 分页查询是数据库的方言,不同数据库有不同的实现,MySQL中是LIMIT
  • 如果查询的是第一页数据,起始索引可以省略

:::

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值