今天继续MySQL,常用的查询语句,内容有点散。

数据准备
# 创建表
create table students(id int unsigned primary key auto_increment not null,name varchar(20) default ' ',age tinyint unsigned default 0,height decimal(5,2),gender enum('男','女','中性','保密') default '保密',cls_id int unsigned default 0,  is_delete bit default 0);create table classes(id int unsigned not null primary key auto_increment,name varchar(30) not null
);# 向students表中插入数据
insert into students values
(0,'小明',18,180.00,2,1,0),
(0,'小月月',18,180.00,2,2,1),
(0,'彭于晏',29,185.00,1,1,0),
(0,'刘德华',59,175.00,1,2,1),
(0,'黄蓉',38,160.00,2,1,0),
(0,'凤姐',28,150.00,4,2,1),
(0,'王祖贤',18,172.00,2,1,1),
(0,'周杰伦',36,NULL,1,1,0),
(0,'程坤',27,181.00,1,2,0),
(0,'刘亦菲',25,166.00,2,2,0),
(0,'金星',33,162.00,3,3,1),
(0,'静香',12,180.00,2,4,0),
(0,'郭靖',12,170.00,1,4,0),
(0,'周杰',34,176.00,2,5,0);# 向classes表中插入数据
insert into classes values (0, "python_01期"), (0, "python_02期");
一般查询
-- 查询所有字段-- select * from 表名;# 查询学生表里所有信息select * from students;-- 查询指定字段-- select 列1,列2,... from 表名;# 查询学生的姓名和身高select name,height from students;-- 使用 as 给字段起别名-- select 字段 as 名字.... from 表名;# 查询学生的姓名,身高,用中文显示select name as ‘姓名’, height as ‘身高’ from students;-- sql语句完全的形式-- select 表名.字段 .... from 表名;-- 当检查一个表时,可以省略表名,数据库名;当检查多个表时,可以省略数据库名,不可以省略表名,当检查多个数据库时,不可以省略数据库名。# 查找表students中所有人的姓名和身高select students.name,students.height from students;select python_test_1.students.name, python_test_1.students.height from students;-- 可以通过 as 给表起别名-- select 别名.字段 .... from 表名 as 别名;# 查找表students中所有人的姓名及性别,使用asselect s.name,s.gender from students as s;-- 消除重复行-- distinct 字段# 查询班级学生的性别select name,gender from students; # 查询班级有多少种性别select distinct gender from students;
条件查询
-- 比较运算符-- where 条件-- ># 查询年龄大于18岁的信息select * from students where age>18; -- <# 查询小于18岁的信息select * from students where age<18;-- <=# 查询小于或者等于18岁的信息select * from students where age<=18;-- = 而不是 '=='# 查询年龄为18岁的所有学生的名字select name from students where age=18;-- != 或者 <>  实际开发中 最好使用 ! 表示不等于-- <> 不够通用# 查询年龄不为18岁的信息select * from students where age!=18;-- 逻辑运算符-- and# 18岁以上的女性select * from students where age>18 and gender='女';-- or# 18岁以下的男生或者女生select * from students where age<18 and(gender='男' or gender='女');-- not  非# 年龄不是18岁的学生select * from students where age!=18;select * from students where not age=18;-- 年龄是小于或者等于18 并且是女性# select * from students age<=18 and gender='女';-- 模糊查询-- like -- % 表示任意字符可有可无# 查询姓名中 以 "小" 开始的名字select name from students where name like "小%";# 姓名中包含杰select * from students where name like "%杰%";-- _ 表示任意一个字符# 查询有2个字的名字select name from students where name like "__";# 查询有3个字的名字select name from students where name like "___";-- rlike 正则-- python 中match方法表示从头开始匹配# 查询以 周开始的姓名select name from students where name rlike "^周.*";-- 范围查询-- in表示在一个非连续的范围内# 查询 年龄为18、34岁的学生select * from students where age in (18,34);-- not in 不在非连续的范围之内# 年龄不是 18、34岁的学生的信息select * from students where age not in (18,34);# 年龄不是 18、34岁之间的信息select * from students where age<18 or age>34;-- between ... and ...表示在一个连续的范围内  两边都会包含# 查询 年龄在18到34之间的的信息select * from students where age between 18 and 34;-- not between ... and ...表示不在一个连续的范围内# 查询 年龄不在在18到34之间的的信息select * from students where age not between 18 and 34;-- 空判断 null  不能够使用比较运算符# 查询身高为空的信息select * from students where height is null;# 查询身高不为空的学生select * from students where height is not null;
排序
    -- order by 字段  默认就是升序排序 asc 可以省略-- asc从小到大排列,即升序# 查询年龄在18到34岁之间的男性,按照年龄从小到大排序select * from students where gender='男' and age between 18 and 34 order by age asc;-- 降序 desc-- desc从大到小排序,即降序# 查询年龄在18到34岁之间的女性,身高从高到矮排序select * from students where gender='女' and age between 18 and 34 order by height desc;-- order by 多个字段 order by age asc, height desc# 查询年龄在18到34岁之间的女性,身高从高到矮排序, 如果身高相同的情况下按照年龄从小到大排序select * from students where gender='女' and age between 18and 34 order by height desc, age asc;# 查询年龄在18到34岁之间的女性,身高从高到矮排序, 如果身高相同的情况下按照年龄从小到大排序, 如果年龄也相同那么按照id从大到小排序select * from students where gender='女' and age between 18 and 34 order by height desc, age asc, id asc;# 按照年龄从小到大、身高从高到矮的排序select * from students order by age asc, height desc;
聚合函数
    -- 总数-- count() -- count(*) 以行单位来进行统计个数, 效率更高并且更准确-- count(id) --> 获取对应的行--> 获取该行对应字段是否为NULL,效率略差:-- 在工作中要统计所有数据个数,一定要用count(*)# 查询男性有多少人,女性有多少人select count(*) from students where gender='男';select count(*) from students where gender='女';-- 最大值-- max()# 查询最大的年龄select max(age) from students;# 查询女性的最高 身高select max(height) from students;# 最大的年龄对应的名字select name from students where age=(select max(age) from students);-- 最小值-- min()# 身高最矮的女生的名字select name from students where gender='女' and height=(select min(height) from students where gender='女');-- 求和-- sum()# 计算所有人的年龄总和select sum(age) from students;-- 平均值-- avg()# 计算平均年龄select avg(age) from students;# 计算平均身高select avg(height) from students;-- 四舍五入 round(123.23 , 1) 保留1位小数# 计算所有人的平均年龄,四舍五入并且保留2位小数select round(avg(age), 2) from students;# 计算男性的平均身高 保留2位小数select round(avg(height), 2) from students;在sql中? 表示帮助
分组
-- group by 字段# 查询班级学生的性别select gender from students;# 查看有哪几种性别select distinct gender from students; # 结果没有排序# 按照性别分组select gender from students group by gender;select gender from students group by gender asc; # group by 有排序功能,默认对组进行升序(asc可省略)select gender from students group by gender desc; # 也可以将排序设置为降序# 计算每种性别中的人数select gender, count(*) from students group by gender; -- group_concat(...)-- 将一个组的所有数据放在一起# 查询同种性别中的姓名和身高select gender,group_concat(name, '-', height) from students group by gender;-- 分组之后的数据进行筛选和过滤的操作-- having 和 group by 配合使用-- 有having 就一定有group by, 有group by 不一定有having-- 使用having-- 可以使用having 表示对于已经分组的数据做进一步的筛选# 除了男生以外的分组的人数select gender, count(*) from students group by gender having gender!='男';# 查询每种性别中的平均年龄avg(age)select gender, avg(age) from students group by gender;# 查询每种性别中的平均年龄avg(age), 最大年龄,平均身高,最高身高select gender, avg(age), max(age), avg(height), max(height) from students group by gender;# 查询平均年龄超过30岁的性别,以及姓名select gender,group_concat(name) from students group by gender having avg(age)>30; # having 和 where 的区别having 是需要和group by 配合使用的,在group by 之后执行where 是可以单独使用的条件筛选,不需要一定配合group by使用, 是在 group by之前执行的
分页
-- limit start, count-- limit限制有多少条数据, start 跳过多少条数据 count 获取多少条-- start 默认为0 可以省略-- 当数据不够的时候, 有多少条数据就获取多少条数据# 每页显示4个,显示第3页的信息, 按照年龄从小到大排序# 用户已经点击的页码n(n从1开始), 每页显示的条数据m (m > 0)# limit (n-1) * m, m#(3-1)*4=8select * from students order by age asc limit 8, 4; 
连表查询
-- 学生名: students;-- 班级名: classes# 查询学生的信息和学生对应的班级名字select students.*, classes.name from students, classes; -- 触发笛卡尔积查询 使用较少-- 连接查询 将两个表按照某种条件合并到一起-- inner join ... on 内连接查询-- select xx a inner join b on a.id = b.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 s.name, c.name from students as s join classes as c on s.cls_id=c.id; # inner join 的 inner 可以省略# 在以上的查询中,将班级名字显示在第1列-- 内连接表在前或者在后没有影响select c.name, s.name from students as s inner join classes as c on s.cls_id=c.id;# 查询 学生所在的班级, 按照班级进行排序select s.name, c.name from students as s inner join classes as c on s.cls_id=c.id order by c.id;-- 外连接查询: left join + right join-- left join 左外连接查询# 查询每位学生对应的班级信息select s.name, c.name from students as s left join classes as c on s.cls_id=c.id;-- right join 右外连接查询  使用的比较少-- 将数据表名字互换位置,用left join完成-- 扩充了解-- 内连接和外连接的其他写法--  内连接的其他写法select c.name,s.name from students as s join classes as c on s.cls_id = c.id order by c.name;select c.name,s.name from students as s cross join classes as c on s.cls_id = c.id order by c.name;-- 外连接的其他写法select c.name,s.name from students as s left outer join classes as c on s.cls_id = c.id order by c.name;select c.name,s.name from students as s right outer join classes as c on s.cls_id = c.id order by c.name;
自关联
# 创建地区表
create table areas(id int primary key,name varchar(20),p_id int unsigned
);
# 往表中导入数据
insert into areas values(   < 复制粘贴>  ),...# 查询所有省份
select * from areas where p_id is null;
# 查询出广东省有哪些市
select name from areas where p_id=’440000‘;
--想象成父级表 和 子级表
select p.name, c.name from areas as p inner join areas as c on c.p_id = p.id where p.name = '广东省';
# 查询出广州市有哪些区县
select name from areas where p_id='440100';
--想象成父级表 和 子级表
select p.name, s.name from areas as p inner join areas as s on s.p_id = p.id where p.name = '广州市';

Day 014 MySQL-查询相关推荐

  1. 如何在Ubuntu 16.04上使用ProxySQL缓存优化MySQL查询

    The author selected the Free Software Foundation to receive a donation as part of the Write for DOna ...

  2. mysql查询字段大小写结果相同,mysql大小写查询不敏感,mysql5.7查询不区分大小写解决方案。

    下面有两条sql,主键查询,在mysql中查询到的结果相同. SELECT* FROM USER WHEREid = 'EM58hdK4nXC';SELECT* FROM USER WHEREid = ...

  3. MySQL查询进阶之多表查询

    一.多表查询 1.引出 2.笛卡尔积 3. 笛卡尔积的解决方法 二.多表查询分类 1.等值连接和非等值连接 2.自连接和非自连接 3.内连接和外连接 SQL92:使用(+)创建连接 SQL99语法实现 ...

  4. smarty mysql_Smarty处理mysql查询数组

    Smarty处理mysql查询数组 MySQL的查询结果一般是一个数组,而不是所有结果集.因此我们需要将结果全部存到数组中进行处理,然后就可以很轻松的再Smarty中使用了. PHP Mysql 代码 ...

  5. MYSQL 查询数据排序数据和分组数据

    在mysql查询过程中,可以对数据进行过滤,也可以对数据进行排序,可以对数据分组,下面分别讲述排序数据和分组数据例子.1,数据的排序 使用 ORDER BYselect * from where id ...

  6. mysql查询解析过程_MySQL查询执行过程详解

    查询是用户通过设置某些查询条件,从表或其他查询中选取全部或者部分数据,以表的形式显示数据供用户浏览.查询是一个独立的.功能强大的.具有计算功能和条件检索功能的数据库对象.MySQL数据库中,MySQL ...

  7. mysql 查询某个日期时间段,每天同一时间段的数据

    mysql 查询某个日期时间段,每天同一时间段的数据: SELECT * FROM t_a01_eltable WHERE DATE_FORMAT(acqtime,'%Y-%m-%d')>='2 ...

  8. php 多条查询结果插入新表,Mysql应用MySQL查询结果复制到新表的方法(更新、插入)...

    <Mysql应用MySQL查询结果复制到新表的方法(更新.插入)>要点: 本文介绍了Mysql应用MySQL查询结果复制到新表的方法(更新.插入),希望对您有用.如果有疑问,可以联系我们. ...

  9. MySQL查询区分大小写

    2019独角兽企业重金招聘Python工程师标准>>> 问题描述: 找出用户名id为'AAMkADExM2M5NjQ2LWUzYzctNDFkMC1h'的用户的数据: select ...

  10. 100G内存下,MySQL查询200G大表会OOM么?

    文章来源:https://sourl.cn/vwDNzn 我的主机内存只有100G,现在要全表扫描一个200G大表,会不会把DB主机的内存用光? 逻辑备份时,可不就是做整库扫描吗?若这样就会把内存吃光 ...

最新文章

  1. 你的sql查询为什么这么慢?
  2. java 定时删除_Java编写定时删除文件程序
  3. 完美解决NV4_disp.dll已正常停止工作”蓝屏问题
  4. python协程处理海量文件_python_实战篇_使用协程gevent模块实现多任务copyA文件夹到B文件夹...
  5. [机器学习笔记]Note11--聚类
  6. Android安全笔记-Activity基本概念
  7. 多元函数概念思维导图_(重要!)高中数学概念品味+思维导图(全)-2020年1月13日更新 第16章(最后一章) 统计初步...
  8. 大话数据结构之数据结构
  9. 《Effective Java读书笔记》--通用程序设计
  10. 曲演杂坛--SQLCMD下执行命令失败但没有任何错误提示的坑
  11. 规约转换装置的一些概念
  12. Microsoft VS Code安装教程
  13. Xcode slicing 精解
  14. 运营者想针对公众号吸粉做一些运营活动,怎么做?
  15. 为什么选择电阻式温度传感器呢
  16. MySQL必知必会二:MySQL简介
  17. Java绘制椭圆和矩形(实现自由变化大小的功能)
  18. windows系统通过虚拟机安装linux
  19. IDEA打开Maven项目一直indexing或 scanning files to index导致整个idea页面卡住 解决方法
  20. 金蝶BOS开发数据库工具类

热门文章

  1. 谷歌SRE与运维工作的思考
  2. vue中is属性搭配vuedraggable插件实现可拖动可视化大屏展示组件的自定义配置功能
  3. pdf.js使用(在线预览pdf文件)
  4. Quartus 13.0和Modelsim SE 10.1a 联合仿真
  5. 深度之眼Paper带读笔记1:Deep learning
  6. Cobar Client的使用
  7. 综述:如何构建交通领域的基于图的深度学习架构
  8. 去除噪声 matlab 论文,基于MATLAB的语音去噪开题报告
  9. 高校三维地图校内导航系统
  10. “NP问题是可计算的吗?” - 从“可计算性”的角度审视NP