Java EE day03学习总结

今天主要学习聚合函数&表约束

思维导图:

 

一.模糊查询(LIKE)

1.概念:模糊查询是指在一个字段中,进行自定义搜索匹配查询,而不是全内容匹配。

2.模糊查询语法

SELECT * FROM 表名 WHERE 字段名 LIKE ‘查询语法’;

3.MYSQL模糊查询语法:

LIKE

%

_

表示模糊查询

表示为任意多个字符

表示为单个字符

示例:

-- 查询班级当中所有姓马的同学

SELECT * FROM stu WHERE name LIKE '马%';

-- 查询班级当中所有姓马的,且名字在两个字符的同学

SELECT * FROM stu WHERE name LIKE '马_';

-- 查询班级当中所有名字为两个字符的学生

SELECT * FROM stu WHERE name LIKE '__';

-- 查询班级当中,所有名字当中包含化字的学生

SELECT * FROM stu WHERE name LIKE '%化%';

二.聚合查询

1.概念:我们之前所有的查询都是横向查询,都一行一行的进行判断,比如我们要查询所有学生的JAVA成绩的平均分,因为我们每一次的查询结果是一行,就没有办法做到全表的结果查询。这个时候我们就需要使用纵向查询(聚合查询),就是将表的全部数据查出来之后,在进行二次统计。

2.聚合函数的分类

(1)MAX():获取查询后结果的最大值

SELECT MAX(java)  FROM stu; 

(2)MIN():获取查询后结果的最小值

 SELECT MIN(java)  FROM stu; 

(3)AVG():获取查询后结果的平均值

SELECT AVG(java) AS 'JAVA平均分' FROM stu; 

(4)SUM():获取查询后结果的总和值

SELECT SUM(java)  FROM stu; 

(5)COUNT():获取查询后结果的总记录数

方式一:不建议因为这种查询是泛查询,会查询表中的所以记录 数据越多,性能越低

SELECT COUNT(*)  FROM stu;

方式二:建议,一般做统计查询的时候,我们尽量选择非业务主键做为参考,因为主键唯一且必须会存在,单列查询 提高效率。

SELECT COUNT(id)  FROM stu;

        一般我们在使用统计函数的时候,要注意一个问题,使用泛查询(*),和使用列查询(id),是有区别的。

        使用泛查询会记录我们的空值列(NULL)

        使用列查询则不会记录我们的空值列

         如果,我想让列查询,也同样去记录我们的空值列,怎么办呢??

          由于单列统计不计算空值,所以如果需要统计空值 可以使用IFNULL进行空值判断填充

    SELECT COUNT(IFNULL(id,0))  FROM stu; 

(6)聚合函数可以连串使用

    SELECT SUM(java)/COUNT(id)  FROM stu;

 

三.分页查询(LIMIT)

1.概念:一般我们在处理一个查询或者搜索业务的时候,并不会一瞬间将该搜索的内容全部同时展示,因为这种方式会极大的影响用户的体验度,同时会给自己的数据库端和后端以及前端造成极大运算压力,一般我们会将这种业务进行分页处理。

2.分页关键字:LIMIT(MYSQL方言)

    SELECT * FROM 表 LIMIT 参数1,参数2;

    参数1:从第几条数据开始查询(默认从0开始记录)

    参数2:一次查询多少条

代码示例

-- 每次查询2条数据 第一页 1-2

SELECT * FROM stu LIMIT 0,2;

-- 第二页 3-4

SELECT * FROM stu LIMIT 2,2;

-- 第二页 5-6

SELECT * FROM stu LIMIT 4,2;

 

3.分页的计算规则

在一般的实际开发当中,第一个参数决定了真正的页码的切换,所有这个值应该动态
SELECT * FROM stu LIMIT (当前页码-1)*每一页的条数,2;

 

四.排序查询(ORDER BY)

1.概念:在实际的业务开发当中,我们很多其实杂乱的,一般在显示的时候,我们会这一系列具备排序规则的数据进行排序展示。
淘宝的价格从低到高
淘宝的销量从高到底

2.关键字:排序查询主要依赖于ORDER BY关键字,这个关键字可以对数值类型的字段进行降序和升序排列,不会影响数据值 只会影响虚拟表的显示。
ASC:升序(默认)
DESC:降序

3.单列排序(针对一个列进行单词排序)

-- 按照java成绩从低到高进行排序

SELECT * FROM stu ORDER BY java;

-- 按照java成绩从高到低进行排序

SELECT * FROM stu ORDER BY java DESC;

4.组合排序(当第一个列数值一致的时候,可以组合N个列进行第N次排序)

-- 当JAVA成绩一致的时候,则按照id进行第二次排序

SELECT * FROM stu ORDER BY java DESC,id ASC;

 

五.分组查询(GROUP BY)

1.概念:分组查询是指查询后将结果进行分组,分组后可以对每组的数据进行单独的统计。

需要统计每个地区有多少人

错误语法: SELECT address,COUNT(*)FROM stu;

正确语法: SELECT address,COUNT(*)FROM stu GROUP BY address;

-- 分组查询(一旦使用了分组查询就可以配合使用聚合函数,但是这个聚合函数的字段必须是分组字段本身)111

SELECT address,COUNT(*)FROM stu GROUP BY address;

-- 需要统计男女人数的数量

SELECT sex,COUNT(id) FROM stu GROUP BY sex;

-- 需要统计男女人数的数量(不统计为空的数据)

SELECT sex,COUNT(id) FROM stu WHERE sex IS NOT NULL AND sex <> '' GROUP BY sex;

-- 需要统计地区人数大于2个人数的地区

-- 1.查询哪些地区有多少人

-- 2.对这些地区分组

-- 3.多分组进行限制显示

-- 注意:HAVING只能配合GROUP BY使用,而且可以使用统计函数

SELECT address,COUNT(*) FROM stu GROUP BY address HAVING COUNT(*) >= 2;   

2.MYSQL的常用字段类型

  • char(20)
  • varchar(20)
  • int
  • date
  • datetime
  • timestamp

3.char 和 varchar的区别

(1)char是固定字符串,不管你实际存储的数据大小是多少,占用空间仍然char所设定的空间大小
(2)varchar是可变字符串,存储数据的大小有实际存储字符串的大小决定,自由缩放。

4.int 和 int(5)的区别

(1)int的默认长度为11位,实际的存储大小是由你存储的数据决定
(2)int(5),是固定5个长度的容器

5.请问date、datetime、timestamp的区别是什么

(1)date代表的是一个日期,且不包含时间
(2)datetime代表的是一个日期+时间
(3)timestamp代表的是一个当前时间的时间戳

六.表约束

1.概念:所谓的表约束其实就是对表的数据进行限制,保证数据的准确性、有效性、完整性。如果我们给一张设定了指定约束,那么数据在插入的时候违法了我们的约束就可以限制插入。

2.约束的种类

约束名

约束的关键字

默认值约束

default

非空约束

not null

唯一约束

unique

主键约束

primary key(pk)

外键约束

foreign key(fk)

检查约束

check(mysql不支持)

3.默认值约束[DEFAULT]

当给一个字段进行默认值约束的时候,如果这个字段没有数据的插入 则自动填充我们设置好的默认值

CREATE TABLE test(

    name VARCHAR(20),

    sex VARCHAR(20) DEFAULT '男'

);

4.非空约束[NOT NULL]

当给一个字段进行非空约束的时候,如果字段没有数据或者是NULL则无法插入,空字符无法控制

CREATE TABLE test(

    name VARCHAR(20) NOT NULL,

    sex VARCHAR(20)

);

5.唯一值约束[UNIQUE]

当给一个字段设定唯一值约束的是,则这个字段在表中不能出现重复数据;唯一约束是允许插入多个null的,所以唯一约束不能限制null值。

CREATE TABLE test(

    id INT UNIQUE,

    name VARCHAR(20),

    sex VARCHAR(20) 

);

6.主键约束[PRIMARY KEY]

(1)主键约束的作用:其实就是用于来标识数据库数据的每一条记录。

(2)主键一般设置在哪个字段?

主键的设置一般不使用任何的业务字段,所以在设计表的时候,我们通常会建立一个ID的字段,这个字段没有任何的业务意图,主要是给我们数据库和程序员使用的,不直接面对用户,所以这个ID是没有任何的实际含义,只要不唯一、非空就可以,其作用是标识每一条数据的状态。

(3)主键约束语法

CREATE TABLE test(

    id INT PRIMARY KEY, -- 主键约束

);

(4)主键约束的限制

.可以限制字段不为空

.可以限制字段唯一

.一张表只能存在一个主键

.我们可以在创建主键之后继续删除和添加(但是不建议)
#### 在已创建表中添加主键约束

ALTER TABLE 表名 ADD PRIMARY KEY(主键字段);

ALTER TABLE test ADD PRIMARY KEY(id);

在已创建表中删除主键约束

ALTER TABLE 表名 DORP PRIMARY KEY;

ALTER TABLE test ADD PRIMARY KEY;

7.自增长约束[auto_increment]

主键情况下,我们手动添加很有可能造成数据重复,这个时候我们可以使用自增长约束,每一次插入数据的时候,数据库自动在主键的基础上+1,保证数据唯一值.

(1)自增长约束语法

CREATE TABLE test(

    id INT PRIMARY KEY  auto_increment, -- 自增长约束

);

(2)自增长约束注意问题:

<1>自增长约束的字段类型必须为整数类型

<2>自增长字段一般为主键字段

<3>自增长字段从0开始增长,如果需要修该增长开始位置,可以修该为auto_increment = xxx;

8.外键约束

(1)外键约束的作用:

外键约束一般也只能存在两张相关联的表的情况下,对主表(主键表)和从表(外键表)进行关联约束.

(2)什么情况下才会有两张以上的表呢?

例如下图的表数据:

 

发现几个问题:

  1. 员工对应的部门数据极度冗余
  2. 会损耗查询效率,浪费内存
  3. 不利于维护,万一冗余字段发生了变化,维护成本极高。

如何解决?

单独将部门拆分出来,然后生成一个部门表,员工表和部门表产生关联。

阅读如下代码

-- 创建员工表

CREATE TABLE emp(

    id INT PRIMARY KEY auto_increment,

    name VARCHAR(20),

    dept_id INT

)

-- 创建一个部门表

CREATE TABLE dept(

    id INT PRIMARY KEY auto_increment,

    name VARCHAR(20)

);

INSERT INTO dept(name) VALUES ('基础平台架构部'),('基础平台测试部');

 

INSERT INTO emp(name,dept_id) VALUES ('李彦宏',4);

 

我们现在新增数据,在部门的字段插入一个ID为4的部门
但是,实际上公司根本就没有这个部门(如果实际业务当中,也算非常严重的事故)
这个时候,我们就应该使用两张表同时限制,主键限制外键

如何限制?

语法:

CONSTRAINT 外键名 FOREIGN KEY(子表外键字段名) REFERENCES 主表名(主表主键字段名)

 

CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES dept(id)

实例代码:

CREATE TABLE emp(

        id INT PRIMARY KEY auto_increment,

        name VARCHAR(20),

        dept_id INT,

        CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES dept(id)

);

 

 

INSERT INTO emp (name,dept_id ) VALUES('toobug',1),

('王自如',2),

('马化腾',1),

('雷军',2),

('求伯君',2),

('马云',1);

 

INSERT INTO emp(name,dept_id) VALUES ('李彦宏',4); -- 增加违反了外界约束

UPDATE emp SET dept_id = 5 WHERE id = 1; -- 修改违反外键约束

DELETE FROM dept; -- 因为部门表已经存在了外键数据,如果需要删除则需要先情况所有管理的外键数据。

 

9.外键在什么情况下,会进行约束

(1)插入数据:往从表插入主表不存在的数据,外键会进行约束

(2)修改数据:往从表修改主表不存在的数据,外键会进行约束

(3)修改数据:删除主表数据,存在外键关联的时候,外键会进行约束

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值