1.分页

limit start count

limit限制查询出来的数据个数,limit在语句最后

  • 查找两个女性
select * from student where gender=1 limit 2;

  • 从第0个开始查找,往下查5个。
select * from student where gender=1 limit 0,5;

  • 从第5个开始查找,往下查5个。
select * from student where gender=1 limit 5,5;

因为一共只有3个,也就是说从第五个起后面五个是不存在的

  • 从第2个开始查找,往下查5个。

 这里star等于下标

  • 每页显示2个,显示第六页的信息,按照年龄大小排序。
select * from student order by age asc limit 5,2;

2.连接查询【多表使用】

多个表里合并数据时使用,目前创建了两个表【见相关文章2

链接查询:inner join ... on(表与表的链接)

select * from student inner join classes;

改一下名字:

alter table student rename students;

2.1 交集-内连接

  • 查询有能够对应班级的学生以及班级信息
select * from students inner join classes on students.cls_id=classes.id;

*所有信息都显示,id显示也重复;

  • 按要求显示对应另一个表的编号、班级
select students.*, classes.name,classes.id from students inner join classes on students.cls_id=classes.id;

select students.*, classes.name from students inner join classes on students.cls_id=classes.id;

select students.name, classes.name from students inner join classes on students.cls_id=classes.id;

给数据表起名字

select s.name,c.name from students as s inner join classes as c on s.cls_id=c.id;

把班级放到第一列:

select  classes.name,students.* from students inner join classes on students.cls_id=classes.id;

2.2 并集

查询有能够对应班级的学生以及班级信息,按照班级进行排序,若为同班级按照id进行排序。

select c.name, s.* from students as s inner join classes as c on s.cls_id=c.id order by c.name,s.id;

  • 外连接

以left join左边为基准,未能匹配则为默认填空 null

select * from students as s left join classes as c on s.cls_id=c.id;

  • 查询没有对应班级的学生
select * from students as s left join classes as c on s.cls_id=c.id where c.id is null;
select * from students as s left join classes as c on s.cls_id=c.id having c.id is null;

where 和 having的区别:

  • where使用分组前的筛选【原表判断结果】
  • having 用于分组后的筛选【新的结果当作一个集,查询结果】

3.自关联

应用:

表示通过一张表实现逻辑关联查询,类似于省-市-县

自关联自己关联自己:

数据下载链接: https://download.csdn.net/download/sinat_39620217/29167740

创建数据表:

create table areas(
-> aid int primary key,
-> cid int,
-> atitle varchar(20),
-> pid int);
show tables;

直接输入cmd 在此启动mysql

在cmd模式下输入dir可以查看文件是否在目录下:

show databases;
use ptrhon_test;
show tables;
--导入数据
source areas.sql;

如果报错:是因为字段数目不统一添加一下即可;上面已经修正用不到了

alter table areas add cid int after aid;
select * from areas;

查看有多少省:

select * from areas where cid=1;

查看福建有多少地区:

select atitle from areas where cid=4;

select * from areas where cid=4;

查询江西省有哪些市:一张表变成多个表

select * from areas as province inner join areas as city on city.aid=province.cid having province.pid=2;

select * from areas as province inner join areas as city on city.pid=province.aid having province.atitle="江西";

select province.atitle,city.atitle from areas as province inner join areas as city on city.pid=province.aid having province.atitle="江西";

4.子查询

4.1标量子查询;

查询最高的男生信息

select * from students where height=(select max(height) from students);

子查询即先执行子语句得到结论,再把这个结论当作条件再执行主语句;

对于:上面河北省自关联可以采用子查询解决:

select* from areas where pid = (select aid from areas where atitle=" 河北省");

区别在于查询时间,子查询慢一点。

4.2列级子查询

查询学生的班级号能对应学生的信息:

select * from students where cls_id in (select id from classes);

5.数据库设计

  • 关系型数据库建议在E-R模型的基础上,我们需要根据产品经理的设计策划,抽取出来模型和关系,制定出表结构。
  • 在开发中右很多设计数据库的软件,常用的入power designer,db designer等,这些软件可以只管得看到实体及实体间的关系。
  • 设计数据库可能由专人来完成,也可能让开发组的人完成。

5.1 三范式

  • 经过研究和对使用中的问题的总结,对于设计数据库提出了一些规范,这些规范称为范式。

  • 目前有迹可循的共有8种范式,一般需要遵守3范式即

目前关系型数据库常用的六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。一般来说,数据库只需要满足第三范式就行了。

5.1.2 第一范式:保证每列的原子性

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足了第一范式。

一般来说"住址"设计成一个字段就行,但是如果经常访问"住址"中城市的部分,那么就非要将"住址"这个属性重新拆分为"省份"、"城市"、"地址"等多个部分进行存储,修改之后的表结构如图:

5.1.2  第二范式:保证一张表只描述一件事情

首先是1NF,另外包含两部分内容,一是表必须有一个主键【唯一区分】;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分

上表满足第一范式,即每个字段不可再分,但是这张表设计得并不好,或者说,这张表的设计并不满足第二范式。因为这张表里面描述了两件事情:学生信息、课程信息,"学分"完全依赖于"课程名称"、"姓名"与"年龄"完全依赖于"学号"。这么做的后果是:

1、数据冗余:同一门课程由n个学生选修,"学分"重复n-1次;同一个学生选修了m门课程,姓名和年龄重复m-1次

2、更新异常:若调整了某门课程的学分,数据表中所有行的"学分"值都需要更新,否则会出现同一门课程学分不同的情况

3、插入异常:假设要开一门新课程,暂时没有人选修,那么由于没有"学号"关键字,"课程"与"学分"也无法记录入数据库

4、删除异常:假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,"课程"和"学分"也被删除了,显然,这最终可能会导致插入异常

所以,此表的结构必须修改,修改后如下:

       

增加了表,将学生信息与课程信息通过一张中间表关联,很好地解决了上面的几个问题,这就是第二范式的中心----保证一张表只讲一件事情。

或者看下面例子:

第一个表中,主键是允许有多个的;但是洗发水依赖于产品ID,不符合除主键外全部字段依赖主键;改成下面即可

5.1.3 第三范式----保证每列都和主键直接相关

首先是2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖,即不能存在:非主键列A依赖于非主键列B,非主键列B依赖于主键的情况。

第三范式和第二范式有点像,从这张数据库表结构中可以看出,"姓名"、"年龄"、"学院"和主键"学号"直接关联,但是"学院地点"、"学院电话"却不直接和主键"学号"相关联,和"学院电话"直接相关联的是"学院",如果表结构这么设计,同样会造成和第二范式一样的数据冗余、更新异常、插入异常、删除异常的问题。

修改之后的表结构如下图:

或者如下:

用户id依赖于产品id,但是用户信息是依赖于用户id再间接依赖产品id

最终表结构:

5.2 E-R模型:Entity-relationship model实体联系模型

基本的ER模型包含三类元素:实体、关系、属性

实体(Entities):实体是首要的数据对象,常用于表示一个人、地方、某样事物或某个事件。一个特定的实体被称为实体实例(entity instance或entity occurrence)。

关系(Relationships):关系表示一个或多个实体之间的联系。关系依赖于实体,一般没有物理概念上的存在。关系最常用来表示实体之间,一对一,一对多,多对多的对应

属性(Attributes):属性为实体提供详细的描述信息。一个特定实体的某个属性被称为属性值。Employee实体的属性可能有:emp-id, emp-name, emp-address, phone-no……。属性可被分为两类:标识符(identifiers),描述符(descriptors)。Identifiers可以唯一标识实体的一个实例(key),可以由多个属性组成。ER图中通过在属性名下加上下划线来标识。多值属性(multivalued attributes)用两条线与实体连接,eg:hobbies属性(一个人可能有多个hobby,如reading,movies…)。复合属性(Complex attributes)本身还有其它属性。

辨别强实体与弱实体:强实体内部有唯一的标识符。弱实体(weak entities)的标识符来自于一个或多个其它强实体。弱实体用双线长方形框表示,依赖于强实体而存在。

中间的表称谓聚合表

总结:设计数据库,先满足范式;在考虑是一对一,一对多,多对多的对应

MySQL【三】---数据库查询详细教程{分页、连接查询、自关联、子查询、数据库设计规范}的更多相关文章

  1. SQL连接、合并、子查询

    连接:连接分为内连接.外连接.交叉连接 内连接和外连接都是在笛卡尔积的基础做一些修改. 合并查询:把两个相似的结果可以用union联合起来. mysql> select id,time from ...

  2. 肤浅的聊聊关联子查询,数据集连接,TiDB代码,关系代数,等等

    本章涉及的内容是TiDB的计算层代码,就是我们编译完 TiDB 后在bin目录下生成的 tidb-server 的可执行文件,它是用 go 实现的,里面对 TiPD 和 TiKV实现了Mock,可以单 ...

  3. MySQL高级查询与编程笔记 • 【第3章 子查询】

    全部章节   >>>> 本章目录 3.1 子查询定义和单行子查询 3.1.1 子查询定义 3.1.2 单行子查询应用 3.1.4 实践练习 3.2 多行子查询应用 3.2.1 ...

  4. SQL基础教程(第2版)第5章 复杂查询:5-3 关联子查询

    第5章 复杂查询:5-3 关联子查询 ● 关联子查询会在细分的组内进行比较时使用.● 关联子查询和GROUP BY子句一样,也可以对表中的数据进行切分.● 关联子查询的结合条件如果未出现在子查询之中就 ...

  5. SQL进阶系列之6用关联子查询比较行与行

    写在前面 使用SQL对同一行数据进行列间的比较很简单,只需要在WHERE子句里写上比较条件就可以了,对于不同行数据进行列间比较需要使用自关联子查询. 增长.减少.维持现状 需要用到行间比较的经典场景是 ...

  6. 如何正确理解SQL关联子查询

    一.基本逻辑 对于外部查询返回的每一行数据,内部查询都要执行一次.在关联子查询中是信息流是双向的.外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回它的记录.然后,外部查询根据 ...

  7. Sql Server的艺术(六) SQL 子查询,创建使用返回多行的子查询,子查询创建视图

    子查询或内部查询或嵌套查询在另一个SQL查询的查询和嵌入式WHERE子句中. 子查询用于返回将被用于在主查询作为条件的数据,以进一步限制要检索的数据. 子查询可以在SELECT,INSERT,UPDA ...

  8. SQL Fundamentals: 子查询 || WHERE,HAVING,FROM,SELECT子句中使用子查询,WITH子句

    SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...

  9. 一文让你彻底理解SQL关联子查询

    员工表的主要信息: 需求:检索工资大于同职位的平均工资的员工信息. 直觉的做法 员工多,而相应的职位(如销售员.经理.部门经理等)少,因此首先想到的思路是对职位分组,这样就能分别得到各个职位的平均工资 ...

  10. “子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。”SQL查询错误解析

    为了实现下述代码,首先得有数据库和相应的表格,本文用的是https://blog.csdn.net/qaz13177_58_/article/details/5575711/中的案例,即先用链接中那些 ...

随机推荐

  1. Python办公自动化_Excel篇

    Python办公自动化_Excel篇 库名 作用 xlrd 从excel中读取数据,支持xls,xlsx xlwt 从excel进行修改操作,不支持对xlsx格式的修改 xlutils 在xlrd和x ...

  2. 使用 FHE 实现加密大语言模型

    近来,大语言模型 (LLM) 已被证明是提高编程.内容生成.文本分析.网络搜索及远程学习等诸多领域生产力的可靠工具. 大语言模型对用户隐私的影响 尽管 LLM 很有吸引力,但如何保护好 输入给这些模型 ...

  3. 【Docker】docker介绍 什么是虚拟化 容器与虚拟机比较 Docker 概念 docker安装

    目录 docker介绍 什么是虚拟化 docker是什么 容器与虚拟机比较 Docker 概念 docker安装 docker介绍 什么是虚拟化 在计算机中,虚拟化(英语:Virtualization ...

  4. C++ lambda 内 std::move 失效问题的思考

    最近在学习 C++ Move 时,有看到这样一个代码需求:在 lambda 中,将一个捕获参数 move 给另外一个变量. 看似一个很简单常规的操作,然而这个 move 动作却没有生效. 具体代码如下 ...

  5. linux服务器之间免密登录

    目标  192.168.0.10 免密登录 192.168.0.11.192.168.0.12两台服务器 1.登录192.168.0.10 生成ssh密钥        ssh-keygen -t r ...

  6. [VS工程技巧]远程调试工具及dump文件来检查程序崩溃及异常等问题

    做什么 之前有一次梦中所得,既然可以让vs附加到进程去调试活动的dll,那要是可以让我本地的电脑去调试别人客户端或者测试环境的DLL就好了,这样就可以不通过dbgview去一个个输出看,而是可以直接调 ...

  7. spring--集成RocketMQ

    在Spring Boot中集成RocketMQ通常涉及以下步骤: 1. **添加依赖**:首先,需要在项目的`pom.xml`文件中添加RocketMQ的Spring Boot Starter依赖. ...

  8. Jquery - 获取所有子节点 ( 并删除 )

    1,获取所有子节点   $(".parent").find('.child') 2,获取所有子节点,通过上层 div 的类名 , 获取上层 div 节点 $(".pare ...

  9. Docker下的资源限制问题

    Docker下的资源限制问题 问题背景 公司某产品出现了一个奇怪的OOM 错误提示. 问题现象是 前台产品 提示 OOM cannot create native thread 但是同时查看 机器的资 ...

  10. [转帖]Linux字符截取命令-cut

    概述 cut是一个选取命令,.一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的. 语法 cut [-bn] [file] 1 或 cut [-c] [file] ...