当前位置: 首页 > news >正文

【MySQL之SQL语法篇】系统学习MySQL,从应用SQL语法到底层知识讲解,这将是你见过最完成的知识体系

文章目录

  • 一、数据管理技术的三个阶段
  • 二、SQL语句学习
    • 1. DCL数据控制语言
      • 1.1 创建用户
      • 1.2 修改用户名
      • 1.3 修改密码
      • 1.4 删除用户
      • 1.5 授权
      • 1.6 查看权限
      • 1.7 回收权限
    • 2. DDL数据定义语言
      • 2.1 操作数据库
      • 2.2 操作数据表
      • 2.3 操作数据
    • 3. DQL数据查询语言
      • 基本语法
      • 3.1 单表查询
        • 3.1.1选择表中的若干列
        • 3.1.2 选择表中的若干元组
        • 3.1.3 ORDER BY
        • 3.1.4 聚合函数
        • 3.1.5 GROUP BY
      • 3.2 连接查询
        • 3.2.1 等值连接
        • 3.2.2 非等值连接
        • 3.2.3 自身连接
        • 3.2.4 外连接
      • 3.3 嵌套查询
        • 3.3.1 嵌套查询概述
        • 3.3.2 不相关子查询与相关子查询(非常重要,关乎子查询)
        • 3.3.3 带有IN谓词的子查询
        • 3.3.4 带有比较运算符的子查询
        • 3.3.5 带有ANY(SOME)或ALL谓词的子查询
        • 3.3.6 带有EXISTS谓词的子查询
      • 3.4 集合查询
      • 3.5 基于派生表的查询
    • 4. 约束
      • 4.1 非空约束
      • 4.2 唯一约束
      • 4.3 主键约束
      • 4.4 自动增长约束
      • 4.5 外键约束
    • 5. mysql中int类型单引号问题
    • 6. 空值的处理
    • 7. 视图
      • 1. 创建视图
      • 2. 删除视图
      • 3. 查询视图
      • 4. 更新视图
  • 三、数据类型
    • 1. MySQL整数类型
    • 2. 小数类型
    • 3. 日期和时间类型
      • a. YEAR类型
      • b. TIME类型
      • c. DATE类型
      • d. DATETIME类型
      • e. TIMESTAMP类型
    • 4. 字符串类型
  • 四、java向MySQL插入当前时间的几种方式
    • 方式一
    • 方式二
  • 五、SQL知识的基本概念
    • 1. 码
    • 2. 函数依赖
    • 3. 六大范式

一、数据管理技术的三个阶段

  • 人工管理阶段:在计算机出现之前,人们主要利用纸张和计算工具(如算盘和计算尺)来进行数据的记录和计算,依靠大脑来管理和利用数据。
  • 文件系统阶段:将数据存储在计算机的磁盘上。这些数据都以文件的形式存储,然后通过文件系统来管理这些文件。
    在这里插入图片描述
  • 数据库系统阶段:相对于文件系统来说,数据库系统实现了数据结构化。在文件系统中,独立文件内部的数据一般是有结构的,但文件之间不存在联系,因此整体来说是没有结构的。 数据库系统虽然也常常分成许多单独的数据文件,但是它更注意同一数据库中各数据文件之间的相互联系。
    在这里插入图片描述

二、SQL语句学习

  1. DDL(Data Definition Language)数据定义语言
    用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等
  2. DML(Data Manipulation Language)数据操作语言
    用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
  3. DQL(Data Query Language)数据查询语言
    用来查询数据库中表的记录(数据)。关键字:select, where 等
  4. DCL(Data Control Language)数据控制语言(了解)
    用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等
  5. TCL(Transition Language) :事务控制语言,用来管理事务

1. DCL数据控制语言

1.1 创建用户

  • ’alian’@'localhost’ :表示只允许本机登录
  • ’alian’@’%’ :表示任意地址登录
  • ’alian’@'192.168.0.100’ :表示只允许ip为192.168.0.100的地址登录
  • ’alian’@‘192.168..’ :表示只允许ip为192.168网段的地址登录
# 格式
create user '用户名'@'IP地址' identified WITH mysql_native_password by '密码';
flush privileges;# 实例
CREATE USER 'alian'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;

1.2 修改用户名

rename user '用户名'@'IP地址' to '新用户名'@'IP地址';

1.3 修改密码

#切换到mysql库
use mysql;
#更新密码
UPDATE user SET password=password('新密码') WHERE user='用户名' AND host='IP地址';
#刷新权限
FLUSH PRIVILEGES;

或者

ALTER USER '用户名'@'IP地址' IDENTIFIED WITH mysql_native_password BY '新密码';
flush privileges;

或者

#普通用户登录后
SET PASSWORD=password('新密码');
FLUSH PRIVILEGES;

1.4 删除用户

#注意这里的IP地址,一个用户可能会有多个
drop user '用户名'@'IP地址';
#比如
drop user 'Alian'@'192.168.0.100';

1.5 授权

grant 权限1, 权限2, 权限3,,权限n on 数据库名.表名 to 用户名@地址;

数据库名.表名

  • . 表示任意库的任意表(不建议)
  • mysql.* 表示mysql库的任意表
  • mysql.user 表示mysql库的user表

用户名@地址

  • ’alian’@'localhost’ :表示只允许本机登录
  • ’alian’@’%’ :表示任意地址登录
  • ’alian’@'192.168.0.100’ :表示只允许ip为192.168.0.100的地址登录
  • ’alian’@‘192.168..’ :表示只允许ip为192.168网段的地址登录

实例

#把数据库的所有库的所有权限都给alian,并且是任意ip地址都可以操作
grant all privileges on *.* to 'alian'@'%';
flush privileges;#把mysql数据库的所有权限都给alian,并且是任意ip地址都可以操作
grant all privileges on mysql.* to 'alian'@'%';
flush privileges;#把mysql数据库的user表的所有权限都给alian,并且是只能通过192.138.0.10才可以操作
grant all privileges on mysql.user to 'alian'@'192.138.0.10';
flush privileges;#把mysql数据库的user表的(查询,插入,更新,删除)的权限都给alian,并且是任意ip地址都可以操作
grant SELECT, INSERT, UPDATE, DELETE on mysql.user to 'alian'@'%';
flush privileges;

1.6 查看权限

show grants for 'alian'@'%';

1.7 回收权限

#格式
revoke 权限1, 权限2…权限n on 数据库名.表名 from 用户名@地址;#实例:回收用户的更新和删除mysql(默认的库)数据库的权限
revoke update,delete on mysql.user from 'alian'@'%';

2. DDL数据定义语言

2.1 操作数据库

创建

	# 创建数据库,判断不存在,再创建:create database if not exists 数据库名称;# 创建数据库,并指定字符集create database 数据库名称 character set 字符集名;

查询

	* 查询所有数据库的名称:show databases;* 查询某个数据库的字符集:查询某个数据库的创建语句show create database 数据库名称;

修改

	* 修改数据库的字符集alter database 数据库名称 character set 字符集名称;

删除

	* 删除数据库drop database 数据库名称;* 判断数据库存在,存在再删除drop database if exists 数据库名称;

2.2 操作数据表

创建

create table 表名(列名1 数据类型1,列名2 数据类型2,....列名n 数据类型n
);# 数据库类型1. int:整数类型		2. double:小数类型3. date:日期,只包含年月日,yyyy-MM-dd4. datetime:日期,包含年月日时分秒	 yyyy-MM-dd HH:mm:ss5. timestamp:时间错类型	包含年月日时分秒	 yyyy-MM-dd HH:mm:ss	6. varchar:字符串,* zhangsan 8个字符  张三 2个字符

查询

	* 查询某个数据库中所有的表名称show tables;* 查询表结构desc 表名;

修改

	1. 修改表名alter table 表名 rename to 新的表名;2. 修改表的字符集alter table 表名 character set 字符集名称;3. 添加一列alter table 表名 add 列名 数据类型;4. 修改列名称 类型alter table 表名 change 列名 新列别 新数据类型;alter table 表名 modify 列名 新数据类型;5. 删除列alter table 表名 drop 列名;

删除

	* drop table 表名;* drop table  if exists 表名 ;

2.3 操作数据

添加

insert into 表名(列名1,列名2,…列名n) values(1,2,…值n);

删除

delete from 表名 [where 条件]

修改

update 表名 set 列名1 =1, 列名2 =2,[where 条件];

3. DQL数据查询语言

基本语法

select字段列表
from表名列表
where条件列表
group by分组字段
having分组之后的条件
order by 排序
limit分页限定

3.1 单表查询

3.1.1选择表中的若干列

# 查询全体学生的学号与姓名。
SELECT Sno,Sname FROM Student; # 查询全体学生的详细记录
SELECT  Sno,Sname,Ssex,Sage,Sdept FROM Student; 
SELECT  * FROM Student; # 查询经过计算的值:查全体学生的姓名及其出生年份。
SELECT Sname,2023-Sage FROM Student;# 使用列别名改变查询结果:Sname(NAME)
SELECT Sname NAME FROM Student;

3.1.2 选择表中的若干元组

# 如果没有指定DISTINCT关键词,则缺省为ALL 
SELECT Sno  FROM SC;
SELECT ALL  Sno  FROM SC;# 指定DISTINCT关键词,去掉表中重复的行 
SELECT DISTINCT Sno FROM SC;

在这里插入图片描述

# 1. 比较大小# 查询计算机科学系全体学生的名单。SELECT Sname FROM Student WHERE  Sdept=‘CS’; # 查询所有年龄在20岁以下的学生姓名及其年龄。SELECT Sname,Sage FROM Student WHERE  Sage < 20;# 2. 确定范围# 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23; # 3. 确定集合# 查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。SELECT Sname, Ssex FROM Student WHERE Sdept NOT IN ('IS','MA’,'CS');# 查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN ('IS','MA','CS');# 4. 字符匹配# 查询学号为201215121的学生的详细情况。SELECT * FROM  Student WHERE  Sno LIKE ‘201215121';# 查询所有姓刘学生的姓名、学号和性别。SELECT Sname, Sno, Ssex FROM Student WHERE  Sname LIKE '刘%';# 5. 涉及空值的查询# 查所有有成绩的学生学号和课程号。SELECT Sno,Cno FROM SC WHERE  Grade IS NOT NULL;# 6. 多重条件查询(AND优先级大于OR)# 查询计算机系年龄在20岁以下的学生姓名。SELECT Sname FROM  Student WHERE Sdept= 'CS' AND Sage<20;

3.1.3 ORDER BY

# 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
SELECT Sno, Grade FROM SC WHERE  Cno= ' 3 ' ORDER BY Grade DESC;# 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
SELECT  * FROM  Student ORDER BY Sdept, Sage DESC;  

3.1.4 聚合函数

聚合函数的计算,排序null值

COUNT([DISTINCT|ALL] <列名>)函数和GROUP BY关键字一起来计算不同分组中的记录总数
select o_num count(f_id) from orderitems group by o_num;#SUM([DISTINCT|ALL] <列名>)可以与GROUP BY一起使用,来计算每个分组的总和
select o_num,sum(quantity) as items_total from orderitems group by o_num;#AVG([DISTINCT|ALL] <列名>)可以与GROUP BY一起使用,来计算每个分组的平均值
select s_id,AVG(f_price) as avg_price from fruits group by s_id;#MAX([DISTINCT|ALL] <列名>)也可以和GROUP BY关键字一起使用,求每个分组中的最大值。
select s_id,max(f_price) as max_price from fruits group by s_id;#MIN([DISTINCT|ALL] <列名>)也可以和GROUP BY关键字一起使用,求出每个分组中的最小值。
select s_id,min(f_price) as min_price from fruits group by s_id;

WHERE子句中是不能用聚集函数作为条件表达式

# i查询平均成绩大于等于90分的学生学号和平均成绩,下面的语句是不对的:SELECT Sno, AVG(Grade)FROM  SCWHERE AVG(Grade)>=90GROUP BY Sno;# 因为WHERE子句中是不能用聚集函数作为条件表达式正确的查询语句应该是:SELECT  Sno, AVG(Grade)FROM  SCGROUP BY SnoHAVING AVG(Grade)>=90;

3.1.5 GROUP BY

  • where 在分组之前进行限定,如果不满足条件,则不参与分组。
  • having在分组之后进行限定,如果不满足结果,则不会被查询出来
  • where 后不可以跟聚合函数
  • having可以进行聚合函数的判断。
-- 按照性别分组。分别查询男、女同学的平均分SELECT sex , AVG(math) FROM student GROUP BY sex;-- 按照性别分组。分别查询男、女同学的平均分,人数SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;--  按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;--  按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组,分组之后。人数要大于2个人SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;SELECT sex , AVG(math),COUNT(id) 人数 FROM student WHERE math > 70 GROUP BY sex HAVING 人数 > 2;

3.2 连接查询

3.2.1 等值连接

  1. SQL语句
	SELECT  Student.*, SC.*FROM     Student, SCWHERE  Student.Sno = SC.Sno;
  1. 执行结果
    在这里插入图片描述
  2. 执行过程
  1. 嵌套循环法(NESTED-LOOP)
  • 首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。
    表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。
    重复上述操作,直到表1中的全部元组都处理完毕
  1. 排序合并法(SORT-MERGE)
  • 常用于=连接
  • 首先按连接属性对表1和表2排序,对表1的第一个元组,从头开始扫描表2,顺序查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。当遇到表2中第一条大于表1连接字段值的元组时,对表2的查询不再继续
    找到表1的第二条元组,然后从刚才的中断点处继续顺序扫描表2,查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。直接遇到表2中大于表1连接字段值的元组时,对表2的查询不再继续
    重复上述操作,直到表1或表2中的全部元组都处理完毕为止
  1. 索引连接(INDEX-JOIN)
  • 对表2按连接字段建立索引
  • 对表1中的每个元组,依次根据其连接字段值查询表2的索引,从中找到满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组

3.2.2 非等值连接

# 查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。SELECT Student.Sno, SnameFROM     Student, SCWHERE  Student.Sno=SC.Sno  AND    		               SC.Cno=' 2 ' AND SC.Grade>90;

执行过程:

  • 先从SC中挑选出Cno='2’并且Grade>90的元组形成一个中间关系,再和Student中满足连接条件的元组进行连接得到最终的结果关系

3.2.3 自身连接

  • 自身连接:一个表与其自己进行连接
  • 需要给表起别名以示区别
  • 由于所有属性名都是同名属性,因此必须使用别名前缀
# 查询每一门课的间接先修课(即先修课的先修课)SELECT  FIRST.Cno, SECOND.CpnoFROM  Course  FIRST, Course  SECONDWHERE FIRST.Cpno = SECOND.Cno;

在这里插入图片描述

3.2.4 外连接

  1. 外连接与普通连接的区别
  • 普通连接操作只输出满足连接条件的元组
  • 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
  • 左外连接:列出左边关系中所有的元组
  • 右外连接:列出右边关系中所有的元组
  1. SQL语句
	# LEFT OUT,左边的全部输出SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROM  Student  LEFT OUT JOIN SC ON    (Student.Sno=SC.Sno); 
  1. 执行结果
    在这里插入图片描述

3.3 嵌套查询

3.3.1 嵌套查询概述

  • 一个SELECT-FROM-WHERE语句称为一个查询块
  • 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
  • 子查询不能使用ORDER BY子句
  1. SQL语句
     SELECT Sname	                           /*外层查询/父查询*/FROM StudentWHERE Sno IN( SELECT Sno        /*内层查询/子查询*/FROM SCWHERE Cno= ' 2 ');

3.3.2 不相关子查询与相关子查询(非常重要,关乎子查询)

  1. 子查询的查询条件不依赖于父查询
  • 由里向外 逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
  1. 子查询的查询条件依赖于父查询
  • 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表
  • 然后再取外层表的下一个元组
  • 重复这一过程,直至外层表全部检查完为止

3.3.3 带有IN谓词的子查询

# 查询与“刘晨”在同一个系学习的学生。SELECT Sno, Sname, SdeptFROM StudentWHERE Sdept  IN(SELECT SdeptFROM StudentWHERE Sname= ' 刘晨 ');# 也可以通过自身连接完成查询要求SELECT  S1.Sno, S1.Sname,S1.SdeptFROM     Student S1,Student S2WHERE  S1.Sdept = S2.Sdept  ANDS2.Sname = '刘晨';

3.3.4 带有比较运算符的子查询

# 找出每个学生超过他选修课程平均成绩的课程号。SELECT Sno, CnoFROM    SC  xWHERE Grade >=(SELECT AVG(Grade) FROM  SC yWHERE y.Sno=x.Sno);

3.3.5 带有ANY(SOME)或ALL谓词的子查询

# 查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄SELECT Sname,SageFROM    StudentWHERE Sage < ANY (SELECT  SageFROM    StudentWHERE Sdept= ' CS ')AND Sdept <> ‘CS ' ;           /*父查询块中的条件 */

3.3.6 带有EXISTS谓词的子查询

带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。

  • 若内层查询结果非空,则外层的WHERE子句返回真值
  • 若内层查询结果为空,则外层的WHERE子句返回假值
# 查询所有选修了1号课程的学生姓名SELECT SnameFROM StudentWHERE EXISTS(SELECT *FROM SCWHERE Sno=Student.Sno AND Cno= ' 1 ');# 本查询涉及Student和SC关系
# 在Student中依次取每个元组的Sno值,用此值去检查SC表
# 若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno= ‘1’,则取此Student.Sname送入结果表

3.4 集合查询

  1. 集合操作的种类:并操作UNION、交操作INTERSECT、差操作EXCEPT
  2. 集合操作限制:参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同
# 查询计算机科学系的学生及年龄不大于19岁的学生。
# UNION:将多个查询结果合并起来时,系统自动去掉重复元组
# UNION ALL:将多个查询结果合并起来时,保留重复元组 SELECT *FROM StudentWHERE Sdept= 'CS'UNIONSELECT *FROM StudentWHERE Sage<=19;# 查询计算机科学系的学生与年龄不大于19岁的学生	    的交集。SELECT *FROM StudentWHERE Sdept='CS' INTERSECTSELECT *FROM StudentWHERE Sage<=19 # 查询计算机科学系的学生与年龄不大于19岁的学生的差集。SELECT *FROM StudentWHERE Sdept='CS'EXCEPTSELECT  *FROM StudentWHERE Sage <=19;

3.5 基于派生表的查询

  1. 派生表:子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表(Derived Table)成为主查询的查询对象
# 找出每个学生超过他自己选修课程平均成绩的课程号   SELECT Sno, CnoFROM SC, (SELECT Sno, Avg(Grade) FROM SC GROUP BY Sno)AS Avg_sc(avg_sno,avg_grade)WHERE SC.Sno = Avg_sc.avg_snoAND SC.Grade >=Avg_sc.avg_grade

4. 约束

主键约束:primary key
非空约束:not null
唯一约束:unique
外键约束:foreign key
默认值 :Default


4.1 非空约束

# 创建表时,添加非空约束
CREATE TABLE stu(id INT,NAME VARCHAR(20) NOT NULL -- name为非空
);# 创建表后,添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;# 删除name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);

4.2 唯一约束

# 创建表时,添加唯一约束
CREATE TABLE stu(id INT,phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束);# 在创建表后,添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;# 删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;

4.3 主键约束

# 创建表时,添加主键约束
create table stu(id int primary key,-- 给id添加主键约束name varchar(20)
);# 创建完表后,添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;# 删除主键:错误 alter table stu modify id int ;
ALTER TABLE stu DROP PRIMARY KEY;

4.4 自动增长约束

# 创建表时,添加自动增长约束
create table stu(id int primary key auto_increment,-- 给id添加主键约束name varchar(20));# 创建表后,添加自动增长约束
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;# 删除自动增长
ALTER TABLE stu MODIFY id INT;

4.5 外键约束

在创建数据表时添加约束。
下面语句执行成功之后,在表 tb_emp6 上添加了名称为 fk_emp_dept1 的外键约束,外键名称为 deptId,其依赖于表 tb_dept1 的主键 id。

mysql> CREATE TABLE tb_dept1-> (-> id INT(11) PRIMARY KEY,-> name VARCHAR(22) NOT NULL,-> location VARCHAR(50)-> );
mysql> CREATE TABLE tb_emp6-> (-> id INT(11) PRIMARY KEY,-> name VARCHAR(25),-> deptId INT(11),-> salary FLOAT,-> CONSTRAINT fk_emp_dept1-> FOREIGN KEY(deptId) REFERENCES tb_dept1(id)-> );

在修改表时添加外键约束

mysql> ALTER TABLE tb_emp2-> ADD CONSTRAINT fk_tb_dept1-> FOREIGN KEY(deptId)-> REFERENCES tb_dept1(id);

删除外键约束

mysql> ALTER TABLE tb_emp2-> DROP FOREIGN KEY fk_tb_dept1;

5. mysql中int类型单引号问题

今天写mysql的时候发现了一个问题,在查询的时候不小心把int类型的id加上引号查询了,但是也能查询出来,

SELECT * FROM `account` WHERE aid='1';

于是查询了很多资料,最后得出的结论是,mysql会自动转换:当你类型为int 但传入的值为varchar 他会把前几个’数字挑出来’
转换为int 类型来进行查询
如果你的 aid = 1 你查询语句是SELECT * FROM 表名 WHERE aid=‘1dasd’;
在编译的时候,编译器会把 1 挑出来进行转换,在进行查询,

如果你的 aid = 1 你查询语句是SELECT * FROM 表名 WHERE aid=‘dasd’;
第一个不为数字,所以无法转换,查询出来的结果就为空(不会报错),

如果你的 aid = 1 你查询语句是SELECT * FROM 表名 WHERE aid=‘123da’;
在编译的时候,编译器会把 123 挑出来进行转换,在进行查询,但查询结果为空(找不到这个对应的id);

如果你的 aid = 1 你查询语句是SELECT * FROM 表名 WHERE aid=‘da1sd’;
查询结果为空,因为编译期是从第一个开始查看是否为数字,如果不是不会往后查;

6. 空值的处理

  1. 规则一
  • 空值与另一个值(包括另一个空值)的算术运算的结果为空值
  • 空值与另一个值(包括另一个空值)的比较运算的结果为UNKNOWN。
    有UNKNOWN后,传统二值(TRUE,FALSE)逻辑就扩展成了三值逻辑
  • 空值与另一个值(包括另一个空值)的逻辑运算

在这里插入图片描述

7. 视图

概述

  • 虚表,是从一个或几个基本表(或视图)导出的表
  • 只存放视图的定义,不存放视图对应的数据
  • 基表中的数据发生变化,从视图中查询出的数据也随之改变

1. 创建视图

# 建立信息系学生的视图。CREATE VIEW IS_StudentAS SELECT Sno,Sname,SageFROM     StudentWHERE  Sdept= 'IS';WITH CHECK OPTION;	# 对视图进行UPDATE,INSERT和DELETE操作时要保证			# 更新、插入或删除的行 满足视图定义中的谓词条件(即子查询中的条件表达式)

2. 删除视图

# 如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除 
DROP VIEW IS_S1 CASCADE;   

3. 查询视图

# 在信息系学生的视图中找出年龄小于20岁的学生。SELECT   Sno,SageFROM      IS_StudentWHERE   Sage<20;

4. 更新视图

# 将信息系学生视图IS_Student中学号”201215122”的学生姓名改为”刘辰”。
UPDATE  IS_Student SET  Sname= '刘辰' WHERE  Sno= ' 201215122 ';

三、数据类型

参考文章:数据类型

1. MySQL整数类型

在这里插入图片描述

2. 小数类型

在这里插入图片描述

3. 日期和时间类型

在这里插入图片描述

a. YEAR类型

YEAR 类型是一个单字节类型,用于表示年,在存储时只需要 1 个字节。可以使用各种格式指定 YEAR,如下所示:
以 4 位字符串或者 4 位数字格式表示的 YEAR,范围为 ‘1901’~’2155’。输入格式为 ‘YYYY’ 或者 YYYY,例如,输入 ‘2010’ 或 2010,插入数据库的值均为 2010。
以 2 位字符串格式表示的 YEAR,范围为 ‘00’ 到 ‘99’。‘00’~’69’ 和 ‘70’~’99’ 范围的值分别被转换为 2000~2069 和 1970~1999 范围的 YEAR 值。‘0’ 与 ‘00’ 的作用相同。插入超过取值范围的值将被转换为 2000。
以 2 位数字表示的 YEAR,范围为 1~99。1~99 和 70~99 范围的值分别被转换为 2001~2069 和 1970~1999 范围的 YEAR 值。注意,在这里 0 值将被转换为 0000,而不是 2000。

提示:两位整数范围与两位字符串范围稍有不同。例如,插入 3000 年,读者可能会使用数字格式的 0 表示 YEAR,实际上,插入数据库的值为 0000,而不是所希望的 3000。只有使用字符串格式的 ‘0’ 或 ‘00’,才可以被正确解释为 3000,非法 YEAR值将被转换为 0000。

b. TIME类型

可以使用各种格式指定 TIME 值,如下所示。
‘D HH:MM:SS’ 格式的字符串。还可以使用这些“非严格”的语法:‘HH:MM:SS’、‘HH:MM’、‘D HH’ 或 ‘SS’。这里的 D 表示日,可以取 0~34 之间的值。在插入数据库时,D 被转换为小时保存,格式为 “D*24+HH”。
‘HHMMSS’ 格式、没有间隔符的字符串或者 HHMMSS 格式的数值,假定是有意义的时间。例如,‘101112’ 被理解为’10:11:12’,但是 ‘106112’ 是不合法的(它有一个没有意义的分钟部分),在存储时将变为 00:00:00。

提示:为 TIME 列分配简写值时应注意:如果没有冒号,MySQL 解释值时,假定最右边的两位表示秒。(MySQL 解释 TIME 值为过去的时间而不是当前的时间)。例如,读者可能认为 ‘1112’ 和 1112 表示 11:12:00(即 11 点过 12 分钟),但MySQL 将它们解释为 00:11:12(即 11 分 12 秒)。同样 ‘12’ 和 12 被解释为00:00:12。相反,TIME 值中如果使用冒号则肯定被看作当天的时间,也就是说,‘11:12’ 表示 11:12:00,而不是 00:11:12。

c. DATE类型

在给 DATE 类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合 DATE 的日期格式即可。如下所示:
以 ‘YYYY-MM-DD’ 或者 ‘YYYYMMDD’ 字符中格式表示的日期,取值范围为 ‘1000-01-01’~’9999-12-3’。例如,输入 ‘2015-12-31’ 或者 ‘20151231’,插入数据库的日期为2015-12-31。
以 ‘YY-MM-DD’ 或者 ‘YYMMDD’ 字符串格式表示日期,在这里YY表示两位的年值。MySQL 解释两位年值的规则:‘00~69’ 范围的年值转换为 ‘20002069’,'7099’ 范围的年值转换为 ‘1970~1999’。例如,输入 ‘15-12-31’,插入数据库的日期为 2015-12-31;输入 ‘991231’,插入数据库的日期为 1999-12-31。
以 YYMMDD 数字格式表示的日期,与前面相似,00~69 范围的年值转换为 2000~2069,80~99 范围的年值转换为 1980~1999。例如,输入 151231,插入数据库的日期为 2015-12-31,输入 991231,插入数据库的日期为 1999-12-31。
使用 CURRENT_DATE 或者 NOW(),插入当前系统日期。

提示:MySQL 允许“不严格”语法:任何标点符号都可以用作日期部分之间的间隔符。例如,‘98-11-31’、‘98.11.31’、‘98/11/31’和’98@11@31’ 是等价的,这些值也可以正确地插入数据库。

d. DATETIME类型

如下所示。
以 ‘YYYY-MM-DD HH:MM:SS’ 或者 ‘YYYYMMDDHHMMSS’ 字符串格式表示的日期,取值范围为 ‘1000-01-01 00:00:00’~’9999-12-3 23:59:59’。例如,输入 ‘2014-12-31 05:05:05’ 或者 '20141231050505’,插入数据库的 DATETIME 值都为 2014-12-31 05:05:05。
以 ‘YY-MM-DD HH:MM:SS’ 或者 ‘YYMMDDHHMMSS’ 字符串格式表示的日期,在这里 YY 表示两位的年值。与前面相同,‘00~79’ 范围的年值转换为 ‘2000~2079’,‘80~99’ 范围的年值转换为 ‘1980~1999’。例如,输入 ‘14-12-31 05:05:05’,插入数据库的 DATETIME 为 2014-12-31 05:05:05;输入 141231050505,插入数据库的 DATETIME 为 2014-12-31 05:05:05。
以 YYYYMMDDHHMMSS 或者 YYMMDDHHMMSS 数字格式表示的日期和时间。例如,输入 20141231050505,插入数据库的 DATETIME 为 2014-12-31 05:05:05;输入 140505050505,插入数据库的 DATETIME 为 2014-12-31 05:05:05。

提示:MySQL 允许“不严格”语法:任何标点符号都可用作日期部分或时间部分之间的间隔符。例如,‘98-12-31 11:30:45’、‘98.12.31 11+30+35’、‘98/12/31 113045’ 和 ‘98@12@31 113045’ 是等价的,这些值都可以正确地插入数据库。

e. TIMESTAMP类型

TIMESTAMP 的显示格式与 DATETIME 相同,显示宽度固定在 19 个字符,日期格式为 YYYY-MM-DD HH:MM:SS,在存储时需要 4 个字节。但是 TIMESTAMP 列的取值范围小于 DATETIME 的取值范围,为 '1970-01-01 00:00:01’UTC~’2038-01-19 03:14:07’UTC。在插入数据时,要保证在合法的取值范围内。

TIMESTAMP 也有一个 DATETIME 不具备的属性。默认情况下,当插入一条记录但并没有指定 TIMESTAMP 这个列值时,MySQL 会把 TIMESTAMP 列设为当前的时间。因此当需要插入记录和当前时间时,使用 TIMESTAMP 是方便的,另外 TIMESTAMP 在空间上比 DATETIME 更有效。

提示:协调世界时(英:Coordinated Universal Time,法:Temps Universel Coordonné)又称为世界统一时间、世界标准时间、国际协调时间。英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称 UTC。

TIMESTAMP 与 DATETIME 除了存储字节和支持的范围不同外,还有一个最大的区别是:
DATETIME 在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关;
而 TIMESTAMP 值的存储是以 UTC(世界标准时间)格式保存的,存储时对当前时区进行转换,检索时再转换回当前时区。即查询时,根据当前时区的不同,显示的时间值是不同的。

提示:如果为一个 DATETIME 或 TIMESTAMP 对象分配一个 DATE 值,结果值的时间部分被设置为 ‘00:00:00’,因此 DATE 值未包含时间信息。如果为一个 DATE 对象分配一个 DATETIME 或 TIMESTAMP 值,结果值的时间部分被删除,因此DATE 值未包含时间信息。

4. 字符串类型

在这里插入图片描述

四、java向MySQL插入当前时间的几种方式

方式一

        Date date = new Date();//获得系统时间.SimpleDateFormat sdf =   new SimpleDateFormat( " yyyy-MM-dd HH:mm:ss " );String nowTime = sdf.format(date);Date time = sdf.parse( nowTime );

方式二

		Date date = new Date();//得到一个timestamp格式的时间,存入mysql中的时间格式为"yyyy-MM-dd HH:mm:ss"Timestamp timestamp = new Timestamp(date.getTime());

五、SQL知识的基本概念

1. 码

  • 候选码: 若关系中的某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码。
  • 主码: 若一个关系中有多个候选码,则选定其中一个为主码。
  • 主属性: 所有候选码的属性称为主属性。不包含在任何候选码中的属性称为非主属性或非码属性。

2. 函数依赖

1. 完全函数依赖
如果我想知道某位学生的某一门课的成绩Grade,那我必须得同时知道他的学号Sno和课程号Cno。但如果我只知道一部分信息,比如他的Sno或者Cno可以吗?答案是不行的!此时称Y[Grade]完全依赖于X[Sno,Cno]。
2. 部分函数依赖
如果我想知道某位学生的姓名Sname,那我知道他的学号Sno就可以了。也就是说Y[Sname]只函数依赖于X[Sno,Cno]中的子集x[Sno],此时称Y部分函数依赖于X。
3. 传递函数依赖
有一个关系模式S(Sno,Sdept,Mname),如果我知道了一个学生的学号Sno,那我就能知道他所在的系Sdept。如果我知道了某一个系Sdept,那么我就能知道这个系的系主任的姓名Mname。也就是说,我知道了一个学生的学号Sno,其实我就知道了他所在系的系主任的姓名Mname。但这个过程中,他们是不存在直接函数依赖的,我需要通过系名称Sdept作为一个桥梁去把二者联系起来的。
4. 多值依赖
定义: 一个关系,至少存在三个属性(A、B、C),才能存在这种关系。对于每一个A值,有一组确定的B值和C值,并且这组B的值独立于这组C的值。
实例: 比如我们建立课程教师和教材的模型,我们规定,每门课程有对应的一组教师,每门课程也有对应的一组教材,一门课程使用的教程和教师没有关系。

3. 六大范式

省流

第一范式:数据项不可分;
第二范式:非主属性完全依赖主属性,消除了部分函数依赖,解决了数据冗余
第三范式:非主属性只能完全依赖主属性,消除了非主属性依赖于主属性,解决了传递依赖
BC范式:消除了主属性对候选键的部分依赖
第四范式:消除了多值依赖

第一范式1NF
所有属性都不可再分,即数据项不可分。

第二范式2NF
确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关

举例:比赛表,里面包含了球员编号,姓名,年龄,比赛编号,比赛时间,比赛场地等属性,由于单单球员编号和比赛编号都无法确定唯一一条数据,因此需要将球员编号和比赛编号联合作为主键

(球员编号,比赛编号) --> (姓名,年龄,比赛时间,比赛场地,得分)

但是这样并不满足第二范式,会出现以下问题:

  • 数据冗余:如果一个球员参加了n场比赛,那么球员的姓名和年龄就重复了n次,一个比赛也有可能有m个球员参加,那比赛的时间和地点就重复了m次。
  • 插入异常:如果我们想要添加一场新的比赛,但是这时球员还没有确定,那么就无法插入。
  • 删除异常:如果我们想要删除某个球员编号,会将比赛信息删除掉。
  • 更新异常:如果我们想要调整某个比赛.的时间,那么数据库表中所有关于这个比赛的时间都需要进行调整,否则会出现一场比赛时间不同的情况。

因此为了避免上面的问题,我们可以将上面球员比赛表设计成三张表,这样每张表都符合了第二范式

球员表:球员编号,姓名,年龄比赛表:比赛编号,比赛场地,比赛时间球员比赛关系表:球员编号,比赛编号,得分

第三范式3NF
在第二范式的基础上,确保数据表中的每一个非主键字段都和主键字段直接相关,也就是说,要求数据表中的所有非主键字段不能依赖于其他非主键字段字段。(即不能存在非主属性A依赖非主属性B,非主属性B依赖于主键C的情况),通俗来说,该规则的意思是所有非主键属性之间不能有依赖关系,必须相互独立,从而消除非主属性传递依赖候选码。

举例:员工信息表:员工编号,姓名,部门编号,部门名称
上面的员工信息表是符合第二范式的,因为姓名,部门编号,部门名称都完全依赖员工编号这个主键,但是并不符合第三范式,因为有非主键字段 部门名称 依赖于非主键字段 部门编号。因此需要将部门编号,部门名称再抽取成一张表。

BC范式BCBF
在3NF的基础上消除了主属性对候选键的部分依赖或者传递性依赖

举例:存在一个关系表(仓库名,管理员,物品名,数量)
进行分析可知,(仓库名,物品名)或者(管理员,物品名)可以决定数量,因此(仓库名,物品名)或者(管理员,物品名)就是这个表的候选键。
存在问题

  • 增加一个仓库,但是还没有存放物品,由于主键(仓库名,物品名)不能有空值存在,因此会插入异常。
  • 如果仓库的物品全部卖完了,那么会导致仓库名和管理员名称也会随之删除。
  • 如果仓库的管理员更换了,那么会有多条记录都需要更改。

问题出现原因
主属性仓库名对于候选键(管理员,物品名)有部分依赖,这样就导致有可能出现上面的问题,因此引入BCNF,它在3NF的基础上消除了主属性对候选键的部分依赖或者传递性依赖。
解决问题
将仓库名和管理员拆分出来形成一张表,然后(仓库名,物品名,数量)形成一张库存表。

第四范式4NF
消除多值依赖

举例:有职工表(职工编号,职工孩子,职工选修课程),在这张表中,每个职工可能有多个孩子,也有可能有多个选修课程,因此需要进行拆分成两张表:职工表一(职工编号,职工孩子),职工表二(职工编号,职工选修课程)。

第五范式5NF
除了第四范式外,我们还有更高级的第五范式和域键范式(DKNF),第五范式处理的是无损连接问题,这个范式基本没有实际意义,因为无损连接很少出现,而且难以察觉。而域键范式试图定义一个终极范式,该范式考虑所有的依赖和约束类型,但是实用价值也是最小的,只存在理论研究中。

相关文章:

【MySQL之SQL语法篇】系统学习MySQL,从应用SQL语法到底层知识讲解,这将是你见过最完成的知识体系

文章目录一、数据管理技术的三个阶段二、SQL语句学习1. DCL数据控制语言1.1 创建用户1.2 修改用户名1.3 修改密码1.4 删除用户1.5 授权1.6 查看权限1.7 回收权限2. DDL数据定义语言2.1 操作数据库2.2 操作数据表2.3 操作数据3. DQL数据查询语言基本语法3.1 单表查询3.1.1选择表…...

CentOS8基础篇7:Linux系统启动配置

一、Linux系统的启动过程 Linux的启动过程大体分为五个阶段&#xff1a; 1&#xff0e;计算机主机加电后&#xff0c;CPU初始化自身&#xff0c;接着在硬件固定位置执行一条指令。这条指令跳转到BIOS&#xff0c;BIOS找到启动设备并获取MBR&#xff0c;该MBR指向LILO或GRUB。 …...

vue中的$forceUpdate()、$set()

$forceUpdate() 迫使vue实例重新&#xff08;rander&#xff09;渲染虚拟dom&#xff0c;注意并不是重新加载组件。 结合vue的生命周期&#xff0c;调用 $forceupdate 后只会触发beforeupdate和updated这两个钩子函数&#xff0c;不会触发其他的钩子函数。它仅仅影响实例本身和…...

记住这3点,有效提高江苏专转本上岸率

记住这3点&#xff0c;有效提高上岸率 我们都知道&#xff0c;在江苏统招专转本考试中想岸并不是一件容易的事情。考生能否顺利上岸&#xff0c;往往受多方面因素影响&#xff0c;这其中包括&#xff1a;个人基础、学习方式、信息搜索能力。 如何提高自己的专转本上岸几率&…...

【经验总结】10年的嵌入式开发老手,到底是如何快速学习和使用RT-Thread的?(文末赠书5本)

【经验总结】一位近10年的嵌入式开发老手&#xff0c;到底是如何快速学习和使用RT-Thread的&#xff1f; RT-Thread绝对可以称得上国内优秀且排名靠前的操作系统&#xff0c;在嵌入式IoT领域一直享有盛名。近些年&#xff0c;物联网产业的大热&#xff0c;更是直接将RT-Thread这…...

人大金仓和达梦的空间数据能力对比

一、总得来说&#xff1a; 人大金仓底层更解决于pg数据库&#xff0c; 人大金仓的空间能力基于postgis能力来实现&#xff0c;能力挺强大的. 细节上人大金仓的架构上也对空间的支持框架做的比达梦更加完善。例如数据库的集群能力&#xff0c;并行计算能力&#xff0c;空间数据…...

探析集团企业 1+N 模式,重新定义集团型CRM

目录 一、客户经营、运营监控 二、流程驱动、业务成长 三、规则规范 业务治理 什么是集团型CRM【1N】&#xff1f;本文中我们可以把集团看作为“1”&#xff0c;其他分公司或组织看作为“N”。本篇我们主要分析集团CRM业务定位。 我们从企业集团总部的职能定位确定集团CRM…...

卡特兰数

文章目录1、简介1.1 何为卡特兰数1.2 卡特兰数的通项公式2、应用2.1 题目1&#xff1a;括号合法题目描述思路分析2.2 题目2&#xff1a;进出栈的方式2.2.1 题目描述2.2.2 思路分析2.3 题目3&#xff1a;合法的序列2.3.1 题目描述2.3.2 思路分析2.3.3 代码实现2.4 题目4&#xf…...

分布式任务处理

分布式任务处理 1. 什么是分布式任务调度 视频上传成功需要对视频的格式进行处理&#xff0c;如何用Java程序对视频进行处理呢&#xff1f;这里有一个关键的需求就是当视频比较多的时候我们如何可以高效处理。 如何去高效处理一批任务呢&#xff1f; 1、多线程 多线程是充…...

Linux 命令复习

常用命令 1、目录操作 cd 切换目录 cd / 切换到根目录 cd ~ 回到个人用户的主目录 ls 查看当前目录下所有文件的详细信息 list的意思 ll 查看当前目录下所有文件的详细信息 pwd 显示当前目录的全路径 . …...

leetcode 困难 —— 天际线问题(优先队列)

&#xff08;思路感觉挺明显的&#xff0c;就是一些特殊情况得考虑清楚&#xff09; 题目&#xff1a; 城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度&#xff0c;请返回 由这些建筑物形成的 天际线 。 每个建筑物的几何信息…...

离散数学笔记_第一章:逻辑和证明(2 )

1.2 命题逻辑的应用1.2.1 语句翻译 1.2.2 系统规范说明 1.2.3 布尔搜索 1.2.4 逻辑谜题泥巴孩子谜题骑士和流氓&#xff08;考研逻辑题&#xff09;1.1.2.5 逻辑电路1.2.1 语句翻译 &#x1f433;为啥要翻译语句&#xff1f; ➡因语言常常有二义性&#xff08;有歧义&#x…...

MFCC语音特征值提取算法

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…...

TencentOS3.1编译安装redis6.2.5

下载地址&#xff1a;https://redis.io/download 最近版为7.0.8&#xff0c;本次安装的是6.2.5 软件包解包并进入目录。 redis是c语言编写的&#xff0c;编译需要gcc&#xff0c;按网上资料说默认安装的gcc版本过低&#xff08;可能是4.8.5&#xff09;&#xff0c;使用rpm …...

AI顶会accepted papers list

为方便相关paper调研&#xff0c;对相关顶会文章列表和下载地址汇总&#xff0c;会议包括&#xff1a;AAAI、ACL、IJCAI、ICLR、COLING、SIGIR、WSDM、WWW、ICML、KDD、NeurIPS、CVPR、ECCV、ACM MM 2023 Accepted papers list 更新于&#xff1a;&#xff08;2022.11.24&…...

IOS逆向之frida安装

首先手机要越狱&#xff0c;这个就不说了&#xff0c;博主就是咸鱼搞了个160的苹果6&#xff0c; 自己刷到苹果6支持最新的12.5.7版本后越狱&#xff1b; 谁让他低版本&#xff0c;不支持 CrackerXI砸壳呢&#xff0c;当时你要是使用 frida-ios-dump 也是可以的&#xff1b; …...

《金山区提信心扩需求稳增长促发展行动方案》的通知

金发改规〔2023〕1号 各镇政府、街道办事处、园区管委会&#xff0c;区政府各部门、各直属单位&#xff1a; 《金山区提信心扩需求稳增长促发展行动方案》已经区委、区政府同意&#xff0c;现印发给你们&#xff0c;请认真按照执行。 附件&#xff1a;金山区提信心扩需求稳增…...

【Redis】Java客户端JedisSpringDataRedis入门(三)

&#x1f697;Redis学习第三站~ &#x1f6a9;起始站&#xff1a;【Redis】概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 &#x1f44d;希望您能有所收获 在上一篇中我们学习了Redis常见命令的使用&#xff0c;显然&#xff0c;我们不可能一…...

挑选销售自动化工具应该关注什么功能?

销售自动化可以极大地提高你的生产力和效率&#xff0c;每周都为你节省时间。这样&#xff0c;你就可以把更多的时间用于完成交易&#xff0c;而减少用于行政任务的时间。市面上的销售自动化工具有很多&#xff0c;作为一般经验法则&#xff0c;以下是销售自动化工具中需要寻找…...

thread.join 是干什么的?原理是什么?

Thread.join 加了join&#xff0c;表示join的线程的修改对于join之外的代码是可见的。 代码示例&#xff1a; public class JoinDemo {private static int i 1000;public static void main(String[] args) {new Thread(()->{i 3000;}).start();System.out.println("…...

论文阅读 | Cross-Attention Transformer for Video Interpolation

前言&#xff1a;ACCV2022wrokshop用transformer做插帧的文章&#xff0c;q&#xff0c;kv&#xff0c;来自不同的图像 代码&#xff1a;【here】 Cross-Attention Transformer for Video Interpolation 引言 传统的插帧方法多用光流&#xff0c;但是光流的局限性在于 第一&…...

【C++修炼之路】22.哈希

每一个不曾起舞的日子都是对生命的辜负 哈希一.哈希概念及性质1.1 哈希概念1.2 哈希冲突1.3 哈希函数二.哈希冲突解决2.1 闭散列/开放定址法2.2 开散列/哈希桶三.开放定址法代码3.1 插入Insert3.2 查找Find3.3 删除Erase3.4 映射的改良&完整代码四.开散列代码4.1 插入Inser…...

HashMap原理(一):哈希函数的设计

目录导航哈希函数的作用与本质哈希函数设计哈希表初始容量的校正哈希表容量为2的整数次幂的缺陷及解决办法注&#xff1a;为了简化代码&#xff0c;提高语义&#xff0c;本文将HashMap很多核心代码抽出并根据代码含义为代码片段取名&#xff0c;完全是为了方便读者理解。哈希函…...

06--WXS 脚本

1、简介WXS&#xff08;WeiXin Script&#xff09;是小程序的一套脚本语言&#xff0c;结合 WXML &#xff0c;可以构建出页面的结构。 注意事项WXS 不依赖于运行时的基础库版本&#xff0c;可以在所有版本的小程序中运行。WXS 与 JavaScript 是不同的语言&#xff0c;有自己的…...

【Vue3】vue3 + ts 封装城市选择组件

城市选择-基本功能 能够封装城市选择组件&#xff0c;并且完成基础的显示隐藏的交互功能 &#xff08;1&#xff09;封装通用组件src/components/city/index.vue <script lang"ts" setup name"City"></script> <template><div class…...

C语言if判断语句的三种用法

C if 语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 语法 C 语言中 if 语句的语法&#xff1a; if(boolean_expression) {/* 如果布尔表达式为真将执行的语句 */ }如果布尔表达式为 true&#xff0c;则 if 语句内的代码块将被执行。如果布尔表达式为 false&…...

React中echarts的封装

做大屏的时候经常会遇到 echarts 展示 在 React &#xff08;^18.2.0&#xff09; 中对 echarts &#xff08;^5.4.0&#xff09; 的简单封装 echarts 封装使用 props 说明 参数说明类型可选值默认值opts初始化传入的 opts https://echarts.apache.org/zh/api.html#echarts…...

IV测试系统3A太阳能模拟器在光伏中应用

一、概述IV测试系统3A太阳能模拟器应具备光束准直、光斑均匀、辐照稳定、且与太阳光谱匹配的特点&#xff0c;使用户可足不出户的完成需要太阳光照条件的测试。科迎法电气提供多规格高品质的太阳模拟器&#xff0c;可适用于单晶硅、多晶硅、非晶硅、染料敏化、有机、钙钛矿等各…...

Vue 中过滤器 filter 使用教程

Vue 过滤器 filter 使用教程文章目录Vue 过滤器 filter 使用教程一、过滤器1.1 过滤器使用的背景1.2 格式化时间的不同实现1.3 过滤器的使用1.4 过滤器总结一、过滤器 1.1 过滤器使用的背景 过滤器提供给我们的一种数据处理方式。过滤器功能不是必须要使用的&#xff0c;因为它…...

源码numpy笔记

参考文章 numpy学习 numpy中的浅复制和深复制的详细用法 numpy中的np.where torch.gather() Numpy的核心数据结构&#xff0c;就叫做array就是数组&#xff0c;array对象可以是一维数组&#xff0c;也可以是多维数组 array本身的属性 shape&#xff1a;返回一个元组&#xf…...

免费做店招的网站/搭建一个app平台需要多少钱

目录 主要函数 caffe_cpu_gemm 函数caffe_cpu_gemv 函数caffe_axpy 函数caffe_set 函数caffe_add_scalar 函数caffe_copy 函数caffe_scal 函数caffeine_cup_axpby 函数caffe_add caffe_sub caffe_mul caffe_div 函数caffe_powx caffe_sqr caffe_exp caffe_abs 函数int caffe_rn…...

政府网站建设的文件是什么/如何推广小程序

这个是最近配置的一个在5510上面配置的Easy,本来打算把实验环境也做上去&#xff0c;但是因为忙&#xff0c;就先把配置单写出来吧。//Isakmp policy crypto isakmp policy 10 authentication pre-share encryption 3des hash sha group 2 exit //nat-pool ip local pool easy*…...

一个网站的后台怎么做/郑州网络推广方法

1、打开软件时&#xff0c;系统出现“无法连接数据库&#xff0c;请检查SQL服务器是否启动或网络是否正常”这样的错误提示。适用软件&#xff1a;3000STD、3000PRO、3000XP、3000NET(MSSQL版)文档内容&#xff1a;安装解决方法&#xff1a;出现此错误提示&#xff0c;主要为后…...

扬州做企业网站/武汉网络推广有哪些公司

埃默理大学(EmoryUniversity)或译艾文理大学&#xff0c;创校于1836年&#xff0c;为一位于美国佐治亚州亚特兰大之私立菁英大学。近一个世纪以来素享有“南哈佛 ”的美誉。根据2008年的美国新闻与世界报道大学排名&#xff0c;该校综合排名包含第17名&#xff0c;其中的商学院…...

做快餐 承包食堂的公司网站/搜索引擎环境优化

目录 事件绑定 1. 如何绑定事件 2. 获取事件对象 事件绑定 说明&#xff1a;能够独立绑定任何事件并能获取到事件对象e 1. 如何绑定事件 语法 on 事件名称 { 事件处理程序 } &#xff0c;比如&#xff1a;<div onClick{()>{}}></div> 注意点 react事件采…...

做的网站域名劫持/广州网站优化公司排名

Service 方法:不管是 get 方式还是 post 方式的请求&#xff0c;如果 Servlet 类中有 service 方法&#xff0c;则优先调用 Service 方法。 doGet 方法:在没有 service 方法的情况下如果是 get 方式的请求所调用的处理请求的方法doPost 方法:在没有 service 方法的情况下如果是…...