mysql有万能表吗_MySQL查询与数据库设计 #万能公式 #思维导图 #MySQL查询 #数据库设计规范 #第二部分...

MySQL查询

零、MySQL查询万能公式

一、查询

1)查询表中记录

2)给表取名

3)去重(distinct)

二、条件查询

1)比较运算符

2)逻辑运算符

3)模糊查询

like(用通配符)

rlike(用正则)

4)范围查询

三、排序

四、聚合函数

五、分组

六、分页

1)直接限制查询出来的个数。末尾加limit 个数

2)limit 开始位置的索引,个数

七、连接查询

1)内连接inner join

2)外连接

左连接left join

右连接right join

3)美化连接的结果

4)把查出来的表当作新表

八、自关联

1)概念

2)这里新教一个使用sql文件的方法

3)自关联用法

九、子查询

十、数据库设计

1)三范式

2)E-R模型(实体-关系模型)

零、MySQL查询万能公式

→点击这里看大图

63d3ba1ae76f9dca53b9d577e7f2c2ee.png

在这里解释一下:select 输出内容 from 表;是什么意思。

输出内容,很好理解,就是你填什么,它输出相关内容。表,怎么理解呢?

表名是一张表吧?用连接,你打印出来也是一张表吧?用where之类的限制,你打印出来,还是一张表吧?所以后面就是表,那一长串就是一个原始的表经过这样那样的限制,分分合合,还是一张表,一张结果表,还是表。终究是在表里取出相应的输出内容,这就是内涵。

理解了表这一层就好办了,什么修改呀,嵌套呀,都是先改变表结构,然后再操作的结果。

(这是由本人原创的,我称之为‘大表理论’,转载请注明weixin_44925501原创。)

一、查询

1)查询表中记录

select … from 表名;

省略号处,若为 * ,表示所有字段。若为 字段i,字段j ,则只显示这几个字段,且根据顺序来排列

取别名就 字段i as xx,字段j as yy

e6e8f6028277fd61d07aec23e6a93d25.png

2)给表取名

select 表名1.字段i,表名1.字段j from 表名1;

--上面这行用法很特殊哦。这个等同于下面这行。

select 表别名1.字段i,表别名1.字段j from 表名 as 表别名1;

a4ac6e51e80c38f5f1907015c060de9b.png

如果取了别名,愣是不用,会报错哦。

3)去重(distinct)

select distinct … from 数据表名;

--重复值会被合并

78fa65649847cf07c2b49343642c3366.png

二、条件查询

1)比较运算符

> 大于  = 大于等于  <= 小于等于  = 等于

!= 不等于

2)逻辑运算符

and 与  or 或  not 非

在谁的条件前面加not,是仅仅否定了这一个条件。如果要否定多个条件,请使用括号

3)模糊查询

like(用通配符)

select … from 数据表 where 字段 like ‘…’;

--第二个省略号处,写的就是模糊查找的值。一个 % 表示替换n个值(n为0-无穷),一个 _表示替换一个值。

f3ec5b4751ea20ea48a6dbda24b16bc7.png

rlike(用正则)

~~点击这里,查阅正则表达式~~

select … from 数据表 where 字段 rlike ‘正则表达式’;

ba6154a68be7398186eb8d0925f553fb.png

4)范围查询

在不连续范围内。

select … from 数据表 where 字段 in (值1,值2…);

5b9407e1e3ee9502ed682d9192944b31.png

在连续范围内

select … from 数据表 where 字段 between 界限1 and 界限2;

c608e30546c826fce8573ef5e0217855.png

10<=age<=20范围内的。

不在连续范围内,用not between and ;这是一种用法,不能加上括号然后整个取反。

not 字段i between and;和上面的用法相同。

71222841b7e9baa53764d457b1042055.png

空判断(is null)

非空判断(is not null)

三、排序

单字段排序

记录优先按照主键排序

select * from 数据表名 order by 排序字段 排序方式;

排序方式: 默认正序asc(这个可以不写) 倒序desc

多字段排序

select * from 数据表名 order by 排序字段1 排序方式1,排序字段2 排序方式2;

7571841111a9f280386d98f076e6a767.png

先写谁就是按照谁排,如果一样,才会看第二个排序条件。

自定义排序

select * from 数据表名 order by field(排序字段,排序依据的枚举,以逗号隔开) 排序方式;

f5cea6bea1e135cd1d87259f2522683b.png

四、聚合函数

!select … from省略号里的是输出的内容,重要的事情说三遍!

!select … from省略号里的是输出的内容,重要的事情说三遍!

!select … from省略号里的是输出的内容,重要的事情说三遍!

select  聚合函数(字段们) from 数据表;

上面返回的是聚合函数的结果

统计个数 count

ce3928f64ba5c0a49cae4607fbe39367.png

最大值 max() 最小值 min()

注意看第二段代码,最年长者不是公子小白哦,之所以显示他,是因为他是第一条记录的name。也就是说,函数不带定位的功能,它只能找到计算出某个值而已。

聚合函数只能得出一个结果,是不能和其它字段一起用的。

606dab1b5374fadc795282670e2f09e7.png

总和 sum() 平均值 avg()

5c43b1a7282bff46d84c14f2e0da72ce.png

select…from间除了字段,函数外,还可以放表达式

7af6078a23ce5306c8bb21e72c6745d3.png

四舍五入保留几位小数 round(值,小数位数)

034eb4efc59c2688fe901a47d89af8d7.png

小数都是约等于,有误差。整数没有误差,所以算出小数之后,要乘以一个倍数变成整数,再存储。取用时,再缩小同样的倍数。

要存储准确的值,切记,不要用小数.

五、分组

和聚合函数一起用,否则一点意义都没有。比如上面得出了最大年龄,却不知道谁是最年长的,就可以用分组。

分组就是按照某一种依据,分成不同的组

没结合函数的分组:select 分组依据 from 表名 group by 分组依据;

d7744ee14090552d16741739cb5960c6.png

没结合函数,是不是啥子用都没得呀?

统计每个分组里的人数:  分组依据,count(*)

d6a6af4c54d1a996415a3f8a44973034.png

每个聚合函数都来一下

a05b012f1573ae4e0796aa02ab4ad7f9.png

组里面有谁呢?分类依据,group_concat(字段)

8b824ee4590f5b091ff493a38013db68.png

只查看某一个组 select 分组依据,表达式 from where 分组依据=第几组的序号 group by 分组依据;

6b4064c19edf507c14745a80812bbd56.png

组里面有谁呢(进阶)?分类依据,group_concat(字段i,字段j,‘随便一段文字’)

a4749d6c1f46ea9f23479bf37ab28b31.png

group_concat相当于写什么有什么

找出符合条件的组。最后面:having 条件;

b4f2e5dba271fa62fc344a5d3de935fd.png

where是对原始表进行条件,在group by前

having是对查出来的结果的判断,在group by后

六、分页

1)直接限制查询出来的个数。末尾加limit 个数

b8321cd10e6d7d8fbb4387af0ed41a1d.png

2)limit 开始位置的索引,个数

bf336f1c4ebfc7ae9ba77d2c34be015c.png

limit (第n页-1)x每页的个数 ,每页的个数;

上面这个算式,只是原理的解释,不能运行的。

所有的查询中,limit只能放最后。

七、连接查询

连接多个表,取多个表的公有数据。

--先看一下原表

2941c940058716398f7bc27f3db21367.png

1)内连接inner join

91647deb3d5117045ae773a0df4616c1.png

--来看一下不带条件的直接连接会怎样(语法正确,但没有意义)

51c26a93ceb304827136bdcf85e668dc.png

会发现,此时变成了两个表的排列组合。

--我们加上条件 :on +布尔值

--这样才真正取到了两个表的交集。我们会发现,cls_id!=(1,2,3)的记录没有显示。

5a61edb0c5c8801083daa526ee161d5d.png

2)外连接

左连接left join

--左连接会保留左边的表(用join区分左右,在join左的)

b8e9f63e002195721a01177b8565ecc8.png

211f84298ea93163a058f0b953618a70.png

右连接right join

和左连接类似,很少用。

3)美化连接的结果

下面这部分,我希望能通过几个美化方案,来带领你体会SQL语句的内涵

2. cls_id与id保留cls_id。表名取别名。

c2076cc70354e2a8a20708c6c4780002.png

调整字段顺序,让属名在最前,并给字段取别名

745571698a2676428aad7fa4e92bb8e8.png

4)把查出来的表当作新表

--还记得下面这张表吗?如果我们要取出id=null的,该怎么做?如果用on kings.id=null 会得到一大堆数据。最好的办法就是,把查出来的这张表当做一张新表,直接对其进行操作。

前面我们提到过,where作用于原表,having作用于结果。OK,就它了。(具体知识点在部分5,分组)

211f84298ea93163a058f0b953618a70.png

--注意看下面的代码(运用having,对结果表进行筛选)

76620d8ede585090d8053a681a0f3507.png

八、自关联

1)概念

b2edbbeff39c590b3abfc2655d0d7277.png

--看上面的表,一级单位里每一条记录,都有一个二级单位的表与其对应。二级单位的每一条记录,都有一个三级单位的表与其对应。

问题是?表会不会太多了?

--所以我们添加一个外键,把所有的二级单位都放到一张表里,把所有的三级单位也放一张表里。再看:

bbc2e38a48cc8ec6a1d38e8708e042dc.png

问题是?表会不会还是太多了?如果还有四级单位,五级单位呢?

我们观察到,这些子单位的表很类似,我们可以合并它们。但是这样还是有两张表。一个一级单位表,一个子单位表。

-- 注意看下面合并过程

105fa9ee070a0d2194542146956763c7.png

一个表里的一个字段,用到自己表里的另一个字段,就叫做自关联。

2)这里新教一个使用sql文件的方法

新建一个数据表(这里我取名为china,存储除台湾外的所有中国的地区)

数据是从网上找的

台湾是中国不可分割的一部分

台湾是中国不可分割的一部分

台湾是中国不可分割的一部分

台湾是中国不可分割的一部分

台湾是中国不可分割的一部分

写一个sql文件~~内容是在这里取的~~

跳到数据表所在数据库下

source 文件路径\文件名.sql;(或  \ . 路径/文件名.sql)

如过报错:ERROR 1406 (22001): Data too long for column ‘name’ at row 1

--说明编码不一致。在终端内输入set names utf8;然后再运行sql文件即可。

dae221b2282159cda0490e34af0f4de3.png

3)自关联用法

想知道中国的省会直辖市有哪些(加一个台湾): select * from china where pid=0;

2f85c29e1c97ae8c90cb8006c3af7ee9.png

想知道某省有什么市,可以,先查出其aid,再根据aid查出来

select aid from china where name=‘省会直辖市名’;

select * from china where pid=刚刚查出的aid;

f01bd2e351c96087afd01e10207d0046.png

有没有一步到胃的方法?

之前我们学了连接查询,如果能有两张表就好了啊!

! ! ! 利用取别名的方法,变成两张表。 ! ! !

select * from china as P inner join china as C on P.aid=C.pid having P.name=‘省会直辖市名’;

52ff644f386196d315e515b15356b99f.png

九、子查询

子查询: 一个select里面还嵌套着另一个select。

-- 前面的kings数据表中,身高最高值为188.88。如何找到身高最高的人?

select * from kings where height = 188.88;

--如果不知道最高身高是多少?可以先用

select max(height) from kings;

--但这也太麻烦了吧!组合它们。

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

--会优先执行子语句

--上面的自关联语句还可以写成子查询的形式(更美观简单,但子查询性能低,表大了会非常慢。)

select * from china where pid=(select aid from china where name=‘省会直辖市名’);

82ce8744b37dd8eaf7a5ce24bf59df32.png

十、数据库设计

1)三范式

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

共有八种NF,遵循前三种即可。

第一范式(1NF):

原子性,字段不可再拆分

第二范式(2NF):

一、满足1NF

二、一个表必须有主键

三、没有包含主键中的列必须完全依赖于主键,而不能只依赖主键的一部分。

059ab7f27220c90f7211fcd1852d4870.png

例如上表,就不符合2NF。是能通过订单号找到某条记录,还是可以通过商品名找到?都不行。原因就是没有完全依赖,从而导致有两个主键。品名仅需要依靠商品号这个主键就能描述清楚。应该改成下图。

54c7eac74a2a8008b131aeb835b009a6.png

上图中,上表其它部分直接依赖于主键商品号。下表其它部分直接依赖于主键订单号和商品号。

第三范式(3NF):

一、满足2NF

二、非主键字段,必须直接依赖于主键,而不能传递依赖

5f7178d44eb162b37f5780ad1e525764.png

订单号是主键,顾客ID和订单时间都依赖于它。后面的顾客昵称,地址1、2都依赖于顾客ID,这就是传递依赖。一不合适就拆表!

c3dd1989d435ad697c9581cab4d18b31.png

2)E-R模型(实体-关系模型)

一表对一表:

一表对多表:

在多的那个表里,添加一个外键字段。

多对多

在这些表中,新建一个中间表(被称为聚合表),存储两者的主键。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值