1. 条件

使用where子句对表中的数据筛选,结果为true的行会出现在结果集中

语法如下:

select * from 表名 where 条件;
例:
select * from students where id=1;

where后面支持多种运算符,进行条件的处理比较运算符逻辑运算符模糊查询范围查询空判断

比较运算符

等于: =
大于: >
大于等于: >=
小于: <
小于等于: <=
不等于: != 或 <>

例1:查询编号大于3的学生

select * from students where id > 3;

例2:查询编号不大于4的学生

select * from students where id <= 4;

例3:查询姓名不是“黄蓉”的学生

select * from students where name != ‘黄蓉’;

例4:查询没被删除的学生

select * from students where is_delete=0;

逻辑运算符

and
or
not

例5:查询编号大于3的女同学

select * from students where id > 3 and gender=0;

例6:查询编号小于4或没被删除的学生

select * from students where id < 4 or is_delete=0;

模糊查询

like
%表示任意多个任意字符
_表示一个任意字符

例7:查询姓黄的学生

select * from students where name like ‘黄%’;

例8:查询姓黄并且“名”是一个字的学生

select * from students where name like ‘黄_’;

例9:查询姓黄或叫靖的学生

select * from students where name like ‘黄%’ or name like ‘%靖’;

范围查询

in表示在一个非连续的范围内

例10:查询编号是1或3或8的学生

select * from students where id in(1,3,8);

between ... and ...表示在一个连续的范围内

例11:查询编号为3至8的学生

select * from students where id between 3 and 8;

例12:查询编号是3至8的男生

select * from students where (id between 3 and 8) and gender=1;

空判断

注意:null与''是不同的
判空is null

例13:查询没有填写身高的学生

select * from students where height is null;

判非空is not null

例14:查询填写了身高的学生

select * from students where height is not null;

例15:查询填写了身高的男生

select * from students where height is not null and gender=1;

优先级

优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符
and比or先运算,如果同时出现并希望先算or,需要结合()使用
  1. 排序

为了方便查看数据,可以对数据进行排序
语法:

select * from 表名 order by 列1 asc|desc [,列2 asc|desc,…]

说明

将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
默认按照列值从小到大排列(asc)
asc从小到大排列,即升序
desc从大到小排序,即降序

例1:查询未删除男生信息,按学号降序

select * from students where gender=1 and is_delete=0 order by id desc;

例2:显示所有的学生信息,先按照年龄从大–>小排序,当年龄相同时 按照身高从高–>矮排序

select * from students order by age desc,height desc;

  1. 聚合函数

为了快速得到统计数据,经常会用到如下5个聚合函数
总数

count(*)表示计算总行数,括号中写星与列名,结果是相同的

例1:查询学生总数

select count(*) from students;

最大值

max(列)表示求此列的最大值

例2:查询女生的编号最大值

select max(id) from students where gender=2;

最小值

min(列)表示求此列的最小值

例3:查询未删除的学生最小编号

select min(id) from students where is_delete=0;

求和

sum(列)表示求此列的和

例4:查询男生的总年龄

select sum(age) from students where gender=1;

– 平均年龄
select sum(age)/count(*) from students where gender=1;

平均值

avg(列)表示求此列的平均值

例5:查询未删除女生的编号平均值

select avg(id) from students where is_delete=0 and gender=2;

  1. 分组
    group by

    group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组
    group by可用于单个字段分组,也可用于多个字段分组

group by + group_concat()

group_concat(字段名)可以作为一个输出字段来使用,
表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合

select gender from students group by gender;
±-------+
| gender |
±-------+
| 男 |
| 女 |
| 中性 |
| 保密 |
±-------+

select gender,group_concat(name) from students group by gender;
±-------±----------------------------------------------------------+
| gender | group_concat(name) |
±-------±----------------------------------------------------------+
| 男 | 彭于晏,刘德华,周杰伦,程坤,郭靖 |
| 女 | 小明,小月月,黄蓉,王祖贤,刘亦菲,静香,周杰 |
| 中性 | 金星 |
| 保密 | 凤姐 |
±-------±----------------------------------------------------------+

select gender,group_concat(id) from students group by gender;
±-------±-----------------+
| gender | group_concat(id) |
±-------±-----------------+
| 男 | 3,4,8,9,14 |
| 女 | 1,2,5,7,10,12,13 |
| 中性 | 11 |
| 保密 | 6 |
±-------±-----------------+

group by + 集合函数

通过group_concat()的启发,我们既然可以统计出每个分组的某字段的值的集合,那么我们也可以通过集合函数来对这个值的集合做一些操作

select gender,group_concat(age) from students group by gender;
±-------±---------------------+
| gender | group_concat(age) |
±-------±---------------------+
| 男 | 29,59,36,27,12 |
| 女 | 18,18,38,18,25,12,34 |
| 中性 | 33 |
| 保密 | 28 |
±-------±---------------------+

分别统计性别为男/女的人年龄平均值
select gender,avg(age) from students group by gender;
±-------±---------+
| gender | avg(age) |
±-------±---------+
| 男 | 32.6000 |
| 女 | 23.2857 |
| 中性 | 33.0000 |
| 保密 | 28.0000 |
±-------±---------+

分别统计性别为男/女的人的个数
select gender,count() from students group by gender;
±-------±---------+
| gender | count(
) |
±-------±---------+
| 男 | 5 |
| 女 | 7 |
| 中性 | 1 |
| 保密 | 1 |
±-------±---------+

group by + having

having 条件表达式:用来分组查询后指定一些条件来输出查询结果
having作用和where一样,但having只能用于group by

select gender,count() from students group by gender having count()>2;
±-------±---------+
| gender | count(*) |
±-------±---------+
| 男 | 5 |
| 女 | 7 |
±-------±---------+

group by + with rollup

with rollup的作用是:在最后新增一行,来记录当前列里所有记录的总和

select gender,count() from students group by gender with rollup;
±-------±---------+
| gender | count(
) |
±-------±---------+
| 男 | 5 |
| 女 | 7 |
| 中性 | 1 |
| 保密 | 1 |
| NULL | 14 |
±-------±---------+

select gender,group_concat(age) from students group by gender with rollup;
±-------±------------------------------------------+
| gender | group_concat(age) |
±-------±------------------------------------------+
| 男 | 29,59,36,27,12 |
| 女 | 18,18,38,18,25,12,34 |
| 中性 | 33 |
| 保密 | 28 |
| NULL | 29,59,36,27,12,18,18,38,18,25,12,34,33,28 |
±-------±------------------------------------------+

  1. 获取部分行

当数据量过大时,在一页中查看数据是一件非常麻烦的事情
语法

select * from 表名 limit start,count

说明

从start开始,获取count条数据

例1:查询前3行男生信息

select * from students where gender=1 limit 0,3;

示例:分页

已知:每页显示m条数据,当前显示第n页
求总页数:此段逻辑后面会在python中实现查询总条数p1使用p1除以m得到p2如果整除则p2为总数页如果不整除则p2+1为总页数
求第n页的数据

select * from students where is_delete=0 limit (n-1)*m,m

  1. 连接查询

当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回

mysql支持三种类型的连接查询,分别为:

内连接查询:查询的结果为两个表匹配到的数据右连接查询:查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充左连接查询:查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充

语法

select * from 表1 inner或left或right join 表2 on 表1.列 = 表2.列

例1:使用内连接查询班级表与学生表

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

例2:使用左连接查询班级表与学生表

此处使用了as为表起别名,目的是编写简单

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

例3:使用右连接查询班级表与学生表

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

例4:查询学生姓名及班级名称

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

  1. 子查询
    子查询

    在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句

主查询

主要查询的对象,第一条 select 语句

主查询和子查询的关系

子查询是嵌入到主查询中
子查询是辅助主查询的,要么充当条件,要么充当数据源
子查询是可以独立存在的语句,是一条完整的 select 语句

子查询分类

标量子查询: 子查询返回的结果是一个数据(一行一列)
列子查询: 返回的结果是一列(一列多行)
行子查询: 返回的结果是一行(一行多列)

标量子查询

查询班级学生平均年龄
查询大于平均年龄的学生

查询班级学生的平均身高

select * from students where age > (select avg(age) from students);

列级子查询

查询还有学生在班的所有班级名字找出学生表中所有的班级 id找出班级表中对应的名字

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

行级子查询

需求: 查找班级年龄最大,身高最高的学生
行元素: 将多个字段合成一个行元素,在行级子查询中会使用到行元素

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

子查询中特定关键字使用

in 范围格式: 主查询 where 条件 in (列子查询)

总结
查询的完整格式

SELECT select_expr [,select_expr,…] [
FROM tb_name
[WHERE 条件判断]
[GROUP BY {col_name | postion} [ASC | DESC], …]
[HAVING WHERE 条件判断]
[ORDER BY {col_name|expr|postion} [ASC | DESC], …]
[ LIMIT {[offset,]rowcount | row_count OFFSET offset}]
]

完整的select语句

select distinct *
from 表名
where …
group by … having …
order by …
limit start,count

执行顺序为:from 表名where ....group by ...select distinct *having ...order by ...limit start,count
实际使用中,只是语句中某些部分的组合,而不是全部

视图

  1. 视图是什么

通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);

方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;
2. 定义视图

建议以v_开头

create view 视图名称 as select语句;

  1. 查看视图

查看表会将所有的视图也列出来

show tables;

  1. 使用视图

视图的用途就是查询

select * from v_stu_score;

  1. 删除视图

drop view 视图名称;
例:
drop view v_stu_sco;

  1. 视图的作用

    提高了重用性,就像一个函数
    对数据库重构,却不影响程序的运行
    提高了安全性能,可以对不同的用户
    让数据更加清晰

事务

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
事务四大特性(简称ACID)

原子性(atomicity)一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性一致性(consistency)数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在执行第三、四条语句之间时系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)隔离性(isolation)通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)持久性(durability)一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)

索引

当数据库中数据量很大时,查找数据会变得很慢

优化方案:索引

  1. 索引是什么

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度

  1. 索引的使用

    查看索引

show index from 表名;

创建索引如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致字段类型如果不是字符串,可以不填写长度部分

create index 索引名称 on 表名(字段名称(长度))

删除索引:

drop index 索引名称 on 表名;

MySQL查询这一篇就够了相关推荐

  1. PHP+Mysql查询上一篇和下一篇文章实例

    PHP+Mysql查询上一篇和下一篇文章实例 简单的PHP+Mysql查询上一篇和下一篇文章实例,并输出上一篇和下一篇文章的标题和链接,适合新手学习 获取当前浏览文章id: 1 $id = isset ...

  2. mysql客户端栏目变灰色,MySQL看这一篇就够了

    No.1 数据库概念 什么是数据库? 数据库就是一种特殊的文件,内部存储着需要的数据 RDBMS 所谓关系数据库,是建立在关系模型基础的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据 SQ ...

  3. MySQL看这一篇就够了

    No.1 数据库概念 什么是数据库? 数据库就是一种特殊的文件,内部存储着需要的数据 RDBMS 所谓关系数据库,是建立在关系模型基础的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据 SQ ...

  4. 惊呆!学习MySQL真的这一篇就够了!太全了

    这是我见过学习MySQL最全的一篇文章! https://caochenlei.blog.csdn.net/article/details/107640904 目录 第一章 数据库概述 1.1.数据库 ...

  5. 《JavaWeb篇》01.Mysql看这一篇就够了

    目录 一.MySQL基础 资源分享 1,数据库相关概念 1.1 数据库 1.2 数据库管理系统 1.3 常见的数据库管理系统 1.4 SQL 2,MySQL 2.5 MySQL数据模型 3,SQL概述 ...

  6. 学习MySQL看这一篇就够了

    文章目录 整体大纲 1. 为什么要学习数据库 2. 数据库的相关概念 3. 数据库存储数据的特点 4. 初始MySQL 4.1 MySQL服务的登录和退出 4.2 MySQL的常见命令 4.3 MyS ...

  7. MySQL事务,这篇文章就够了

    原文链接:https://blog.ouyangsihai.cn/ >> MySQL事务,这篇文章就够了 在看这篇文章之前,我们回顾一下前面的几篇关于MySQL的系列文章,应该对你读下面的 ...

  8. mysql ip比较大小_MySQL优化/面试,看这一篇就够了

    原文链接:http://www.zhenganwen.top/articles/2018/12/25/1565048860202.html 作者:Anwen~ 链接:https://www.nowco ...

  9. 基础 | 零散的MySql基础记不住,看这一篇就够啦

    ❝ 这是小小本周的第二篇,本篇将会着重的讲解关于MySql基础的内容,MySql基础看这一篇就够啦. ❞ 送书反馈与继续送书 之情小微信公众号第一次送书,Java深度调试技术,书已经被中奖者麦洛签收, ...

最新文章

  1. 机器学习领域最新十篇论文,来自谷歌、Facebook、普林斯顿大学、斯坦福大学等团队的最新研究成果...
  2. 如何优雅的编写 JavaScript 代码
  3. CF183D T-shirt
  4. 面试pythonweb开发的简历_【经验分享】对于Python各个方向的面试经验分享,非常给力!...
  5. 【转载】回归模型的评价指标
  6. Ubuntu下使用VSCode的launch.json及tasks.json编写
  7. Android 使用intent.putExtra实现Activity之间的参数传递
  8. java中String对象作为参数传递问题
  9. 旷视发布3D感知全栈解决方案!现在,AI+3D只差杀手级应用了
  10. python在线编辑器手机-QPython,一个在手机上运行Python的神器
  11. 外挂(目前看不懂_转帖不要怪我抄袭只是想学习而已)
  12. 转载 :sql server 2005 无法删除数据库 #Test,因为该数据库当前正在使用
  13. 【NLP】用腻了 CRF,试试 LAN 吧?
  14. 开了一个月yunfile的会员,发现没东西可下,做了个软件分享下
  15. xp计算机无法远程桌面连接,xp系统远程桌面不能连接指定计算机的处理方法
  16. 电脑浏览器安全获取京东cookie
  17. java 级数_编写一个Java程序实现级数运算。
  18. 松本行弘(Ruby发明者):Emacs怎样改变了我的人生
  19. 修改Cisco交换机ntp服务器,如何配置Brocade和Cisco光纤交换机的NTP服务器
  20. 投资理财-朋友榕的经历

热门文章

  1. 瑞萨单片USB设备使用
  2. 计算机视觉方向博后,直播回顾 | 深圳大学龚元浩:比几何流快一万倍的曲率滤波算法(附博后招聘)...
  3. android 多个shortCut快捷方式实现以及对58同城快捷方式的实现思路的研究
  4. 沁阳市计算机硬件市场主要分布地,太行山石种分类及太行奇石资源产地分布(图)...
  5. Java Web应用开发 钱荣华、朱勇、屠凯、姜文秀
  6. 软通纽约_纽约地铁数学
  7. matlab——GUI界面设计的相关问题
  8. Maven deploy配置方法
  9. 下标运算符究竟是单目运算符还是双目运算符
  10. 绩效面谈的4种技巧(一)