MySQL小记——约束、多表查询

news2024/11/25 15:45:49

目录

约束

常见约束

主键约束

非空约束

唯一约束

自增长约束

非负约束

外键约束之一对多

外键约束之多对多

多表查询

内连接

外连接

左外连接

右外连接 

子查询

自查询

case when语句


约束

在MySQL中,约束是对字段规则的一种限制。

常见约束

1.主键约束

非空且唯一 ,一张表一个主键

2.非空约束

3.唯一约束

4.外键约束

5.自增长约束

6.非负约束

主键约束

primary key

添加主键方式一:

CREATE TABLE student (
  id INT PRIMARY KEY,
  -- 添加主键约束
  sname VARCHAR (32),
  sage TINYINT
);

添加主键方式二:

CREATE TABLE student2 (
  id INT,
  sname VARCHAR (32),
  sage TINYINT,
  PRIMARY KEY (id) -- 添加主键
);

添加主键方式三:

alter table student3 add primary key(id);

联合主键:

多个字段看作一个整体来添加主键

PRIMARY KEY (id,sname) -- 添加联合主键

非空约束

not null  //不能为空

CREATE TABLE student9(
   id INT PRIMARY KEY ,
   sname VARCHAR(32) ,
   sage TINYINT NOT NULL 
);

唯一约束

unique    对null值不起作用

方式一:

CREATE TABLE student5 (
  id INT PRIMARY KEY,
  sname VARCHAR(32) UNIQUE, -- 添加唯一约束
  sage TINYINT
);

方式二:

CREATE TABLE student (
  id INT PRIMARY KEY,
  sname VARCHAR(32),
  sage TINYINT,
  UNIQUE(sname) -- 添加唯一约束
);

方式三:

ALTER TABLE student ADD UNIQUE(sname,sage);

自增长约束

跟主键一起使用

primary key auto_increment

删掉那条记录后,再添加,不会再从那个主键开始

例 id 1 2 3

删3再增加

id 变为 1 2 4

非负约束

unsigned 

类型字节最小值最大值
(带符号的/无符号的)(带符号的/无符号的)
TINYINT1-128127
0255
SMALLINT2-3276832767
065535
MEDIUMINT3-83886088388607
016777215
INT4-21474836482147483647
04294967295
BIGINT8-92233720368547758089223372036854775807
018446744073709551615

CREATE TABLE student(
   id INT PRIMARY KEY AUTO_INCREMENT,  -- 主键自增长
   sname VARCHAR(32),
   sage TINYINT UNSIGNED -- 0-255
);

外键约束之一对多

保证了数据的有效性和完整性

一般在多表方,添加外键约束,去关联一表的主键。

-- 创建用户表
    CREATE  TABLE USER(
        id INT PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(20)
    )
    
    -- 创建订单表
    CREATE  TABLE orders(
        id INT PRIMARY KEY AUTO_INCREMENT,
        totalprice DOUBLE,
        user_id INT   -- 外键 
    );

添加外键方式一:

在创建表时,添加主键

foreign key(uid) references user(id);

添加主键方式二:

改变表

alter table orders add foreign key(uid) references user(id);

外键约束特点:

1.从表不能添加数据

2.主表不能删除数据

正确的删除操作是:先删除从表数据,再删除主表数据

级联更新和级联删除

通常和外键约束一起使用

级联更新:on update cascade

级联删除:on delete cascade

外键约束之多对多

引入一张中间表,存放两张表的主键,一般会将这两个字段设置为联合主键,这样就可以将多对多

的关系拆分成两个一对多了,为了保证数据的有效性和完整性,需要在中间表上添加两个外键约束

例:

订单表和商品表为多对多关系

-- 创建订单表
    CREATE  TABLE orders(
        oid INT PRIMARY KEY AUTO_INCREMENT,
        totalprice DOUBLE,
        user_id INT   -- 外键 
    );

-- 创建商品表
    create table product(
        pid int primary key auto_increment,
        name varchar(20),
        price double
    );

-- 创建中间表
    create table orderitem(
        ooid int,
        ppid int
    );

-- 添加外键约束 
    alter table orderitem add foreign key(ooid) references orders(oid);
    alter table orderitem add foreign key(ppid) references product(pid);

多表查询

多张表关联起来进行查询

若没有进行关联进行查询:

SELECT user.*,orders.* FROM USER,orders 

则查询出来的数据按照笛卡尔积顺序排布

表1:

 表2:

查询结果:

id    username    id    price    user_id
3    张三    1    1314    3
4    李四    1    1314    3
5    王五    1    1314    3
6    赵六    1    1314    3
3    张三    2    1314    3
4    李四    2    1314    3
5    王五    2    1314    3
6    赵六    2    1314    3
3    张三    3    15    4
4    李四    3    15    4
5    王五    3    15    4
6    赵六    3    15    4
3    张三    4    315    5
4    李四    4    315    5
5    王五    4    315    5
6    赵六    4    315    5
3    张三    5    1014    \N
4    李四    5    1014    \N
5    王五    5    1014    \N
6    赵六    5    1014    \N

内连接

添加条件  where

-- 查询所有用户的所有订单。

SELECT user.*,orders.* FROM USER,orders WHERE user.`id`=orders.`user_id`;

-- 查询张三用户的所有订单。

SELECT user.*,orders.* FROM USER,orders WHERE user.`id`=orders.`user_id` AND user.`username`='张三';

内连接写法:

1.隐式内连接

如上所写

2.显式内连接  inner join on 

SELECT user.*,orders.* FROM USER INNER JOIN orders ON user.`id`=orders.`user_id`;

外连接

左外连接

-- left关键字分左右,left左边的这张表中的数据,会全部展示出来,在右边没有对应的数据以null展示

内连接查询结果:

左外连接:

SELECT user.*,orders.* FROM USER LEFT OUTER JOIN orders ON user.`id`=orders.`user_id`;

查询结果:

右外连接 

查询所有订单信息,以及订单信息对应的用户信息,要求订单信息全部展示出来,订单没有对应的

用户以null展示

--  以 RIGHT 分左右,右边的表中的数据 ,全部展示出来,在左边没有对应的以null展示。

SELECT orders.*,user.* FROM USER RIGHT OUTER JOIN orders ON orders.`user_id`=user.`id`;

查询结果:

注意:多表查询常给表起别名

 SELECT o.*,u.* FROM orders AS o LEFT OUTER JOIN USER AS u ON u.`id`=o.`user_id`;

as可省略不写

子查询

简而言之,就是查询里面再套一层查询

查看用户为张三的订单详情

SELECT orders.* FROM orders WHERE user_id=(SELECT user.id FROM USER WHERE user.`username`='张三');

自查询

-- 查询这个员工的上司

-- 假设有两张表一张员工表,一张老板表,如果员工的老板号=老板的员工号 就表示这个员工是另外一个员工的老板

SELECT a.ename AS 员工姓名,b.ename AS 老板姓名 FROM emp a,emp b WHERE a.mgr=b.empno; 

case when语句

根据不同情况做不同的事情

SELECT ename,job,sal 涨之前,
  CASE job 
    WHEN 'MANAGER' 
    THEN sal + 1000 
    WHEN 'CLERK' 
    THEN sal + 800 
    WHEN 'ANALYST' 
    THEN sal + 500 
    ELSE sal + 300 
  END AS '涨之后' 
FROM
  emp ;

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

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

相关文章

Linux安装并使用seatunnel2.3.1

SeaTunnel是一个非常易用的超高性能分布式数据集成平台,支持海量数据的实时同步。 下载安装包 设置版本 export version"2.3.1" 通过命令下载 wget "https://archive.apache.org/dist/incubator/seatunnel/${version}/apache-seatunnel-incubat…

Linux/Ubuntu系统运行Python+Yolov5物体识别

程序示例精选 Linux/Ubuntu系统运行PythonYolov5物体识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<Linux/Ubuntu系统运行PythonYolov5物体识别>>编写代码&#xff0c;代码…

汽车最强大脑ECU和单片机是什么关系

摘要&#xff1a; 有效解决线路信息传递所带来的复杂化问题 ECU的定义 ECU原来指的是engine control unit&#xff0c;即发动机控制单元&#xff0c;特指电喷发动机的电子控制系统。但是随着汽车电子的迅速发展&#xff0c;ECU的定义也发生了巨大的变化&#xff0c;变成了elec…

31岁才转行程序员,目前34了,我来说说我的经历和一些感受吧...

最近刷知乎&#xff0c;发现有很多朋友有年龄焦虑了&#xff0c;比如&#xff1a;“我今年28了转行来不来得及”&#xff0c;“我今年30了还能转软件测试吗&#xff1f;”......这种问题在知乎上有很多&#xff0c;仿佛大家都觉得年纪大了&#xff0c;很多事情都来不及了&#…

tps和qps的区别和理解

QPS&#xff08;TPS&#xff09; 并发数/平均响应时间 或者 并发数 QPS*平均响应时间 TPS Transactions Per Second&#xff08;每秒传输的事物处理个数&#xff09;&#xff0c;即服务器每秒处理的事务数。TPS包括一条消息入和一条消息出&#xff0c;加上一次用户数据库访…

html使用elementui案例

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Title</title><!--引入 element-ui 的样式&#xff0c;--><link rel"stylesheet" href"static/css/index.css">…

轻松将Win10系统备份到U盘的2种方法!

问题&#xff1a;我能将Win10系统备份到U盘吗&#xff1f; ​“我想将Win10系统备份到U盘&#xff0c;然后通过增量或差异备份定期备份。我使用了系统自带的工具进行备份&#xff0c;但它无法识别这个U盘。有没有好用的方法可以轻松的将电脑系统备份到u盘/移动硬盘&#xf…

Ubuntu系统下Nginx安装

一、使用apt安装nginx 0-如果本机安装了nginx&#xff0c;就进行卸载&#xff1a; apt-get --purge autoremove nginx 检查本机是否还有nginx程序在后台运行&#xff0c;如果有直接kill掉。 ps -ef | grep nginx 1-默认版本安装 apt-get update apt-get install nginx 2…

【备战秋招】每日一题:3月18日美团春招第四题:题面+题目思路 + C++/python/js/Go/java带注释

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&…

spring Security 认证失败,用户名和密码是正确的还是失败

项目用登录输入正确的用户名和密码为什么还是告知,用户名和密码是不正确? 有这几种情况 第一种是不是开启缓存,数据库中存储的是加密后的密码 第二种,查看源代码,这句是关键,presentedPassword是明文密码,userDetails.getPassword()是加密后的密码,进行比较 this.pa…

做好个人黄金投资,学习黄金投资交易原则

随着经济的发展,黄金逐渐成为金融投资的重要工具&#xff0c;越来越多的人开始关注黄金投资。想要做好个人黄金投资&#xff0c;建议先熟悉和学习黄金投资交易原则的内容。 黄金投资交易原则一、跟随趋势入场 在买入之前&#xff0c;首先应对行情的运行趋势有个明确的判断。一…

全网最全postman接口测试教程和项目实战~从入门到精通!!!

Postman实现接口测试内容大纲一览&#xff1a; 一、什么是接口&#xff1f;为什么需要接口&#xff1f; 接口指的是实体或者软件提供给外界的一种服务。 因为接口能使我们的实体或者软件的内部数据能够被外部进行修改。从而使得内部和外部实现数据交互。所以需要接口。 比如&…

支撑企业未来10年高增长,用友资金管理平台助力新零售企业逆境破局

随着大数据、云服务、5G等技术的深化发展&#xff0c;人们消费观念及需求逐渐变化&#xff0c;我国新零售业数字化进程不断加快。近年来&#xff0c;新零售已经不仅局限于单一的零售范畴&#xff0c;逐步演变为集零售、快递物流、金融科技、企业服务、人工智能等各行各业为一体…

公司只有1个测试,领导却让我测试10个项目,这不是为难我....

读者提问&#xff1a;公司只有 1个测试&#xff0c;领导让我同时测试 10个项目&#xff0c;我该怎么办&#xff1f;回答&#xff1a;如果我是那个测试&#xff0c;我会做这三件事 1、向上申请资源2、任务分配到人3、执行测试任务 一、向上申请资源 1个测试同时对接 10个项目&a…

华为云认证的含金量高吗?数通考什么内容?

对于从事信息通信行业的人来说&#xff0c;拥有一份专业的证书&#xff0c;对提升自己的技能、职业竞争力是非常有帮助的&#xff0c;而华为云虽然是一个新兴的云计算厂商&#xff0c;但是咋断电几年之内&#xff0c;已经发展到了国内第二的位置&#xff0c;而且还在不断地发展…

java序列化和文件的输入和输出

文章目录 一、JAVA的序列化1. 简介2. 对象序列化的步骤3. 小结4. 序列化4. 解序列化 二、对象的序列化1. 简介2. Java.io.File.class3. 缓冲区 三、序列化版本控制 一、JAVA的序列化 1. 简介 如何将我们的java对象存储起来&#xff0c;这里介绍两种思路&#xff1a; 如果我们…

【JavaEE进阶】——第八节.SpringBoot统一功能处理

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;JavaEE进阶 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录 前…

智能公厕引导系统为未来共享公厕发展新趋势打造基础

智慧公厕管理系统可以提高公厕的服务质量和管理效率&#xff0c;实现公厕的自动化管理和数据分析。该系统可以广泛应用于各类公共场所&#xff0c;如商场、公园、机场、医院等。 一、智慧公厕引导系统案例展示 智慧公厕管理系统还可以实现公厕的人口统计和安全监控等功能。服务…

【今天聊聊AI】AI歌手会取代流行歌手吗

一、聊聊AI歌手发展现状 近日&#xff0c;“AI孙燕姿”火遍全网&#xff0c;AI孙燕姿翻唱林俊杰的《她说》、周董的《爱在西元前》、赵雷的《成都》等等歌曲让网友听了直呼&#xff1a;“听了一晚上&#xff0c;出不去了。” 现在AI歌手技术到底已经发展到了怎样的地步&#xf…

MySQL千万级数据优化方案

简介 ↓↓↓处理千万级数据的MySQL数据库&#xff0c;可以采取以下优化措施↓↓↓ 使用索引&#xff1a;确保对经常用于查询和排序的字段添加索引。不要在查询中使用SELECT *&#xff0c;而是明确指定需要的字段。分区表&#xff1a;如果表中的数据按照时间或其他维度进行划分&…