本篇专门记录数据库增删改查中最常用、花招最多的 查。

【文章结构】

一、数据的准备

二、基本的查询功能

三、条件查询

四、查询排序

五、聚合函数

六、分组查询

七、分页查询

八、连接查询

九、子查询

十、自关联

【正文】

一、数据的准备

首先创建一个数据库,以便后文命令的使用。

注意,我使用高版本时,发现groups 不能用作表名了

-- 创建一个数据库
create database pysql charset=utf8; -- 使用数据库
use pysql; -- 查看当前使用的是哪个数据库
select database(); -- 创建数据表groups, heroes
create table groups (
id int unsigned auto_increment primary key,
name varchar(20) not null
); create table heroes (
id int unsigned auto_increment primary key not null,
name varchar(20) default "",
age tinyint unsigned default 0,
height decimal(5,2),
gender enum("男", "女", "保密") default "保密",
grp_id int unsigned default 0,
is_delete bit default 0
); -- 查看数据库中已有的数据表
show tables; -- 了解数据表的创建方式
show create table heroes; -- 插入数据
insert into heroes values
(0,"妮蔻",18,150.00,2,1,0),
(0,"泰隆",50,188.00,1,1,0),
(0,"阿狸",16,179.00,1,1,0),
(0,"赏金",17,175.68,2,3,1),
(0,"盲僧",90,190.00,1,1,0),
(0,"盖伦",30,197.89,1,1,0),
(0,"光辉",18,160.00,2,1,1),
(0,"希维尔",21,167.90,3,2,0),
(0,"劫",70,null,2,1,1),
(0,"派克",34,170.00,1,6,0),
(0,"卡莎",18,180.90,2,1,0),
(0,"塔姆",56,150.00,1,2,0),
(0,"阿木木",90,130.01,1,1,0),
(0,"娜美",18,173.00,2,4,0); insert into groups values (0, "宗师"), (0, "黑铁"), (0, "黄金");

二、基本的查询功能

-- 查询所有字段(大数据库中慎用)
-- select * from 表名;
select * from heroes;
select * from groups; -- 查询指定字段
-- select 列1, 列2,...from 表名;
select name, age from heroes; -- 使用as给字段起别名
-- select 字段 as 别名 from 表名;
select name as "姓名", age as "年龄" from heroes; -- select 表名.字段... from 表名
select heroes.name, heroes.gender from heroes; -- 通过as给表起别名
select h.name, h.gender from heroes as h;
-- select heroes.name, heroes.gender from heroes as h; 报错,改了名就要用... -- 消除重复行(要是京东查手机的时候能有这么个命令,出现过的型号不要再出现就好了)
-- distinct 字段
select distinct gender from heroes;

三、条件查询

-- 比较运算符
-- select ... from 表名 where 条件
-- >
-- 查询大于18岁的信息
select * from heroes where age>18; -- <
-- 查询id小于5的信息
select * from heroes where id<5; -- >=
-- <=
-- 略 -- =
--查询性别为男的英雄的id和名字
select id,name from heroes where gender=1; -- != 或者 <> (<>在很多语言中都不用,所以首选 !=)
select id,name from heroes where gender!=1; -- 逻辑运算符(与 或 非)
-- and
-- 18到50岁之间英雄的信息
-- 报错 select * from heroes where age>18 and <50; 判断语句 左右两边都要写全
select * from heroes where age>18 and age<50; -- 18岁以上的女性
select * from heroes where age>18 and gender=2;
select * from heroes where age>18 and gender="女";
-- or
-- 50岁以上或身高180(包含)以上
select * from heroes where age>50 or height>=180; -- not
-- not 加在谁前面就仅仅否定这一个条件,用()解决优先级的问题,不要死记硬背
-- 不属于 70岁以上男英雄 的
select * from heroes where not (age>70 and gender=1); -- 年龄不小于或等于18 的女性英雄.用()解决优先级的问题
select * from heroes where (not age<=18) and gender=2; -- 模糊查询
-- like (效率低)
-- % 替换1个,0个或多个
-- _替换一个
--查询姓名中以“赏”开头的名字
select name from heroes where name like "赏%"; --查询姓名中有“赏”的名字
select name from heroes where name like "%赏%"; --查询两个字的名字
select name from heroes where name like "__"; --查询至少两个字的名字
select name from heroes where name like "__%"; -- rlike 正则
-- 查询以“泰”开始的名字
select name from heroes where name rlike "^泰.*"; -- 查询以“希”开头,“尔”结尾的名字
select name from heroes where name rlike "^希.*尔$"; -- 范围查询
-- in (18, 70, 50) 表示在一个非连续的范围内
-- 查询年龄为18,70的英雄
select name, age from heroes where age in (18, 70, 50); -- not in (18, 70, 50) 不在某个非连续的范围内
select name, age from heroes where age not in (18, 70, 50); -- between .. and .. 在某个连续的范围内
select name, age from heroes where age between 18 and 50;
-- not between .. and .. 不在某个范围中,这是一个整体的语句,同时否定between和and的内容
-- 报错 select name, age from heroes where age not (between 18 and 50);
select name, age from heroes where age not between 18 and 50;
select name, age from heroes where not age between 18 and 50; -- 判断为空
-- is null
-- a = None 表示 a没有指向任何东西,a = "" 表示a指向一个为空的对象
-- 查询身高为空的信息
select * from heroes where height is null;
-- 不为空的
select * from heroes where height is not null;

四、查询排序

-- order by 字段
-- asc 升序(默认值)
-- desc 降序
-- 先写那个条件,先按照这个条件排序,相同情况下,按第二个排,否则不生效 --查询年龄在20-70的男英雄,按照年龄升序排列
select * from heroes where (age between 20 and 70) and gender=1 order by age;
select * from heroes where (age between 20 and 70) and gender=1 order by age asc; -- order by 多个字段
-- 查询年龄在16-24之间的女性,按身高降序排列,如相同,按年龄升序排列
select * from heroes where (age between 16 and 20) and gender=2 order by height desc,age asc; -- 全部人员,按照年龄从小到大排列,身高从高到低
select * from heroes order by age, height desc;

五、聚合函数

-- 函数,带括号那种。

-- 总数
-- count
-- 查询男英雄有多少人
select count(*) as "男英雄个数" from heroes where gender=1; -- 最大值
-- max
-- 查询最大的年龄
select age from heroes;
select max(age) from heroes; -- 查询女性最高身高
select max(height) as "最高身高" from heroes where gender=2; -- 求和
-- sum
-- 所有人身高总和
select sum(height) from heroes; -- 平均值
-- avg
-- 女性平均年龄,以下两种方式均可,此处目的在于说明select后面可以加运算式,
-- 但此类统计中尽量避免第二种方式,例如在此数据表中,如果是平均身高的话,因为有一个null的存在...
select avg(age) from heroes where gender=2;
select sum(age)/count(*) from heroes where gender=2; --===================================== -- 通过下面的命令得到的是女性的个数
select count(*) from heroes where gender=2;
-- 通过下面的命令得到的是女性的总身高
select sum(height) from heroes where gender=2; -- 以下两种方式得到的女性平均身高不相等
select avg(height) from heroes where gender=2;
select sum(height)/count(*) from heroes where gender=2; --自然也是不相等的...
select avg(height) from heroes;
select sum(height)/count(*) from heroes; --===================================== -- 四舍五入 round(123.23 , 1) => 保留1位小数
--计算所有人的平均年龄,保留2位小数
select round(sum(age)/count(*), 2) from heroes;
select round(avg(age), 2) from heroes; -- 男性的平均身高,保留2位小数
select round(avg(height), 2) from heroes where gender=1;

六、分组查询

-- 要和聚合搭配使用,才比较有意义

-- group by
-- 按照性别分组,查询所有的性别
-- select 可以唯一标记每个分组的...东西 from heroes group by gender;
select gender from heroes group by gender; -- 计算每种性别有多少人
select gender, count(*) from heroes group by gender;
-- 此处的count(*) 是对每组的计算结果 -- 计算每组中的最大年龄、平均年龄
select gender, max(age) from heroes group by gender;
select gender, avg(age) from heroes group by gender; -- group_concat(...)
-- 查询同种性别中的姓名等信息(查看组里的信息用 group_concat(想看的信息))
-- 统计每种性别都包括哪个英雄(数据多了,就可以统计,地区,部门等等)
select gender, group_concat(name) from heroes group by gender; -- 计算男性的人数(先写where,再写group by)
select gender,count(*) from heroes where gender=1 group by gender;
-- 计算男性人数,并查看男性都包括谁
select gender,count(*), group_concat(name) from heroes where gender=1 group by gender;
-- 计算男性人数,并查看男性都包括谁,以及每个人的id
select gender,count(*), group_concat(name,id) from heroes where gender=1 group by gender;
select gender,count(*), group_concat(name,"_",id," ",age) from heroes where gender=1 group by gender; -- having
-- where 是从数据表中过滤数据,而having是从分组结果中过滤数据
-- 查询平均年龄超过40的性别,以及其中包含的人名 having avg(age) > 30
select gender, group_concat(name), avg(age) from heroes group by gender having avg(age) > 30; -- 查询人数多于2的性别
select gender, group_concat(name), count(*) from heroes group by gender having count(*) > 2;

七、分页查询

-- 例如 网页中选择页数
-- limit start(起始), count(个数) -- 限制查询出来的数据个数
select * from heroes where gender=1 limit 2; -- 查询前5个数据
select * from heroes limit 0, 5; -- 查询id 6-10(包含)的数据(id=1是第0个,id=6是第5个)
select * from heroes limit 5, 5; -- 每页显示2个,显示第6页的信息,按照年龄升序排序(limit 放在命令末尾)
select * from heroes order by age asc limit 10, 2; -- 查询所有女性信息,按升高降序,只显示前两个
-- 报错,刚开始想的..select gender, group_concat(name), age from heroes having gender=2 limit 2;
select * from heroes where gender=2 order by height desc limit 2;

八、连接查询

-- 内连接 取多个表的交集,否则不显示

  -- inner join ... on

  -- select * from 表1 inner join 表2; 将两张表对应起来
-- 表1 一行一行的来对应表2 所有行
select * from heroes inner join groups; -- 查询有能够对应小队的的英雄以及小队信息
-- select * from 表1 inner join 表2 on 条件;
select * from heroes inner join groups on heroes.grp_id=groups.id; -- 按照要求显示姓名 小队
select heroes.*, groups.name from heroes inner join groups on heroes.grp_id=groups.id;
select heroes.name, groups.name from heroes inner join groups on heroes.grp_id=groups.id; -- 给数据表起别名
select h.name, g.name from heroes as h inner join groups as g on h.grp_id=g.id;
select h.name as "英雄", g.name as "小队" from heroes as h inner join groups as g on h.grp_id=g.id; -- 查询 有能够对应小队的英雄以及小队的信息,显示英雄的所有信息,只显示小队名称
select h.*, g.name from heroes as h inner join groups as g on h.grp_id=g.id; -- 在以上的查询中,将小队名字显示在第一列
select g.name, h.* from heroes as h inner join groups as g on h.grp_id=g.id; -- 查询有能够对应小队的的英雄以及小队信息,按照小队进行排序,当小队相同时,按英雄的id 升序排序
select g.name, h.* from heroes as h inner join groups as g on h.grp_id=g.id order by g.name,h.id; -- 左连接:以左边的表为基准去从右面的表取东西
-- left join
-- 查询每位英雄对应的小组信息
select h.*, g.name from heroes as h left join groups as g on h.grp_id=g.id order by g.name,h.id;
select h.*, g.name from heroes as h left join groups as g on h.grp_id=g.id;
select * from heroes as h left join groups as g on h.grp_id=g.id; -- 查询没有对应班级信息的学生
select * from heroes as h left join groups as g on h.grp_id=g.id having g.id is null;
select * from heroes as h left join groups as g on h.grp_id=g.id where g.id is null; -- 右连接
-- right join...on 用的很少
-- 将数据表名字互换位置,用left join即可完成

九、子查询

-- select 中套着一个select
-- 查询最高的男英雄的信息
select * from heroes where height = (select max(height) from heroes where gender=1);

十、自关联

-- 一个表通过更改别名,当做两个表使用
-- select * from 表1 as 表A inner join 表1 as 表B on 表A.xxx=表B.yyy having 条件;

# 和时间赛跑

MySQL数据库 | 数据表-查询命令详细记录的更多相关文章

  1. Vc数据库编程基础MySql数据库的表查询功能

    Vc数据库编程基础MySql数据库的表查询功能 一丶简介 不管是任何数据库.都会有查询功能.而且是很重要的功能.上一讲知识简单的讲解了表的查询所有. 那么这次我们需要掌握的则是. 1.使用select ...

  2. Mariadb/MySQL数据库单表查询基本操作及DML语句

    Mariadb/MySQL数据库单表查询基本操作及DML语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一数据库及表相关概述 1>.数据库操作 创建数据库: CREATE ...

  3. 第二百七十七节,MySQL数据库-数据表、以及列的增删改查

    MySQL数据库-数据表.以及列的增删改查 1.创建一个表 CREATE(创建) TABLE(表) ENGINE(引擎) ENGINE=INNODB(引擎)还有很多类引擎,这里只是简单的提一下INNO ...

  4. mysql数据库、表、字段、记录:增、删、改、查

    /* 结构:数据库.表.字段.记录 操作:增删改查 */ -- 1.数据库:增删改查 create datebase if not exists jkxy; drop database if exis ...

  5. opencart 3.0 版本数据库数据表字典(详细篇)

    1.下文是opencart3.0版本数据库数据表字典,表字段与功能的介绍都比较详细.             数据表 address :地址表,会员在结账时储存的账单地址或者配送地址(这个与区域配送方 ...

  6. Mysql数据库多表查询

    一.介绍 首先说一下,我们写项目一般都会建一个数据库,那数据库里面是不是存了好多张表啊,不可能把所有的数据都放到一张表里面,肯定要分表来存数据,这样节省空间,数据的组织结构更清晰,解耦和程度更高,但是 ...

  7. MySQL数据库 | 数据表的增删改查

    MySQL数据的增删改查(crud) 本文结构 一.增加 create 二.修改 update 三.查询 retrieve(简单查询,下篇详细展开) 四.删除 delete 首先,创建简单的class ...

  8. Mysql数据库单表查询

    1.单表查询语法 #查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据.下面是完整的一个单表查询的语法 select * from,这个sel ...

  9. MySQL数据库-数据表(下)

    分析:给 reader 表添加数据. INSERT INTO:插入数据,插入数据的时候会检查主键或者唯一索引,如果出现重复就会报错: 语法:INSERT INTO table_name VALUES ...

随机推荐

  1. UVA1601-双向广度优先搜索

    #include <iostream> #include <cstdio> #include <queue> #include <cstring> us ...

  2. Edit页面返回ViewBag json字符串与前端js交互

    很多时候,在打开一个新页面的时候,后端需要同时传一个json字符串给前端页面,但是我们又不能把action的返回值改为string,这时候我们就需要用到ViewBag将json字符串传回到前端,前端j ...

  3. IDEA 解决Number objects are compared using '==', not 'equals()' 警告

    当代码被工具标黄色高亮时,代表需要优化或重构了 == 是值相等.对于Integer这样的数据类型而言,意义是两个Integer对象的内存地址相等.也就是说如果你有两个不同的Integer的对象, 如果 ...

  4. 2级搭建类201-Oracle 12cR2 单实例 ASM(OEL7.7)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列除特定项目目前不对外发布,仅作为博客记录,其他公开.如学员在 ...

  5. 爬格子呀--IEEE极限编程大赛留念

    10.14,坐标:电子科技大学 24h,不间断的编程,感觉还是很爽的. 排名一般,但是这是开始,未来还很远. 题目举例1: 广袤的非洲大草原上,狮子居住在一个个的网格里,他们的势力范围会以曼哈顿路程的 ...

  6. CSS 美化网页元素

    一.为什么使用CSS 1.有效的传递页面信息 2.使用CSS美化过的页面文本,使页面漂亮.美观,吸引用户 3.可以很好的突出页面的主题内容,使用户第一眼可以看到页面主要内容 4.具有良好的用户体验 二 ...

  7. PGET,一个简单、易用的并行获取数据框架

    使用场景 当我们的服务收到一个请求后,需要大量调用下游服务获取业务数据,然后对数据进行转换.计算后,响应给请求方. 如果我们采用串行获取下游数据,势必会增加响应时长,降低接口的qps.如果是并行获取下 ...

  8. Python编码小技巧分享【新手必学】

       本次分享了python编程小技巧总结如下,希望对大家有帮助,非常实用哦注意:很多人学Python过程中会遇到各种烦恼问题,没有人帮答疑.为此小编建了个Python全栈免费答疑交流.裙 :一久武其 ...

  9. nginx 简单理解和配置

    1.概念 Nginx是一个高性能的HTTP和反向代理的web服务器,同时也提供了IMAP/POP3/SMTP服务,Nginx是由伊戈尔·塞索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一 ...

  10. #助力CSP2019# OI中容易出现的**错误汇总

    多测不清空,爆0两行泪 3年OI一场空,不开long long见祖宗 线段树空间需要开4倍 读入有负数的时候,如果要写快读,要识别负号 持续更新