【MySQL】查询进阶

这篇具有很好参考价值的文章主要介绍了【MySQL】查询进阶。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据库约束

约束类型

NOT NULL
#表示某行不能储存空值
UNIQUE
#保证每一行必须有唯一的值
DEFAULT
#规定没有给列赋值时的默认值
PRIMARY KEY
#NOT NULL 和 UNIQUE 的结合 确保某列(或两个列多个列的结合)有
#唯一标识,有助于更容易更快速地找到表中的一个特定的记录
FOREIGN KEY
#保证一个表中的数据匹配另一个表中的值的参照完整性
CHECK
#保证列中的值符合在指定的条件 对于MySQL数据库,对CHECK子句进行分析,但是忽略
#CHECK子句

NULL , DEFAULT , UNIQUE 约束

CREATE TABLE student(
	id INT NOT NULL,
	sn INT UNIQUE,
	name VARCHAR(20) DEFAULT 'unkown',
	qq_mail VARCHAR(20)
);

主键约束

CREATE TABLE student (
   id INT NOT NULL PRIMARY KEY,
   sn INT UNIQUE,
   name VARCHAR(20) DEFAULT 'unkown',
   qq_mail VARCHAR(20)
);

对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大值+1。

即在设定主键约束后加auto_increment

CREATE TABLE student (
   id INT NOT NULL PRIMARY KEY auto_increment,
   sn INT UNIQUE,
   name VARCHAR(20) DEFAULT 'unkown',
   qq_mail VARCHAR(20)
);

外键约束

在数据库中,外键约束(Foreign Key Constraint)用于建立表与表之间的关系,通过将一个表的列与另一个表的主键或唯一键相关联来定义这种关系。外键约束有助于维护数据的完整性和一致性。

在使用外键约束时,有两个重要的角色:主表从表主表包含被引用的主键或唯一键列,而从表包含外键列,该列引用主表中的主键或唯一键列。

通过使用外键约束,可以确保在插入或更新数据时,从表的外键值必须存在于主表的关联列中。这有助于维护数据的完整性,并确保相关表之间的一致性。

举例

create table classes(
  id int primary key auto_increment,
  name varchar(20),
  `desc` varchar(100)
);


create table student(
  int id primary key auto_increment,
  sn int unique,
  name varchar(20) default 'unkown',
  qq_mail varchar(20),
  classes_id int,
  foregin key (classes_id) references classes(id);
);
  

用上述代码创建学生表和班级表

我们在学生表的最后添加了外键约束让student表中的classes_id字段和classes表中的id字段连接起来

此时student表称为从表,classes表称为主表

我们可以通过show create table 表名来查看创建表的信息

我们查看student表的创建信息
【MySQL】查询进阶,MySQL,mysql,数据库,oracle
我们发现倒数第二行专门来描述约束

CONSTRAINT student_ibfk_1 FOREIGN KEY (classes_id) REFERENCES classes (id)
CONSTRAINT来表示约束
student_ibfk_1 第一个字段studetn是表名 第二个字段ibfk是InnoDB Foreign Key的缩写 表示存储引擎是innoDB 且是外键约束,字段_1是计数 表示是第一个约束

那么外键约束有什么作用呢?

我们先往班级表中插入几条数据
【MySQL】查询进阶,MySQL,mysql,数据库,oracle
接着我们尝试向学生表中插入数据
【MySQL】查询进阶,MySQL,mysql,数据库,oracle
在插入前几条数据时 都可以正常插入 但是我们在插入最后一条数据时 出现了错误
根据报错信息我们可以知道是由于外键约束 我们插入的classes_id 为5 但是在主表classes中只有1-4的班级id 因此出现的报错

这时我们会想到 如果现在删除classes表中的数据 会不会对student表中的数据产生影响
【MySQL】查询进阶,MySQL,mysql,数据库,oracle
**我们发现还出现的报错 **

**所以我们可以得出结论 外键约束对于主表和从表都存在约束 **

聚合查询

聚合函数

函数 说明
COUNT([DISTINCT] expr) 返回查询到的数据数量
SUM([DISTINCT] expr) 返回查询到的数据的总和 不是数字没有意义
AVG([DISTINCT] expr) 返回查询到的数据的平均值 不是数字没有意义
MAX([DISTINCT] expr) 返回查询到的数据的最大值 不是数字没有意义
MIN([DISTINCT] expr) 返回查询到的数据的最小值 不是数字没有意义

group by子句

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询

需要满足:使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函数中。

准备测试表

create table emp(
 id int primary key auto_increment,
 name varchar(20) not null,
 role varchar(20) not null,
 salary numeric(11,2)
);
insert into emp(name, role, salary) values
('马云','服务员', 1000.20),
('马化腾','游戏陪玩', 2000.99),
('孙悟空','游戏角色', 999.11),
('猪无能','游戏角色', 333.5),
('沙和尚','游戏角色', 700.33),
('隔壁老王','董事长', 12000.66);

查询每个角色的平均工资 最大工资和最小工资
【MySQL】查询进阶,MySQL,mysql,数据库,oracle

HAVING

GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用 HAVING

where是对分组前的数据进行筛选
having是对分组后的数据进行筛选

联合查询

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:
【MySQL】查询进阶,MySQL,mysql,数据库,oracle

内连接

select 字段 from1 别名1 [inner] join2 别名2 on 连接条件 and 其他条件;
select 字段 from1 别名1,2 别名2 where 连接条件 and 其他条件;

外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完
全显示我们就说是右外连接。

-- 左外连接,表1完全显示
select 字段名  from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;

自连接

自连接是指在同一张表连接自身进行查询

例如显示所有"计算机原理"成绩比"Java"成绩高的信息

#第一步先在course表中找到计算机原理和java课程的id号
select * from course where name='计算机原理' or name = 'Java'

#再查询成绩表中,“计算机原理”成绩比“Java”成绩 好的信息
select *
from score s1, score s2
where s1.student_id = s2.student_id
and s1.course_id = 3
and s2.course_id = 1
and s1.score > s2.score;

【MySQL】查询进阶,MySQL,mysql,数据库,oracle
上述操作我们分成两步执行 且没有显示学生信息

SELECT
 stu.*,
 s1.score Java,
 s2.score 计算机原理
FROM
 score s1
 JOIN score s2 ON s1.student_id = s2.student_id
 JOIN student stu ON s1.student_id = stu.id
 JOIN course c1 ON s1.course_id = c1.id
 JOIN course c2 ON s2.course_id = c2.id
 AND s1.score < s2.score
 AND c1.NAME = 'Java'
 AND c2.NAME =

【MySQL】查询进阶,MySQL,mysql,数据库,oracle

子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

单行子查询

查询与"不想毕业"同学的同班同学

select *
from student
where classes_id = (
    select classes_id
    from student
    where name = '不想毕业'
);

【MySQL】查询进阶,MySQL,mysql,数据库,oracle

多行子查询

返回多行记录的子查询

查询"语文"或"英文"课程的成绩信息

select *
from score
where course_id in (
    select id
    from course
    where name = '语文' or name = '英文'
);

若要查询不在范围内的只需要在in之前 加 not
【MySQL】查询进阶,MySQL,mysql,数据库,oracle文章来源地址https://www.toymoban.com/news/detail-600366.html

到了这里,关于【MySQL】查询进阶的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库问题记录(粗略版)oracle、mysql等主流数据库通用

    1. ORA-00918:未明确定义列 该问题情况大致为:select 所取列名错误、重复等问题。 2. “select * from temp where 1=0; ”的含义 布尔值为FALSE,只返回表结构,不返回数据。 举一反三: select * from temp where 10 , 布尔值为TRUE,返回所有数据记录; select * from temp where 1=0, 暂不清楚是何

    2024年02月07日
    浏览(50)
  • MySQL数据库——MySQL WHERE:条件查询数据

    在 MySQL 中,如果需要有条件的从数据表中查询数据,可以使用 WHERE 来指定查询条件。 使用 WHERE 的语法格式如下: WHERE 查询条件 查询条件可以是: 带比较运算符和逻辑运算符的查询条件 带 BETWEEN AND 的查询条件 带 IS NULL 的查询条件 带 IN

    2024年02月03日
    浏览(64)
  • MySQL数据库实验三 MySQL查询

    一、实验项目: MySQL查询。 二、实验目的 掌握MySQL的查询操作。 三、实验内容 (一): 1、查询lineitem表中商品编号(productid)和单价(unitprice),要求消除重复行。 2、计算lineitem表中每条记录的商品金额。 3、显示orders表单笔高于200元的客户号(userid)、成交金额(total

    2024年02月11日
    浏览(56)
  • 从 Oracle 到 MySQL 数据库的迁移之旅

    目录 引言 一、前期准备工作 1.搭建新的MySQL数据库 2 .建立相应的数据表 2.1 数据库兼容性分析 2.1.1 字段类型兼容性分析 2.1.2 函数兼容性分析 2.1.3 是否使用存储过程?存储过程的个数?复杂度? 2.1.4 是否使用触发器?个数?使用的场景? 2.2 建表过程中其他需要注意的事项

    2024年04月11日
    浏览(53)
  • Mysql和Oracle数据库死锁查看以及解决

    一、Mysql数据库死锁排查 SQL : SQL: SQL: 示例: 备注:通过查看事务的trx_started(开始时间)来判断该事务的阻塞时间。 SQL  : 备注:线程ID指的是 1.1.3步骤中查询出来的 trx_mysql_thread_id。 SQL : 示例 : 字段解析 : SQL : 示例: SQL : 备注:多个session用逗号隔开。 View Code   造

    2024年01月20日
    浏览(46)
  • MySQL数据库学习【进阶篇】

    MySQL进阶篇已经更新完毕,点击网址查看👉:MySQL数据库进阶篇

    2024年02月10日
    浏览(35)
  • MySQL数据库基础之MySQL查询基础

    从今天开始,本系列内容就带各位小伙伴学习数据库技术 。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 全文大约【 1212】 字,不说废话,只讲可以让你学到技术、

    2024年02月06日
    浏览(54)
  • MySQL数据库——MySQL SELECT:数据表查询语句

    在 MySQL 中,可以使用 SELECT 语句来查询数据。查询数据是指从数据库中根据需求,使用不同的查询方式来获取不同的数据,是使用频率最高、最重要的操作。 SELECT 的语法格式如下: 其中,各条子句的含义如下: {*|字段列名} 包含星号通配符的字段列表,表示所要查询字段的

    2024年02月05日
    浏览(80)
  • MySQL数据库,联合查询

    目录 1. 联合查询 1.1 内查询 1.2 外查询 1.3 自连接 1.4 子查询 1.5 合并查询 联合查询,简单的来讲就是多个表联合起来进行查询。这样的查询在我们实际的开发中会用到很多,因此会用 笛卡尔积 的概念。 啥是笛卡尔积?两张表经过笛卡尔积后得到的新表的列数是两表列数之和

    2023年04月23日
    浏览(76)
  • MySQL数据库,聚合查询

    目录 1、聚合查询 1.1聚合函数 1.1.1count函数 1.1.2sum函数 1.1.3avg函数 1.1.4max函数 1.1.5min函数 1.2group by子句 1.3having 聚合函数查询又叫函数查询,它是通过一些特定的函数根据需求来查询相关的信息,常见的聚合函数为: COUNT - 求总数,不包含某字段为null值 SUM - 求和,不包含某字

    2023年04月21日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包