MySQL查询语法 多表联查 视图 索引_mysql多表联查索引规则-程序员宅基地

技术标签: mysql  数据库  

1.简单查询
2.聚合函数查询
3.子查询
4.内外连接
5.三大范式
6.事务
7.视图
8.索引
9.补充内容

简单查询

1.查询所有字段 查询需要查的字段

select * from where 

2.取别名
3.条件查询
4.逻辑运算符 and / or / not
5.去重 distinct 按字段去重查询 from 表名
6.模糊查询 like %:任意个字符 _:有且仅有一个字符
7.between and 查询某个闭区间 [22,40]

查询年龄>=20 且 <=40的学生名字
select * from student where sage between 22 and 40

8.in 在什么里面 not in 不在里面

查找年龄在 18 19 21 22 的女生
select * from student where sage not in (18,19,21,22) and ssex = "女"

9.is null 查找某字段为空的数据

select * from student where ssex is null
select * from student where ssex  is not null
select * from student where not ssex  is null

10.分页查询

参数1 :从哪一条数据开始查     参数2 :需要查询的记录数
select * from student limit 0,5

11.排序查询

	默认升序 :asc   降序 :desc
select * from student order by sage asc,sid desc
select * from student order by sage desc

复杂查询 / 聚合函数查询

求最值

select max(字段名) from stu
select min(字段名) from stu

总和:sum( )

统计数据条数:select count(*)  from stu     注意:null不统计
平均值:avg( )

分组查询:group by

select sid,sname,sum(score) from stu group by sname

过滤聚合函数 : having

select sid,sname,min(score) from stu
group by sname having min(score)>60

where :过滤结果集,放在from后面,执行时机早
having :专门用于过滤聚合函数结果集,放在group by 后面
在group by之后执行
它们不能相互替换

关键字的书写顺序
select–>distinct -->from -->where -->group by -->having -->order by -->limit

执行顺序
from -->where -->group by -->having -->select -->distinct -->order by -->limit


多表连接查询

如果查询多个表,在from后面的表名使用逗号隔开
n个表至少有n-1个条件 不加连接条件会产生笛卡尔积

in 子查询
子查询:
将查询结果作为一张表来使用
将查询的结果作为条件使用

查看平均成绩大于60的所有学生名字
select sname from student where sno in (
select sno from sc where score>60
) 

1.连接多表,就是单表查询
2.子查询
将查询的结果作为条件使用
将查询的结果作为表使用

exists 
select * from sc where exists (条件,若为true则执行前面的查询)
实例:	select * from sc where exists (
		select * from sc where sno = "s001"
		)

any

score > any (12,432,51)   	        大于最小值
score < any (12,432,51)			小于最大值
score = any (12,432,52)			等价于 in

all: > <

score  > all(10,5,10,30)  大于最大值
score  < all (10,5,10,30)  小于最小值

外连接

left join :左外连接
right join : 右外连接
inner join : 内连接

内连接 :和前面的多表连接效果一样,都是将可以匹配的数据连接显示

select * from student inner join sc on student.sno=sc.sno

左外连接 :以左表为基表,基表中的数据会全部显示

select * from student left join sc on student.sno=sc.sno

右外连接 :以右表为基表,基表中的数据会全部显示

select * from student right join sc on student.sno=sc.sno

连接四个表,并且显示所有学生的信息

select * from student left join sc on 
student.sno=sc.sno left join course on
sc.cno=course.cno left join teacher on
course.tno=teacher.tno

数据库三大范式

为了建立冗余较小,结构合理的数据库
设计数据库时必须遵守一定的规则
在关系型数据库中这种规则就称为范式

第一范式 1NF
确保每列的原子性
第二范式 2NF
确保每一个实体可以唯一区分,前提需要主键
每一列都和主键完全相关而不是和主键的某一列相关
每张表中只有一类实体,如果有其他的实体,需要分离出新表
如果多对多关系,需要一张中间表
第三范式 3NF
每一列都必须和主键直接相关,不能间接相关


事务

事务 :事务是一个最小的执行单元
里面的代码功能要么同时成功,要么同时失败
程序中转账:数据库中两个账户,一个减钱,一个加钱
不能同时执行,只能按照步骤一步一步执行
事务的特性
原子性 :一个事务是一个最小执行单元,就像一个原子不可再分割
里面的内容要么同时成功,要么同时失败
一致性 :表示数据前后总量不发生变化
隔离性 :多个事务同时操作,需要有隔离级别
持久性 :对数据的操作是永久性的,保存到介质上

隔离等级
读未提交 :脏读 不可重复读 幻读
读已提交 :不可重复读 幻读
可重复读 :幻读 mysql默认的隔离级别
串行化 :排队 不会出现问题,效率低
不同隔离等级可能会出现的问题:脏读 不可重复读 幻读

实例:小明给小李转账 100

#开启事务
start transaction
update money set my_money = my_money-100 where sname = "小明";
update money set my_money = my_money+100 where sname = "小李"

-- 如果没有出现异常,提交事务
commit 
-- 如果中途出现了异常,回滚到开启事务之前
rollback

查询出钱小于 6000 的同学,然后修改他的钱 +100

update money set my_money=my_money+100 where sname in(
	select * from(
		select sname from money where my_money < 6000
	) as aa
)
#每一个派生出来的表都必须有一个自己的别名

视图&索引

程序开发过程中,有的查询语句可能非常复杂,花费的时间很多,
而且使用的频率较高

视图 :将某些复杂的查询结果保存为一个视图,后面如果需要使用这里面的数据,直接查询视图即可,不用再去查询复杂的sql语句,视图本身不是表,只是数据的一种表现形式,我们不可以像操作表一样操作视图。
作用 :用于提高查询速度
注意 :不能对视图的数据进行增删改操作,只用于查询

– 创建视图

create view money_view as 
select * from money where my_money > 6000

– 查询视图

select * from money_view 

– 删除视图

drop view money_view

索引 index :数据表中的一部分,目的是提高查询的效率
通俗理解:表如果是一本书,索引就是目录

如果没有创建索引,会去遍历所有数据查询需要的结果

什么时候使用索引
在数据量非常大的情况下,需要出现在where或者order by后面的字段
可以设置索引

索引在增删改的时候,索引文件也会相应的改动,如果一个表经常需要
增删改,那么谨慎设置索引

创建索引

create index index_id on index_table (sid)

删除索引

drop index index_id on index_table

补充内容

有一个订单表orders,其中记录有各订单的总金额total,同时还有一个订单明细表order_detail,其中记录有各订单每一产品的金额小计 subtotal,假设我们需要检查这两个表的金额合计是否相符,可能就需要执行如下两条SQL:

Select sum(total) from orders;
Select sum(subtotal) from order detail;

此时需要给查询语句加读锁,避免在查询的时候其他线程对其数据进行了修改

Lock tables orders read ocal order detal read local;
Select sum(total) from orders;
Select um(subtotal) from order detail;
Unlock tables;
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq946768/article/details/109135177

智能推荐

android播放vp8透明,在android上构建vp8-程序员宅基地

从http://git.chromium.org/gitweb/?p=webm/bindings.git;a=blob_plain;f=JNI/README.Android开始进行一些调整以便于阅读.>创建{project} / jni文件夹.>获取JNI绑定.git clone 07001>获取libvpx.git clone 07002>为Android配置libvpx..._app中vp8

线性代数应该这样学目录_线性代数应该这么学-高清带完整目录-程序员宅基地

Vector SpacesFinite-Dimentional Vector SpacesLinear MapsPolynomialsEigenvalues, Eigenvectors, and Invariant SubspacesInner Product SpacesOperators on Inner Product SpacesOperato..._线性代数应该这么学-高清带完整目录

C#调用笔记本摄像头当镜子用_我的c#vs2019 调用笔记本摄像头-程序员宅基地

作者:记忆的森林转自:http://www.cnblogs.com/leonwang/archive/2011/08/12/2136657.html前段时间看见别人写的一篇 c#调用网络摄像头的,正好搬到的新的地方,这地儿洗脸的地方木有镜子用,每天起床,头发总是很乱,也不想专门去超市买个镜子,又正好笔记本上有个摄像头,平时也木有MM跟偶视频聊天,纯粹的浪费了一个多好的功能,_我的c#vs2019 调用笔记本摄像头

计算机系给未来的自己写信,如何给未来的自己写信-程序员宅基地

你是否在上大学时给四年后的自己写过一篇规划,或者一封信什么的,当你结束时你有什么感觉呀?我们给未来自己写的信只适合现在的你首先是对未来的憧憬,设想一下未来的自己会怎么样,跟着自己的现在的所见所想给自己设置的形象,有用吗?当然有用,它可以给你行动力,让你为了成为更好的自己不断的优化自己,再问问自己真的有用吗?实际上用处并不是很大,4年的变化还是很大的,现在你设想的只是现在这个状态和思维下的自己,所以...

在子类的初始化中调用父类的初始化_python初始化子类的时候为什么只能传父类的参数-程序员宅基地

python每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法。如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问,但是该方法或属性在子类中并不存在,那么就会自动的去其父类中进行查找。 继承父类后,就能调用父类方法和访问父类属性,而要完成整个过程,子类是需要调用父类的构造函数的。 子类不显式调用父类的构造方法,而父类构造函数初始化了一些属性,就会出现问题 如果子类和_python初始化子类的时候为什么只能传父类的参数

fedora 16 x64 构建vim+vimgdb+gdb C/C++调试环境-程序员宅基地

fedora下的vim和gdb安装可以通过yum方式安装,这里不在说了,主要是vimgdb安装,在http://www.vim.org/scripts/script.php?script_id=3039下载vimgdb.tar.gz,按照官方的说法,解压该文件,复制vimgdb、vimgdb_msg到任意的系统路径目录(即$PATH目录),然后复制vimgdb.vim 到 ~/.vim/mis..._fedora怎么调试vim

随便推点

使用AW9523B芯片驱动16路LED时,LED出现误点亮的问题-程序员宅基地

使用AW9523B芯片驱动16路LED时,某些LED误点亮的问题_aw9523b

DB2备份操作_dbvisualizer备份表数据sql-程序员宅基地

misdb---->webdb1.建立目标数据库,webdb 例:db2 create db webdb2.在源数据库中导出教表得DDL语句 例:db2look -d misdb -e -a -o c:/test.sql -i db2inst1 -w db2manager 参数说明: -e: 抽取复制数据库所需要的 DDL 文件 -o: 将输出重定向到给定的文件名 -i: 登录到数_dbvisualizer备份表数据sql

DICOM笔记-Qt读取JPEG格式DICOM文件_qt dicom_黑山老妖的笔记本的博客-程序员宅基地

INCLUDEPATH+="C:\DCMTK\Out-Debug-x64\include"LIBS+= -L$$quote("C:/DCMTK/Out-Debug-x64/lib/")LIBS+=cmr.lib \dcmdata.lib \dcmdsig.lib \dcmect.lib \dcmfg.lib \dcmimage.lib \dcmimgle.lib \dcmiod.lib \dcmjpeg.lib \dcmjpls.lib \dcmnet.lib \dcmpmap.l_qt dicom

黑马程序员__C语言__流程控制__选择结构-程序员宅基地

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------流程控制c语言中有3中结构控制程序运行1> 顺序结构:默认的流程结构,按照书写的顺序执行每一条语句2> 选择结构:对给定的条件进行判断,在根据判断结果来决定来执行哪一段代码3> 循环结构:在给定条件成立的情况下,反复执行某一段代码1.选择结构if语句...

C++11多线程互斥锁的使用_m_waitingadditemsmutex.lock();-程序员宅基地

#include #include #include #include #include #include #include // 参考:http://www.cnblogs.com/haippy/p/3284540.htmlnamespace thread_lock {std::mutex g_io_mutex;//------------------------_m_waitingadditemsmutex.lock();

C#设计模式之:抽象工厂模式与反射_c#反射和工厂模式的区别-程序员宅基地

复习工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类UML代码class User{ private int _id; public int Id { get =&gt; _id; set =&gt; _id = value; } private string _name; public string Name { ge..._c#反射和工厂模式的区别

推荐文章

热门文章

相关标签