2_SQL

文章目录

  • SQL
    • 数据完整性
      • 实体完整性
      • 域完整性
      • 参照完整性
      • default(默认值)
      • comment(注释)
    • 多表设计
      • 一对一
      • 一对多
      • 多对多
      • 数据库三大范式
        • 第一范式:原子性
        • 第二范式:唯一性
        • 第三范式:数据的冗余
    • 多表查询
      • 连接查询
        • 交叉连接
          • inner join(内连接)
          • outer join(外连接)
      • 子查询
      • 联合查询
    • 数据库的备份与恢复
      • cmd命令行操作
      • 通过Navicat操作

SQL

数据完整性

实体完整性

列约束:MySQL可以对插入的数据进行特定的验证,只有满足条件才可以插入到数据表中,否则认为是非法插入。

主键(primary key)

  • 一个表只能有一个主键
  • 主键具有唯一性,主键不能重复
  • 主键字段的值不能为null
  • 声明字段时,用 primary key 标识
  • 主键可以由多个字段共同组成。此时需要在字段列表后声明的方法

eg:

create table test_primary(id int primary key,name varchar(255),address varchar(255)
);insert into test_primary values(1,"zhangsan","beijing");insert into test_primary values(1,"lisi","liaoning");select * from test_primary;出现error:
> 1062 - Duplicate entry '1' for key 'PRIMARY'
  • auto_increment(自动增长约束)

  • 一些序号,没有必须手动生成,想让mysql自动生成。

    • 自动增长必须为索引(主键或unique)

    • 只能存在一个字段为自动增长

    • 默认为1开始自动增长

eg:

create table test_autoincrement(id int primary key auto_increment,name varchar(255),address varchar(255)
);insert into test_autoincrement(name, address) values ("zhangsan", "beijing");insert into test_autoincrement(name, address) values ("lisi", "nanjing");insert into test_autoincrement(name, address) values ("wangwu", "jilin");-->
+----+----------+---------+
| id | name     | address |
+----+----------+---------+
|  1 | zhangsan | beijing |
|  2 | lisi     | nanjing |
|  3 | wangwu   | jilin   |
+----+----------+---------+
默认从1开始自动增长

自动增长是不是一定会连续?

  • 不能
  • 比如说自己手动插入了一个id = 100的数据,则下次auto_incrementid = 101开始
  • 再比如表里有unique字段,插入了一个重复的值,导致插入失败,会导致插入id不连续

域完整性

  • null/not null
    • not null:代表不允许为空,如果插入了null,则会报错
  • unique
    • 不能重复
    • 允许插入null
    • null可以重复

unique与primary key的区别和联系

  • 都不能存储重复的值
  • primary key不能存储null,unique能存储null

参照完整性

  • 外键

default(默认值)

  • 如果不指定值,则使用默认值
  • 如果指定了值,则就用指定的值

eg:

create table tab 
( create_time timestamp default current_timestamp );-- 表示将当前时间的时间戳设为默认值。
current_date, current_time

comment(注释)

  • 给自己看的

eg:

create table test_comment(id int primary key auto_increment,name varchar(255) comment "名字",status int comment "0表示未付款,1表示已付款,2"
);

多表设计

一对一

  • 一对一是指两个表中的数据是一一对应的
    • 比如:人和身份证号、用户和用户详情

存储关系

  • 一对一的情况,关系可以存储在任意一张表上,只要新增一个字段。
  • 所有的一一对应的表,在逻辑上,都可以合并为一个表,但是出于效率的考虑没有合并

一对多

  • 存在表A和表B,表A中的一条数据,对应表B中的多条数据;而表B中的一条数据,对应表A中的一条数据
    • 比如:学生和班主任

存储关系

  • 关系存储在多的一方

多对多

  • 指存在表A和表B,表A中的一条数据,对应表B中的多条数据;而表B中的一条数据,对应表A中的多条数据。
    • 比如:学生和课程、订单和商品

存储关系

  • 需要额外一张表来存储之间的关系

数据库三大范式

第一范式:原子性
  • 我们存储在数据库的列,应该保持原子性。
    • 比如:地址
第二范式:唯一性
  • 每一张表,需要有一个主键
第三范式:数据的冗余
  • 数据不要冗余
  • 右边这里即存储了班主任id又存储了班主任姓名,造成了冗余在这里插入图片描述
  • 冗余的好处
    • 查询速度快
  • 冗余的坏处
    • 耗费磁盘
    • 修改的时候,要修改多张表

反范式化设计

  • 如果你的需求频繁的要根据学生找老师名
  • 查询的需求远远大于修改的需求

多表查询

-- 如果user这个表存在,就去删除
drop table if exists user;create table user(id int primary key auto_increment,name varchar(255),password varchar(255)
);

连接查询

交叉连接
  • 就是求多个表的笛卡尔积
  • 交叉连接的结果没有实际的意义
    • 但是内连接和外连接都是基于交叉连接的结果去筛选的

eg:

select * from student_test cross join test_primary;-->
+------+----------+------+---------+--------+----+----------+---------+
| id   | name     | age  | address | remark | id | name     | address |
+------+----------+------+---------+--------+----+----------+---------+
|    1 | lihua    |   20 | china   | None   |  1 | zhangsan | beijing |
|    2 | zhangsan |   18 | Asia    | None   |  1 | zhangsan | beijing |
|    3 | mike     |   21 | china   | None   |  1 | zhangsan | beijing |
|    4 | Jack     |   18 | china   | None   |  1 | zhangsan | beijing |
+------+----------+------+---------+--------+----+----------+---------+
inner join(内连接)
  • 从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息

eg:

-- 内连接只返回符合连接条件的数据
select * from student_test inner join test_primary on student_test.id = test_primary.id;-->
+------+-------+------+---------+--------+----+----------+---------+
| id   | name  | age  | address | remark | id | name     | address |
+------+-------+------+---------+--------+----+----------+---------+
|    1 | lihua |   20 | china   | None   |  1 | zhangsan | beijing |
+------+-------+------+---------+--------+----+----------+---------+-- 1. 一般会先取别名,给表取名
-- 2. 先用*来占位,最后需要什么数据,再通过 别名.属性名拿取
select st.name,tp.address
from student_test st inner join test_primary tp on st.id = tp.id;-->
+-------+---------+
| name  | address |
+-------+---------+
| lihua | beijing |
+-------+---------+
outer join(外连接)
  • 左外连接:会在内连接的结果的基础之上,去和左表做并集会保留左表的全部数据

    • left outer join / left join
  • 右外连接:会在内连接的结果的基础之上,去和右表做并集会保留右表的全部数据

    • right outer join / right join
  • outer是可以省略的,可以写成left join或者right join

eg:

-- 左外连接
-- 左外连接:会保存左表的全部数据
select * from student_test st left outer join test_primary tp on st.id = tp.id;-->
+------+----------+------+---------+--------+------+----------+---------+
| id   | name     | age  | address | remark | id   | name     | address |
+------+----------+------+---------+--------+------+----------+---------+
|    1 | lihua    |   20 | china   | None   |    1 | zhangsan | beijing |
|    2 | zhangsan |   18 | Asia    | None   | NULL | NULL     | NULL    |
|    3 | mike     |   21 | china   | None   | NULL | NULL     | NULL    |
| NULL | Jack     |   18 | china   | None   | NULL | NULL     | NULL    |
+------+----------+------+---------+--------+------+----------+---------+-- 右外连接
-- 右外连接:会保存右表的全部数据
select * from student_test st right outer join test_primary tp on st.id = tp.id;-->
+------+-------+------+---------+--------+----+----------+---------+
| id   | name  | age  | address | remark | id | name     | address |
+------+-------+------+---------+--------+----+----------+---------+
|    1 | lihua |   20 | china   | None   |  1 | zhangsan | beijing |
+------+-------+------+---------+--------+----+----------+---------+

每次写数据库的时候,在代码前面要加上:drop table if exists 表名;,但是修改表的时候不要运行,否则写好的数据就会清除。

inner join,left (outer) join,right (outer) join的区别

  • inner join只会保留on后面条件符合的(也可以说交集)
  • left join除了保留交集,还会保留左表的所有数据
  • right join除了保留交集,还会保留右表的所有数据

写关联查询最重要的两件事

  1. 使用什么连接
  2. 关联条件

子查询

  • 又称为嵌套查询。

  • 一个SQL语句的结果可以作为另外一个SQL语句的条件

  • 子查询很符合直觉,但是速度太慢了,能不用就尽量不要用

    • 子查询会生成临时表

eg:

-- 首先先拿到Java的id
select id from tec_cource where name='Java';
-- 然后再把这个id=1放给第二个
select * from tec_sele_cource where cource_id=1;
select * from tec_stu where id in (1,3);---->
-- 看学生信息
select * from tec_stu where id in (-- 看哪些学生选了 Javaselect student_id from tec_sele_cource where cource_id=(-- 获取Java的idselect id from tec_cource where name='Java')
)

联合查询

  • SQL支持把多个SQL语句的结果拼装起来
  • union将两个SQL的结果,拼接起来返回
  • 两条SQL返回的列应当一致
    eg:
select * from students where class = '一班'
union
select * from students where class = '二班';等价于
select * from students where class = ('一班', '二班');

数据库的备份与恢复

cmd命令行操作

# 备份
# 1. 打开命令行
mysqldump -uroot -p dbName(数据库的名称) > c:/path/dbName.sql(就是要存储的路径名)
-- > 表示把这个数据库输出到哪里# 恢复
# 1. 打开命令行
# 2. 连接MySQL服务器
mysql -uroot -p# 3. 选中数据库(假如没有合适的数据库,可以新建一个)
use dbName;
# 4. 执行文件中的SQL语句,恢复数据
source c:/path/dbName.sql

通过Navicat操作

  • 备份
    在这里插入图片描述
  • 恢复
    在这里插入图片描述

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

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

相关文章

JQMobile Loader Widget 遮罩层改造

最近在用jqmobile 做一个混合APP项目时候用到 jqmobile1.4.3提供的Loader Widget控件,但是这个控件本身是一个loading弹出层,这个弹出层弹出之后,用户还是可以去点击按钮,重复发送请求,为了防止重复提交,我想了两种办法, 1,在loading弹出层弹出之后,让按钮不可用.但是form表单…

记录SSM项目集成Spring Security 4.X版本 之 加密验证和记住我功能

目录 前言 一、用户登录密码加密认证 二、记住我功能 前言 本次笔记的记录是接SSM项目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架实现登录和主页菜单显示-CSDN博客https://blog.csdn.net/u011529483/article/details/136255768?spm1001.2014.3001.5502 文章之后补…

Python列表的合并、重复、判断与切片操作你学会了吗

1.合并列表 通过 实现 list1 ["佛跳墙", "肠粉", "刀削面", "烤鸭"]list2 [32, 4, 5, 7.43, True]list3 list1 list2print(list3) # [佛跳墙, 肠粉, 刀削面, 烤鸭, 32, 4, 5, 7.43, True] 2.重复输出列表中的元素 通过 * 实…

vue3 中 主题定制

vue3 中 主题定制 背景 做多主题定制,黑/白 ,里面还要再分各种颜色,每次进来都要记住上次的主题设置 效果图 一、目录结构 ├── generated │ ├── theme │ │ └── dark-yellow.ts │ │ └── dark-orange.ts │ │…

「算法」常见位运算总结

位运算符 异或 按位异或可以实现无进位相加,所谓无进位相加,就是在不考虑进位的情况下将两个数相加(后面有道题需要用到这种操作) 异或的运算律 ①a ^ 0 a ②a ^ a 0 ③a ^ b ^ c a ^ ( b ^ c ) 有符号右移>> 将一个…

IDEA切换 Springboot初始化 URL

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期热门专栏回顾 专栏…

云计算 2月20号 (认识操作系统)

1、认识操作系统 计算机系统的组成 知识点1:没有软件系统的计算机称之为"裸机" 知识点2:裸机提供基本的可计算性资源 知识点3:操作系统是最靠近硬件的软件层,负责管理和控制计算机硬件。 计算机硬件组成五大部件 运算器…

代码随想录算法刷题训练营day29:LeetCode(491)递增子序列、LeetCode(46)全排列、LeetCode(47)全排列 II

代码随想录算法刷题训练营day29:LeetCode(491)递增子序列、LeetCode(46)全排列、LeetCode(47)全排列 II LeetCode(491)递增子序列 题目 代码 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; im…

2024年AI全景预测

欢迎来到 2024 年人工智能和技术的可能性之旅。 在这里,每一个预测都是一个潜在的窗口,通向充满创新、变革、更重要的是类似于 1950 年代工业革命的未来。 20 世纪 50 年代见证了数字计算的兴起,重塑了行业和社会规范。 如今,人工…

力扣1143. 最长公共子序列(动态规划)

Problem: 1143. 最长公共子序列 文章目录 题目描述思路复杂度Code 题目描述 思路 我们统一标记:str1[i]代表text1表示的字符数组,str2[j]代表text2表示的字符数组;LCS代表最长的公共子序列;(我们易得只有str1[i]和str…

Flutter中Widget的生命周期

Widget生命周期: createState-initState-didChangeDependency-build-deactive-dispose 可通过WidgetsBinding类对widget生命周期的回调进行监控。 createState:StatefulWidget 中用于创建 State; initState:State 的初始化操作&am…

CLion远程调试C++

文件映射到 可以右键文件夹选择重新Cmake 编译

xsslabs第七关

源码 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script> window.alert function() { confirm("完成的不错&#xff01;"…

【刷题】Leetcode 1609.奇偶树

Leetcode 1609.奇偶树 题目描述广度优先搜索&#xff08;BFS&#xff09;深度优先算法&#xff08;DFS&#xff09; 思路一&#xff08;BFS&#xff09;思路二&#xff08;DFS&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&a…

数字后端——DEF文件格式

文章目录 MACRO的不同orientationDEF中在macro orientation定义前需要留空格 MACRO的不同orientation DEF中在macro orientation定义前需要留空格 像下图中这种方向和分号之间没有空格的情况&#xff0c;就是有问题的格式。

数学学习与研究杂志社《数学学习与研究》杂志社编辑部2023年第29期目录

考试研究 提高高三数学二轮复习质量的思考与实践 佘淮青; 2-4 提升高三数学复习质量的策略探究 王飞; 5-7 核心素养背景下的高中数学命题策略研究 陈明发; 8-10 提升中考数学复习课的有效性研讨 韩兴宏; 11-13 中学教学方法《数学学习与研究》投稿&#xff1a;…

pyuic生成py文件到指定文件夹

pyuic生成py文件到指定文件夹 关于如何在pycharm配置外部工具的方法这里不做赘述&#xff0c;本文主要说明&#xff0c;如何利用pyuic将ui文件生成到指定的项目目录中。 前提条件&#xff1a;已配置的pyuic工具可以正常使用生成文件到目录中。 一、打开外部工具配置页面 打开…

如何用Python检查时间序列数据是否平稳?

时间序列数据通常以其时间性质为特征。这种时间性质为数据增加了趋势或季节性&#xff0c;使其与时间序列分析和预测兼容。如果时间序列数据不随时间变化或没有时间结构&#xff0c;则称其为静态数据。因此&#xff0c;检查数据是否平稳是非常必要的。在时间序列预测中&#xf…

用HTML5的<canvas>元素实现刮刮乐游戏

用HTML5的<canvas>元素实现刮刮乐 用HTML5的<canvas>元素实现刮刮乐&#xff0c;要求&#xff1a;将上面的“图层”的图像可用鼠标刮去&#xff0c;露出下面的“图层”的图像。 示例从简单到复杂。 简单示例 准备两张图像&#xff0c;我这里上面的图像top_imag…

7、Redis-事务、持久化、内存淘汰机制和过期key处理

目录 一、事务 二、持久化 三、内存淘汰机制 四、过期key处理 一、事务 Redis的事务本质上就是一个批量执行命令的操作。分为三个步骤&#xff1a; 开始事务&#xff1a;multi命令入队&#xff1a;正常输入命令即可执行事务&#xff08;依次执行命令&#xff09;&#xf…