Mysql基础2-多表查询和视图

约束

完整性约束

  • 为防止不规范数据进入数据库中,在用户对数据进行插入,修改,删除操作时,MySQL提供了一种机制来检查数据库中的数据是否满足规定的条件
约束条件约束描述
PRIMARY KEY主键约束
NOT NULL非空约束,字段不能为空
UNIQUE唯一约束,字段值唯一
CHECK检查约束,检查取值范围
DEFAULT默认值约束,提供默认值
AUTO_INCREMENT自动增加约束,约束字段的值自动递增
FOREIGN KEY外键约束,约束表与表之间关系
  • 列级约束
CREATE TABLE t_student(
sno INT(4) PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(5) NOT NULL,
sex CHAR(1) DEFAULT '男' CHECK(sex="男" || sex="女"),
eamil VARCHAR(15) UNIQUE
);
  • 表级约束
CREATE TABLE t_student(
sno INT(4),
sname VARCHAR(5),
sex CHAR(1),
eamil VARCHAR(15),
CONSTRAINT pk_stu PRIMARY KEY (sno),
CONSTRAINT ck_stu_sex CHECK (sex='男'||sex='女'),
);

外键约束

  • 外键约束是用来实现数据库表的参照完整性的,可以使两张表紧密结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性
  • 外键是指表中某个字段的值依赖于另一张表中某个字段值,而被依赖的值必须具有主键约束或者唯一约束。被依赖的表称为父表或者主表,设置外键约束的表称为子表或者从表
-- 创建主表
CREATE TABLE t_class(
cno INT(4) PRIMARY KEY auto_increment,
cname VARCHAR(10) NOT NULL,
room CHAR(4)
);
-- 创建子表
CREATE TABLE t_student(
cno INT(4) PRIMARY KEY auto_increment,
sname VARCHAR(5) NOT NULL,
classno int(4)
)
-- 设置外键约束 可以在创建表约束也可以后面添加
CREATE TABLE t_student(
cno INT(4) PRIMARY KEY auto_increment,
sname VARCHAR(5) NOT NULL,
classno int(4),
CONSTRAINT fk_stu_classno FOREIGN KEY (classno) REFERENCES t_class (cno)
)
ALTER TABLE t_student ADD CONSTRAINT fk_stu_classno FOREIGN KEY (classno) REFERENCES t_class (cno)

外键策略

  • no action 不允许操作
-- 先将对应键改为null
UPDATE t_student set classno = NULL WHERE classno = 2
-- 再删除从表
DELETE FROM t_class WHERE cno =2
  • cascade级联操作,操作主表影响从表的外键信息
-- 删除已有的约束
ALTER TABLE t_student DROP FOREIGN KEY fk_stu_classno;
-- 添加新的,再删除或者更改时将已有的置为null
ALTER TABLE t_student ADD CONSISTENT fk_stu_classno FOREIGN KEY (classno) REFERENCES t_class (cno) on UPDATE CASCADE ON DELETE CASCADE
  • set null置空操作
-- 删除已有的约束
ALTER TABLE t_student DROP FOREIGN KEY fk_stu_classno;
-- 置新添加外键约束
ALTER TABLE t_student ADD CONSTRAINT fk_stu_classno FOREIGN KEY (classno) REFERENCES t_class (cno) ON UPDATE CASCADE ON DELETE CASCADE;

函数

MySQL中提供了大量的函数来简化用户对数据库的操作,比如字符串处理,日期的运算,数值的运算

单行函数

  • 单行函数是指对每一条记录输入值进行运算,并得到相应的计算结果,然后返回给用户,也就是说,每条记录作为参数传递,计算得到每条记录返回值
SELECT empno,ename,LOWER(ename),UPPER(iob) FROM emp;
-- 转换大小写
  • 常用单行函数主要包括字段串函数,数值函数,日期与时间函数,流程函数以及其他函数

多行函数

SELECT MAX(empno),MIN(empno),COUNT(empno),SUM(empno),AVG(empno) FROM emp;
-- 计算出总共的数据结果

多表查询

  • 需要对多张表进行查询,而这多张表需要使用外键和主键关联在一起,然后使用连接查询来查询多-张表中满足的要求
  • 连接查询类型 cross natural using on
-- 交叉连接
SELECT * FROM emp CROSS JOIN dept;
-- 缺点没有指定字段所属表,效率低-- 指定来自哪个表
SELECT e.DEPTNO,e.IOB,d.LOC
FROM emp e
NATURAL JOIN dept d;-- 自然连接 natural join 缺点:自动匹配表中所有同名列
-- 解决:USING
SELECT *
FROM emp e
INNER JOIN dept d
USING(DEPTNO)-- using缺点,关联的字段必须是同名的
-- 解决 内连接 ON
SELECT *
FROM emp e
INNER JOIN dept d
ON (e.deptno = d.deptno)-- 内连接缺点:只显示匹配信息
-- 外连接:可以显示不匹配信息
-- 左外连接 左边全展示
SELECT *
FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno = d.deptno
-- 右外连接 右边全展示
SELECT *
FROM emp e
RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno
-- 全外连接 全部展示,MySQL 不支持
SELECT *
FROM emp e
FULL OUTER JOIN dept d
ON e.deptno = d.deptno
-- 解决全外连接
SELECT *
FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno = d.deptno
UNION
SELECT *
FROM emp e
RIGHT OUTER JOIN dept d
ON e.deptno = d.deptnoSELECT *
FROM emp e
RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno
INNER JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisal;

子查询

单行子查询

  • 执行多条select语句
-- 先执行括号里的,在执行外面的
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE eanme = 'jack')

多行子查询

-- 查询deptno = 20里的job 在deptno =10里面有的数据
SELECT * FROM emp
WHERE deptno = 20
AND job in (SELECT job FROM emp WHERE deptno =10)-- 查询任意一个都小
SELECT * 
FROM emp
WHERE sal < ANY(SELECT sal FROM emp WHERE job = 'clerk')
AND job != 'clerk';

事务

事务是用来维护数据库完整性的,它能够保证一系列MySQL操作要么全执行,要么全不执行

CREATE TABLE account(
id INT PRIMARY KEY auto_increment,
uname VARCHAR(10) NOT NULL,
balance DOUBLE
)SELECT * FROM account;INSERT INTO account VALUES (null,'小明',2000),(NULL,'丽丽',3000);-- 丽丽向小明转200
UPDATE account SET balance = balance - 200 WHERE id = 1; 
UPDATE account SET balance = balance + 200 WHERE id = 2;-- 手动开启事务
START TRANSACTION;
UPDATE account SET balance = balance - 200 WHERE id = 1;
UPDATE account SET balance = balance + 200 WHERE id = 2;
-- 手动回滚 刚才操作回滚
ROLLBACK;
-- 手动提交
COMMIT;

脏读

当一个事务正在访问数据并且对数据进行了修改,而这种修改还没提交到数据库中,这时另一个事务也访问了这个数据,因为这个数据还没提交,另一个事务访问到的是脏数据,依据脏数据做的操作时不正确的

不可重复读

指在一个事务内多次读同一数据,在这个事务还没结束时,另一个事务也访问了数据,在第一个事务多次读数据之间,第二个的修改导致第一个事务两次读取不一样,因此称为不可重复读

幻读

幻读与不可重复读类似,它发生在一个事务读取了几行数据,另一个事务插入一些数据时。在随后的查询中,第一个事务就会发现多了一些原本不存在的记录

事务隔离

解决脏读,不可重复读,幻读问题

隔离级别脏读不可重读读幻读
READ UNCOMMITTED
READ COMMITTED×
REPEATABLE READ××
SERIALIZABLE×××
-- 查看默认事务隔离级别
SELECT @@transaction_isolation;-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

视图

将多个表整合到一个视图中,这样只用关注数据结构而不用关注表之间联系

-- 创建视图 可以修改表中数据
CREATE VIEW myView01
AS
SELECT * FROM emp WHERE deptno =20;
-- 查看视图
SELECT * FROM myView01;-- 创建/替换多表视图 不能修改表中数据
CREATE OR REPLACE VIEW myView02
AS
SELECT * FROM emp JOIN dept on emp.DEPTNO = dept.DEPTNO
WHERE sal > 2000

存储过程

将存储语句封装起来,需要时调用

CREATE PROCEDURE myPro1(name VARCHAR(10))
BEGINif name IS NULL OR name = '' THENSELECT * FROM emp;ELSESELECT * FROM emp WHERE ename LIKE CONCAT('%',name,'%');END IF;
END;		
-- 删除存储过程
DROP PROCEDURE myPro1;
-- 调用存储过程
CALL myPro1('R')-- FOUND_ROWS() 内置函数,返回查询的条数
CREATE PROCEDURE myPro1(in name VARCHAR(10),out num INT(3))
BEGINif name IS NULL OR name = '' THENSELECT * FROM emp;ELSESELECT * FROM emp WHERE ename LIKE CONCAT('%',name,'%');END IF;SELECT FOUND_ROWS() INTO num;
END;		

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

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

相关文章

解决oracle的em访问提示“使用不受支持的协议。”的bug

1. 设置oracle唯一名称 执行emctl时需要设置一个唯一的名称 否则提示 “Environment variable ORACLE_UNQNAME not defined. Please set ORACLE_UNQNAME to database unique name. ”中文意思为“未定义环境变量ORACLE_UNQNAME。 请将ORACLE_UNQNAME设置为数据库唯一名称/服务…

微服务-Nacos(注册中心)

Nacos是SpringCloud的一个功能非常强大的组件&#xff0c;想比eureka的功能更加丰富 官方的nacos简介 Nacos&#xff08;全称&#xff1a;Naming and Configuration Service&#xff09;是一个开源的动态服务发现、配置管理和服务管理平台。它由阿里巴巴集团开发并贡献给开源…

tensorflow 模型计算中,预测错误;权重参数加载

tensorflow 模型计算中&#xff0c;预测错误&#xff1b;权重参数加载 tensorflow 模型计算主要代码&#xff08;正确代码&#xff09; linear1_kernel_initializer tf.constant_initializer(numpy.transpose(data["linear1.weight"])) linear1_bias_initializer …

【设计模式——学习笔记】23种设计模式——策略模式Strategy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入传统方案实现实现分析 介绍基本介绍登场角色 案例实现案例一类图实现 案例二类图实现问答 策略模式在JDK源码中的使用总结文章说明 案例引入 有各种鸭子&#xff0c;比如野鸭、北京鸭、水鸭等。 鸭子有各种行为&#xff0c;比如走路、叫、飞行等。不同鸭子的…

设置Linux 静态IP

LInux虚拟机默认的IP地址是动态获取的 作为服务器&#xff0c;我们一般还需要把IP地址设置为静态的 设置静态IP vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno # BOOTPROTOdhcp 动态获取 BOOTPROTOstatic IPADDR"192.16…

vue 重写数组的七个方法

一、为什么要重写数组方法&#xff1f; Vue 为了实现响应式数据绑定&#xff0c;需要能够捕获到数据的变化&#xff0c;以便在数据发生改变时自动更新视图。JavaScript 中的数组是引用类型&#xff0c;所以常规的引用跟踪机制不能捕获数组内部的变化。因为Vue的响应式是通过 O…

安防监控视频云存储EasyCVR平台H.265转码功能更新:新增分辨率配置

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…

C++ string类详解

⭐️ string string 是表示字符串的字符串类&#xff0c;该类的接口与常规容器的接口基本一致&#xff0c;还有一些额外的操作 string 的常规操作&#xff0c;在使用 string 类时&#xff0c;需要使用 #include <string> 以及 using namespace std;。 ✨ 帮助文档&…

【HarmonyOS】服务卡片 API6 JSUI跳转不同页面

【引言】 “JS卡片支持为组件设置action&#xff0c;包括router事件和message事件&#xff0c;其中router事件用于应用跳。若设置router事件&#xff0c;则action属性值为"router"&#xff1b;abilityName为卡片提供方应用的跳转目标Ability名&#xff1b;params中的…

基于java民宿管理系统设计与实现

摘 要 伴随着我国旅游业的快速发展&#xff0c;民宿已成为最受欢迎的住宿方式之一。民宿借助互联网和移动设备的发展&#xff0c;展现出强大的生命力和市场潜力。民宿主要通过各种平台如携程、去哪儿、淘宝等在网络上销售线下住宿服务&#xff0c;同时民宿经营者也需要从网络上…

Spring Security6 最新版配置该怎么写,该如何实现动态权限管理

Spring Security 在最近几个版本中配置的写法都有一些变化&#xff0c;很多常见的方法都废弃了&#xff0c;并且将在未来的 Spring Security7 中移除&#xff0c;因此又补充了一些新的内容&#xff0c;重新发一下&#xff0c;供各位使用 Spring Security 的小伙伴们参考。 接下…

模板编程-成员特化

成员特化:类模板特化除了可以对整个类进行特化外,可以只针对某部分成员函数进行特化 全类特化和成员特化都属于全局特化 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring>template<typename T> class CMath { public:CMath(const…

文章评论以及回复评论邮件通知(Go 搭建 qiucode.cn 之八)

要说到评论。无疑是博客应用的灵魂所在了,它也正是站长与博友、博友与博友之间互相交流的桥梁,倘若少了它,博客应用将变得暗淡无关,索然无味,恍如一具躺在床榻上的植物人,终究是无法与周边人言语的。 也正是有了评论,站长在该博客应用所发表的博文,博友才得以通过评论,…

LeetCode--HOT100题(33)

目录 题目描述&#xff1a;148. 排序链表&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;148. 排序链表&#xff08;中等&#xff09; 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 LeetCode做题链接&#xff1…

VR/AR眼镜方案,MTK联发科平台智能眼镜安卓主板设计方案

随着人工智能在不同领域的逐渐深入&#xff0c;人们对一款产品的需求不再局限于某种单一的功能或单一场景&#xff0c;尤其是在工业医疗等专业领域&#xff0c;加快数字化转型才能实现产业的升级。 AR智能眼镜&#xff0c;是一个可以让现场作业更智能的综合管控设备。采用移动…

Hlang--用Python写个编程语言-函数与基本数据结构实现

文章目录 前言语法表述解析器修改词法解析函数节点函数节点解析List的解析实现解释器节点函数操作String和List处理总结前言 okey,经过一段时间的努力,接下来要实现的是函数。当然还有对应的基本数据结构,那么之后的话,我们的工作就开始进一步转换了。 那么在这块我们要实…

vscode搭建java开发环境

一、配置extensions环境变量VSCODE_EXTENSIONS 该环境变量路径下的存放安装组件&#xff1a; 二、setting配置文件 {"java.jdt.ls.java.home": "e:\\software\\jdk\\jdk17",// java运行环境"java.configuration.runtimes": [{"name":…

vscode远程连接Linux失败,提示过程试图写入的管道不存在(三种解决办法)

vscode报错如下&#xff1a; 一、第一种情况 原因是本地的known_hosts文件记录服务器信息与现服务器的信息冲突了&#xff0c;导致连接失败。 解决方案就是把本地的known_hosts的原服务器信息全部删掉&#xff0c;然后重新连接。 二、第二种情况 在编写配置文件config时&…

批量提取文件名到excel,详细的提取步骤

如何批量提取文件名到excel&#xff1f;我们的电脑中可能存储着数量非常多的电子文件&#xff0c;现在需要快速将这些文件的名称全部提取到Excel中。虽然少量数据可以通过复制粘贴的方式轻松完成&#xff0c;但是对于上万个数据而言&#xff0c;复制粘贴都是行不通的&#xff0…

设计模式十五:命令模式(Command Pattern)

命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它旨在将请求或操作封装成一个对象&#xff0c;从而允许你将不同的请求参数化&#xff0c;并且能够在不同的时间点执行或者队列化这些请求。这种模式使得请求发送者与接收者之间解耦&#xff…