Day33

Day33

SQL-续

数据类型

tinyint、int、unsigned、float、double、decimal、char、varchar、BLOB、LONGBLOB、TEXT、LONGTEXT、date、time、datetime、timestamp、year

# 数据类型# 整数类型 -------------------------------------------------------------
# tinyint - 1字节
# int - 4字节
# 经验:存储状态码可以选择tinyint,没有特殊要求存储整数可以选择int# INT(3):取值范围是-2147483648~2147483647,数据不满3位就用0填充
# unsigned - 无符号(不满存负数)
# zerofill - 0填充
CREATE TABLE user (id int(3) PRIMARY KEY auto_increment,name varchar(3) ,age int(3) unsigned zerofill
)# 浮点类型 -------------------------------------------------------------
# FLOAT
# DOUBLE
# DECIMAL:以字符串形式存储的小数
# 经验:因为FLOAT和DOUBLE可能会失去精度,所以小数一般使用DECIMAL# 字符串类型 -------------------------------------------------------------# CHAR(32):定长字符串,比如:存储"abc"会开辟32个字符的空间存储数据
# VARCHAR(32):变长字符串,比如:存储"abc"会开辟3个字符的空间存储数据
# 32:MySQL5.0之前为字节单位,之后为字符单位# BLOB:存储二进制数据
# LONGBLOB:存储极长的二进制数据
# 经验:存储二进制数据的技术叫做BLOB,就说明MySQL可以存储二进制文件(音频、视频、图片...)# TEXT:存储纯文本数据
# LONGTEXT:存储极长的纯文本数据
# 经验:存储纯文本数据的技术叫做CLOB,就说明MySQL可以存储纯文本文件# 字符串类型 -------------------------------------------------------------# date : 2024-06-05
# time : 09:46:30
# datetime :2024-06-05 09:46:30
# timestamp:时间戳
# year : 2024# UPDATE CURRENT_TIMESTAMP - 数据行修改数据后,自定更新时间戳
CREATE TABLE user (id int(3) PRIMARY KEY  AUTO_INCREMENT,name varchar(3) COLLATE utf8mb4_general_ci DEFAULT NULL,age int(3) unsigned zerofill DEFAULT NULL,xxx timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
)

约束

理解:对于数据的限制

# 约束
# 理解:对于数据的限制# 主键约束 ----------------------------------------------------------------------------------
# 理解:唯一约束+非空约束,该列上的数据不能重复,且不能为null# 添加主键约束 - 方式一
CREATE TABLE user(username VARCHAR(32) PRIMARY KEY,password VARCHAR(32),name VARCHAR(32),sex VARCHAR(32),age INT(3),phone VARCHAR(32)
)# 添加主键约束 - 方式二
CREATE TABLE user(username VARCHAR(32),password VARCHAR(32),name VARCHAR(32),sex VARCHAR(32),age INT(3),PRIMARY KEY(username,password)
)# 删除主键约束
ALTER TABLE user DROP PRIMARY KEY;# 唯一约束 ----------------------------------------------------------------------------------
# 理解:该列上的数据不能重复,但可以为null# 添加唯一约束
ALTER TABLE user ADD UNIQUE(phone);# 删除唯一约束
ALTER TABLE user DROP INDEX phone;# 非空约束 ----------------------------------------------------------------------------------
# 理解:该列上的数据不能为null,但可以重复# 添加非空约束
ALTER TABLE user MODIFY name VARCHAR(32) NOT NULL;# 删除非空约束
ALTER TABLE user MODIFY name VARCHAR(32) NULL;# 添加默认值
ALTER TABLE user MODIFY password VARCHAR(32) DEFAULT("000000");# 外键约束 ----------------------------------------------------------------------------------
# 理解:约束两个字段的参照完整性# 添加外键约束
ALTER TABLE user ADD FOREIGN KEY(t_id) REFERENCES type(id);
# 删除外键约束(外键名使用show create table user查询)
ALTER TABLE USER DROP FOREIGN KEY user_ibfk_1;
# 经验:在项目中不使用外键约束,因为效率低

索引

主键索引、唯一索引、普通索引、全文索引、面试题

# 索引
# 理解:索引类似于一本书的目录,让查询更快# 主键索引 ----------------------------------------------------------------------------------
# 理解:主键作为约束,让字段上的数据不能重复且不能为空;主键作为索引,字段作为查询条件会更快# 添加主键索引 - 方式一
CREATE TABLE user(username VARCHAR(32) PRIMARY KEY,password VARCHAR(32),name VARCHAR(32),sex VARCHAR(32),age INT(3),phone VARCHAR(32)
)# 添加主键索引 - 方式二
CREATE TABLE user(username VARCHAR(32),password VARCHAR(32),name VARCHAR(32),sex VARCHAR(32),age INT(3),PRIMARY KEY(username,password)
)# 删除主键索引
alter table user drop primary key;# 唯一索引 ----------------------------------------------------------------------------------
# 理解:唯一作为约束,让字段上的数据不能重复;唯一作为索引,字段作为查询条件会更快# 添加唯一索引
alter table user add unique(phone);# 删除唯一索引
alter table user drop index phone;# 普通索引 ----------------------------------------------------------------------------------
# 理解:普通索引对于数据没有约束,作为索引,字段作为查询条件会更快# 添加普通索引
ALTER TABLE user ADD INDEX(name);# 删除普通索引 
drop index name on user;# 全文索引 ----------------------------------------------------------------------------------# 添加全文索引
# ngram - 解析器(中文、日文、函数)
ALTER TABLE news ADD FULLTEXT(info) WITH PARSER ngram;# 查询数据
SELECT * FROM news WHERE MATCH(info) against('胡歌很帅');# 删除全文索引 
drop index info on news;# ----------------------------------------------------------------------------------# 索引的数据结构?
# B+Tree# 索引的优缺点?
# 优点:索引字段作为查询条件会更快
# 缺点:添加、删除数据时,索引结构会发生改变
# 解决方案:少量的添加和删除就不管,批量添加和删除之前把索引删除掉,等操作完成之后再加上索引# 索引的分类
# 聚簇索引/聚集索引:主键索引
# 非聚簇索引/非聚集索引:唯一索引、普通索引、全文索引# 聚簇索引 和 非聚簇索引的区别
# 聚簇索引:叶子节点存储的是数据行(效率高)
# 非聚簇索引:叶子节点存储的是数据行的地址# 索引失效的失效的情况
# 1.最短路径算法
# 2.最左匹配原则
# 3.OR
# 4.模糊查询
# 5.函数
# 6. ...

视图

# 视图
# 理解:虚拟表# 创建虚拟表
# or replace - 视图名重复就替换
# with check option - 修改视图数据如果违反条件,就拒绝
create or replace view view01 as select phone,province,city,money from user where money>1000 with check option;# 查询视图数据
SELECT * FROM view01;# 修改视图数据
# 注意:修改视图数据,原表也会发生改变
UPDATE view01 SET money=2000 WHERE phone='15879090131';
UPDATE view01 SET money= 500 WHERE phone='15879090131';# 删除视图
DROP view view01;

触发器

# 触发器# 创建场景 --------------------------------------------------------------------------# 创建学科表,并添加数据
CREATE TABLE course(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),sum INT(3) DEFAULT 0
)
INSERT INTO course(name) VALUES('JavaEE');
INSERT INTO course(name) VALUES('Python');
INSERT INTO course(name) VALUES('HTML');# 创建班级表,并添加数据
CREATE TABLE class(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),sum INT(3) DEFAULT 0
)
INSERT INTO class(name) VALUES('2402JavaEE');
INSERT INTO class(name) VALUES('2403JavaEE');
INSERT INTO class(name) VALUES('2401Python');
INSERT INTO class(name) VALUES('2402Python');
INSERT INTO class(name) VALUES('2401HTML');
INSERT INTO class(name) VALUES('2402HTML');# 添加学生表
CREATE TABLE student(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),course_id INT(3),class_id INT(3)
)# 需求1 --------------------------------------------------------------------------
# 需求:添加学生,并更新对应的学科和班级的总人数# 创建触发器:当学生表添加数据之后触发,更新对应的学科和班级的总人数
# AFTER - 后置触发
# delimiter xx - 设置sql命令的结束符
# new - 获取新增数据delimiter xx
CREATE TRIGGER tri01 AFTER INSERT ON student FOR EACH ROWBEGINUPDATE course SET sum=sum+1 WHERE id=new.course_id;UPDATE class SET sum=sum+1 WHERE id=new.class_id;END xx
delimiter ;INSERT INTO student(name,course_id,class_id) VALUES('张三',1,1);
INSERT INTO student(name,course_id,class_id) VALUES('李四',1,1);
INSERT INTO student(name,course_id,class_id) VALUES('王五',1,2);
INSERT INTO student(name,course_id,class_id) VALUES('赵六',2,3);
INSERT INTO student(name,course_id,class_id) VALUES('小明',2,4);
INSERT INTO student(name,course_id,class_id) VALUES('李华',3,5);# 需求2 --------------------------------------------------------------------------
# 需求:删除学生,并更新对应的学科和班级的总人数
# BEFORE - 前置触发
# old - 获取原有数据
delimiter xx
CREATE TRIGGER tri02 BEFORE DELETE ON student FOR EACH ROWBEGINUPDATE course SET sum=sum-1 WHERE id=old.course_id;UPDATE class SET sum=sum-1 WHERE id=old.class_id;END xx
delimiter ;DELETE FROM student WHERE id=1;# 删除触发器 --------------------------------------------------------------------------
DROP TRIGGER tri01;
DROP TRIGGER tri02;

存储过程

理解:存储过程类似于Java里的方法

区别:

Java里的方法有参数和返回值,参数-将方法外界的数据传入到方法内部,返回值-将方法里的数据返回给外界

存储过程没有返回值,但是有传入、传出、传入传出参数,也就是说参数有3个方向

存储过程的参数分类:

​ in - 传入

​ out - 传出

​ inout - 传入传出

1.无传入传出:

# 最简单的存储过程
delimiter xx
CREATE PROCEDURE pro01()BEGINSELECT * FROM student;SELECT * FROM class;SELECT * FROM course;END xx
delimiter ;# 调用存储过程
CALL pro01();

2.有传入

# 需求:传入学生的id,查询出学生的姓名
delimiter xx
CREATE PROCEDURE pro02(IN s_id INT(3))BEGINSELECT name FROM student WHERE id=s_id;END xx
delimiter ;# 调用存储过程
CALL pro02(2);

3.有传出

# 需求:传入学生的id,返回出学生的姓名
delimiter xx
CREATE PROCEDURE pro03(IN s_id INT(3),OUT s_name VARCHAR(32))BEGINSELECT name INTO s_name FROM student WHERE id=s_id;END xx
delimiter ;# 调用存储过程
CALL pro03(2,@s_name);
SELECT @s_name;

4.传入传出(当传入和传出的数据类型一致时)

# 需求:传入学生的id,返回出学生的年龄
delimiter xx
CREATE PROCEDURE pro04(INOUT param INT(3))BEGINSELECT age INTO param FROM student WHERE id=param;END xx
delimiter ;# 调用存储过程
SET @param=2;
CALL pro04(@param);
SELECT @param;

删除存储过程

DROP PROCEDURE pro01;
DROP PROCEDURE pro02;
DROP PROCEDURE pro03;
DROP PROCEDURE pro04;

函数

预定义函数

# 预定义函数# 数学类函数 ----------------------------------------------------------------
SELECT ABS(-10);# 求绝对值
SELECT pow(2,3);# 求次方
SELECT SQRT(9);# 求平方根
SELECT MOD(10,3);# 求余数
SELECT RAND();# 求随机数# 字符串类函数 ----------------------------------------------------------------
SELECT CONCAT("用良心做教育","做真实的自己");# 拼接
SELECT SUBSTRING("用良心做教育",2,2);# 截取(目标字符串,第几个字符,截取长度)
SELECT LENGTH("用良心做教育");# 获取长度(字节)# 日期时间类函数 ----------------------------------------------------------------
SELECT NOW();
SELECT YEAR(now());
SELECT MONTH(now());
SELECT DAYOFMONTH(now());
SELECT HOUR(now());
SELECT MINUTE(now());
SELECT SECOND(now());
SELECT DATE_FORMAT(now(),"%Y年%m月%d日 %H时%i分%s秒");

自定义函数

# 自定义函数
# 注意:MySQL的函数必须有返回值# 需求:创建函数,传入学生id,返回学生的姓名
delimiter xx
CREATE FUNCTION fun(s_id INT(3)) RETURNS VARCHAR(32) DETERMINISTICBEGINDECLARE s_name VARCHAR(32);SELECT name INTO s_name FROM student WHERE id=s_id;RETURN s_name;END xx
delimiter ;# 调用函数
SELECT fun(2);# 删除函数
DROP FUNCTION fun;

初识JDBC

JDBC:java database connectivity

SUN公司提供的一套操作数据库的标准规范。

JDBC与数据库驱动的关系:接口与实现的关系。

JDBC的四大金刚

  1. DriverManager:用于注册驱动

  2. Connection: 表示与数据库创建的连接

  3. Statement: 操作数据库sql语句的对象

    4.ResultSet: sql语句执行后返回的结果集

JDBC操作步骤

  1. 加载驱动

  2. 创建连接对象

  3. 创建Statement对象

  4. 通过Statement对象执行sql语句

  5. 获取执行结果

  6. 关闭资源

package com.qf.jdbc;import org.junit.Test;import java.sql.*;/*** 知识点:JDBC*/
public class Test01 {//增@Testpublic void test01() throws ClassNotFoundException, SQLException {//导入驱动包Class.forName("com.mysql.cj.jdbc.Driver");//获取连接对象String url="jdbc:mysql://localhost:3306/2042javaee?characterEncoding=utf8&serverTimezone=UTC";String username="root";String password="123456";Connection connection = DriverManager.getConnection(url, username, password);//获取发送sql指令对象Statement statement = connection.createStatement();//发送sql指令String sql="insert into student(name,sex,salary,age,course) values('小红','女',9000,22,'Java');";int num = statement.executeUpdate(sql);System.out.println("对"+num+"行产生了影响");//关闭资源statement.close();connection.close();}//删@Testpublic void test02() throws ClassNotFoundException, SQLException {//导入驱动包Class.forName("com.mysql.cj.jdbc.Driver");//获取连接对象String url="jdbc:mysql://localhost:3306/2042javaee?characterEncoding=utf8&serverTimezone=UTC";String username="root";String password="123456";Connection connection = DriverManager.getConnection(url,username,password);//获取发送sql指令对象Statement statement = connection.createStatement();//发送sql指令String sql="delete from student where id>8;";int num = statement.executeUpdate(sql);System.out.println("对"+num+"行产生了影响");//关闭资源statement.close();connection.close();}//改@Testpublic void test03() throws ClassNotFoundException, SQLException {//导入驱动包Class.forName("com.mysql.cj.jdbc.Driver");//获取连接对象String url="jdbc:mysql://localhost:3306/2042javaee?characterEncoding=utf8&serverTimezone=UTC";String username="root";String password="123456";Connection connection = DriverManager.getConnection(url, username, password);//获取发送sql指令对象Statement statement = connection.createStatement();//发送sql指令String sql="update student set salary=20000 where id=1;";int num = statement.executeUpdate(sql);System.out.println("对"+num+"行产生了影响");//关闭资源statement.close();connection.close();}//查@Testpublic void test04() throws ClassNotFoundException, SQLException {//导入驱动包Class.forName("com.mysql.cj.jdbc.Driver");//获取连接对象String url="jdbc:mysql://localhost:3306/2042javaee?characterEncoding=utf8&serverTimezone=UTC";String username="root";String password="123456";Connection connection = DriverManager.getConnection(url, username, password);//获取发送sql指令对象Statement statement = connection.createStatement();//发送sql指令String sql="select * from student;";ResultSet resultSet = statement.executeQuery(sql);//遍历结果集while(resultSet.next()){int id = resultSet.getInt("id");String name = resultSet.getString("name");String sex = resultSet.getString("sex");double salary = resultSet.getDouble("salary");String course = resultSet.getString("course");System.out.println(id+"--"+name+"--"+sex+"--"+salary+"--"+course);}//关闭资源statement.close();connection.close();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/23122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vuInhub靶场实战系列-DC-6实战

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置二、信息收集2.1 主机发现2.1.1 nmap扫描存活主机2.1.2 arp-scan扫描存活主机 2.2 端口扫描2.3 指纹识别2.3.1 尝试指纹识别2.3.…

【LC刷题】DAY01:704. 二分查找、27. 移除元素

【LC刷题】DAY01:704. 二分查找、27. 移除元素 文章目录 【LC刷题】DAY01:704. 二分查找、27. 移除元素704. 二分查找 [link](https://leetcode.cn/problems/binary-search/description/)第一思路:优化思路 27. 移除元素 [link](https://leet…

解决Mac无法上网/网络异常的方法,重置网络

解放方法 1、前往文件夹:/Library/Preferences/SystemConfiguration 2 、在弹窗中输入上边的地址 3 、把文件夹中除了下图未选中的文件全部删掉,删除时需要输入密码 4 、重启mac 电脑就搞定了。

python的一种集成开发工具:PyCharm开发工具

一. 简介 本文简单了解两种 python语言所使用的 集成开发环境: PyCharm、vscode。 python语言学习中,可以任意选中这两个集成开发环境的一种就可以。本文先来简单学习 PyCharm开发工具安装与使用。 二. python的一种集成开发工具:PyChar…

【LeetCode】40. 组合总和 II

组合总和 II 题目描述: 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例…

数据更新后Ant Design Table组件界面未刷新怎么解决?

在使用Ant Design的Table组件时,我们时常需要动态更新表格数据以满足应用需求。然而,有时即使数据已经更新,界面却没有进行相应的刷新。这种情况可能由多种因素导致,其中之一就是关于key属性的使用问题。本文将重点讨论key属性在解…

Nginx的https功能

一.HTTPS功能简介 Web网站的登录页面都是使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实…

Springboot框架开发与实用篇之热部署 2024详解

开发与实用 手动启动热部署 热部署(Hot Deployment)指的是在应用程序正在运行的情况下,对其进行更新或修改并将这些变更应用到正在运行的应用程序中的过程。通常情况下,传统的部署方式需要停止应用程序、部署更新,然…

基于51单片机的智能晾衣架设计资料

第三章:硬件单元电路 经过上述分析明确了本次设计的主要目标,为了实现晾衣自身能够完成对外界数据的采集与分析,集成控制环节我们采用了ATMEL公司生产的AT89C52单片机,与市面上的其他嵌入式控制单元相比较在体积与功耗方面都相当出色。此次设计主要突破在于设计合理的控制电…

最短路问题

最短路问题是图论里非常经典的一个考点 接下来着重讲述五种求最短路的算法:朴素版dijkstra算法、堆优化版的dijkstra算法、bellman-ford算法、spfa算法、floyd算法 总体思维导图: 总体思路: 最短路分为两大类 { 在以下给出的时间复杂度中n…

学习笔记——路由网络基础——静态路由(static)

三、静态路由(static) 1、静态路由 (1)定义 静态路由(Static):由管理员手动配置和维护的路由。静态路由配置简单,被广泛应用于网络中。此外还可以实现负载均衡和路由备份。 静态路由默认优先级为60,如果想在多条静态路由中让某条路由优选…

网络运维:现代IT架构的守护者

网络运维:现代IT架构的守护者 在数字化浪潮席卷全球的今天,网络运维已不再是简单的技术术语,而是每一个追求高效、稳定运营的企业和组织必须重视的关键环节。本文将探讨网络运维的重要性,以及它在现代IT架构中所扮演的不可或缺的…

YOLOX源码之 Label Assignment

网络结构没什么好讲的,backbone、neck、head组成,backbone采用的cspdarknet,neck采用的pafpn,head是decoupled head结构。这里主要讲一下label assignment的具体实现,yolox中采用了simota,是ota的简化版本。…

uniapp小程序开发 | 从零实现一款影视类app (后台接口实现,go-zero微服务的使用)

uniapp小程序开发实战系列,完整介绍从零实现一款影视类小程序。包含小程序前端和后台接口的全部完整实现。系列连载中,喜欢的可以点击收藏。 该篇着重介绍获取轮播图后台接口和获取正在热映电影的两个后台接口的实现。 后台服务使用golang,…

MySQL—多表查询—自连接

一、引言 自连接,顾名思义就是自己连接自己。 自连接的语法结构: 表 A 别名 A join 表 A 别名 B ON 条件 ...; 注意: 1、这种语法有一个关键字:join 2、自连接查询可以是内连接的语法,可以是外连接的语法&#xff08…

【游戏】Goc赚钱模拟器1.0版

Hello!大家好,我是学霸小羊,今天分享一个Goc游戏。 //注:以下代码为Goc原创代码。 大家可以在下面网址写入代码www.51goc.com慧通教育http://www.51goc.com注:Goc编辑器路径: www.51goc.com ➡ 登录 ➡ 游客登陆 ➡…

Three.js加入到可视化大屏,看看能否惊艳到你?

three.js 在可视化大屏上可以实现各种三维场景和动画效果,可以根据具体需求进行定制化开发,并结合其他技术,如数据可视化、交互设计等,实现更加丰富的可视化效果。 three.js 是一个基于 WebGL 的 JavaScript 3D 库,可…

循迹模块之循迹小车

1.TCRT5000传感器 TCRT5000传感器的红外发射二极管 不断发射红外线 1.1 当发射出的红外线没有被反射回来或被反射回来但强度不够大时, 红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态 1.2 当被检测物体…

跳跃游戏二

方法一:(双指针法)此题参考跳台阶问题,题目要求求到达最后一个点的最小跳跃次数,那么我们就可以从最后一个往前推,先看谁能离得最远,并且能跳到最后一个。假设i位置是离最后一个位置最远&#x…

AI引领天文新篇章:中科院发现107例中性碳吸收线,揭示宇宙深邃奥秘

在浩渺无垠的宇宙中,探索未知的天文现象一直是科学家们不懈的追求。近日,中科院上海天文台的研究团队在《天文物理杂志》(MNRAS)上发布了重要研究成果:利用人工智能技术,成功探测到了107例中性碳吸收线&…