MySQL数据库 | 数据表-查询命令详细记录

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

【文章结构】

一、数据的准备

二、基本的查询功能

三、条件查询

四、查询排序

五、聚合函数

六、分组查询

七、分页查询

八、连接查询

九、子查询

十、自关联

【正文】

一、数据的准备

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

-- 创建一个数据库
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(...)
-- 查询同种性别中的姓名等信息
-- 统计每种性别都包括哪个英雄(数据多了,就可以统计,地区,部门等等)
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 条件;

# 和时间赛跑

原文地址:https://www.cnblogs.com/ykit/p/10252339.html

时间: 2024-11-10 13:58:36

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

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

数据库.表.字段.记录:增.删.改.查.分类进行学习,重点是查询. /* 数据库.表.字段.记录:增.删.改.查 */ -- 1.数据库:增删改查 create datebase if not exists jkxy; drop database if exists jkxy; rename database jkxy to jikexueyuan; --这条语句官方说不能用了 show databases; use jikexueyuan; /* 1.CREATE DATABASE new_d

Mysql数据库多表查询

一.介绍 首先说一下,我们写项目一般都会建一个数据库,那数据库里面是不是存了好多张表啊,不可能把所有的数据都放到一张表里面,肯定要分表来存数据,这样节省空间,数据的组织结构更清晰,解耦和程度更高,但是这些表本质上是不是还是一个整体啊,是一个项目所有的数据,那既然分表存了,就要涉及到多个表连接查询了,比如说员工信息一张表,部门信息一张表,那如果我想让你帮我查一下技术部门有哪些员工的姓名,你怎么办,单独找员工表能实现吗,不能,单独找部门表也无法实现,因为部门表里面没有员工的信息,对不对,所以就涉及到

第三步solr实现MySQL 数据库数据表索引

1.修改索引地址:任意位置皆可,本文在E:\solr\下建了一个data文件夹,然后修改E:\solr\collection1\conf\solrconfig.xml 下的dir: 为创建的索引地址路径 <dataDir>${solr.data.dir:E:/solr/data}</dataDir> 2.建立数据库为es_data,在其下面建立一个名为news的数据表 3.在E:\solr\collection1\conf下新建一个data-config.xml文件,在里面添加以下

MySQL 创建数据表的命令行

MySQL中要先创建数据库,让后创建数据表,创建数据表要先设计好数据表的字段,是数字类型,文本类型,是浮点类型,是字符串类型,日期类型等. 1,创建数据表命令行 CREATE TABLE table_name 2,创建数据表的结构体 CREATE TABLE dc3688 ( id INT(11) NOT NULL AUTO_INCREMENT,subject VARCHAR(45) DEFAULT NULL,start_date DATE DEFAULT NULL,end_date DATE

Mysql数据库单表查询

1.单表查询语法 #查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据.下面是完整的一个单表查询的语法 select * from,这个select * 指的是要查询所有字段的数据. SELECT distinct 字段1,字段2... FROM 库名.表名 #from后面是说从库的某个表中去找数据,mysql会去找到这个库对应的文件夹下去找到你表名对应的那个数据文件,找不到就直接报错了,找到了就继续后面的操作 WHERE 条件 #从表中

MySQL数据库 多表查询 交叉连接 自然连接 内连接 自连接 外连接 子查询 多表查询练习 单表查询练习 &#109806;

原文: http://blog.gqylpy.com/gqy/466 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我

如何通过PhpMyAdmin批量删除MYSQL数据库数据表

使用这个方法前,强烈建议先备份整个数据库.至于怎么备份?你不会么?在本文下方留言吧. 具体方法:复制下面的php执行语句,保存为sql.php文件(注意配置数据库名称.密码.数据表头),通过ftp上传到网站跟目录,运行. <?php //设置数据库连接信息.数据库服务器地址,数据库用户名,数据密码 mysql_connect('localhost','root','123456'); //设置查询的数据库名称,比如CMSYOU当前设置的是phpcms mysql_select_db('phpcm

19 MySQL概念 数据库 数据表 数据类型 增加删除修改查询 WHERE Order By Limit

数据库管理系统DBMS 数据库中相关概念 数据库 数据表 记录 字段 数据 登录和退出MySQL客户端 查询自己的MySQL服务器有几个数据库 二.退出MySQL客户端的命令 修改root用户的密码 在MySQL客户端来修改密码(当前账号的密码) 数据库操作 创建数据库 显示所有数据库 删除数据库 选择数据库 更改数据库默认字符集 数据表操作 显示当前数据库中的所有表 创建数据表 显示表的创建 列的常用属性 修改数据表 删除数据表 显示表结构 MySQL数据类型 整型 浮点型 字符型 文本型 日

MySQL对数据表进行分组查询(GROUP BY)

MySQL对数据表进行分组查询(GROUP BY) GROUP BY关键字可以将查询结果按照某个字段或多个字段进行分组.字段中值相等的为一组.基本的语法格式如下: GROUP BY 属性名 [HAVING 条件表达式] [WITH ROLLUP] 属性名:是指按照该字段的值进行分组. HAVING 条件表达式:用来限制分组后的显示,符合条件表达式的结果将被显示. WITH ROLLUP:将会在所有记录的最后加上一条记录.加上的这一条记录是上面所有记录的总和. GROUP BY关键字可以和GROU