首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql查询集合

Mysql查询集合

作者头像
不断折腾
发布2019-09-23 10:45:41
1.4K0
发布2019-09-23 10:45:41
举报

无论是风里,还是在雨里,我都在这里守候着你~

数据准备及回忆:

进入数据库:

mysql -uroot -p123456

创建一个数据库:

create database student charset = utf8;

进入数据库:

use student;

查看当前所在数据库:

select database();

创建classinfo表:

create table classinfo(

classid int unsigned primary key auto_increment not null,

classname varchar(20) default ''

);

创建studentinfo表:

添加一个is_delete列,表示是否删除。

create table studentinfo(

studentid int unsigned primary key auto_increment not null,

studentname nvarchar(20),

classid int unsigned,

studentsex enum('男','女','保密') default '保密',

studentage tinyint unsigned,

sadress varchar(255),

is_delete bit default 0

);

插入数据:

insert into classinfo values

(0,'Mysql一班'),

(0,'Mysql二班'),

(0,'Mysql三班');

insert into studentinfo values

(0,'张三',1,'男',18,'武汉',0),

(0,'小花',2,'女',20,'长沙',0),

(0,'李四',3,'男',21,'上海',0),

(0,'小猫',1,'女',18,'北京',0),

(0,'王五',2,'男',19,'南京',0),

(0,'小狗',3,'女',25,'成都',0);

查询

--查询所有字段

select * from studentinfo;

select * from classinfo;

--查询指定字段

select studentname,studentsex from studentinfo;

select classname from classinfo;

--使用as给字段添加别名

select studentname as 姓名,studentsex as 性别 from studentinfo;

select classname as 班级名称 from classinfo;

--使用as给表添加别名

select stu.studentname,stu.studentsex from studentinfo as stu;

select cla.classname from classinfo as cla;

--查询性别并去除重复的

select studentsex from studentinfo;

--查出所有的,如果我只想得到男和女和保密可以这样写来消除重复行

select distinct studentsex from studentinfo;

条件查询

-- 比较运算符

-- 查询年龄等于18的人

select * from studentinfo where studentage = 18;

-- 查询年龄不等于18的人

select * from studentinfo where studentage != 18;

或者

select * from studentinfo where studentage <> 18;

-- 查询年龄小于20

select * from studentinfo where studentage < 18;

-- 查询年龄大于等于20的

select * from studentinfo where studentage >= 18;

--逻辑运算符and,or,not

-- 查询18到20之间的

select * from studentinfo where studentage >= 18 and studentage < 20;

-- 查询20岁以下,或者性别为女的

select * from studentinfo where studentage < 20 or studentsex = '女';

-- 查询不在年龄小于20中的

select * from studentinfo where not studentage < 20;

-- 优先级

直接加括号,每个语言都有优先级,记住?不可能的,加括号就好了。

模糊查询

-- like

-- % 替换一个或者多个

-- _ 替换一个

-- 查新名字中含有小的人

select * from studentinfo where studentname like '%小%';

-- 查询名字中以小开头的人

select * from studentinfo where studentname like '小%';

-- 查询名字是两个字的人

select * from studentinfo where studentname like '__';

-- 查询所有

select * from studentinfo where studentname like '%';

-- 查询名字至少有两个字的

select * from studentinfo where studentname like '__%';

-- rlike 正则匹配

-- 还是查询以小开头的

select * from studentinfo where studentname rlike '^小.*';

-- 查询以小开头以花结尾的

select * from studentinfo where studentname rlike '^小.*花$';

范围查询

--in

-- 查询id为1,2,3的

select * from studentinfo where studentid in (1,2,3);

-- 查询id不为1,2,3的

select * from studentinfo where studentid not in (1,2,3);

-- between and

-- 查询年龄18到20之间的(包含18和20)

select * from studentinfo where studentage between 18 and 20;

-- not between and

-- 查询年龄18到20之间的(包含18和20)

select * from studentinfo where studentage not between 18 and 20;

-- 判断是否为空

-- 查询名字为空的(这里没有数据,可以添加一个)

select * from studentinfo where studentname is null;

-- 查询名字不为空的

select * from studentinfo where studentname is not null;

排序

-- order by

-- asc 从小到大排序

-- desc 从大到小排序

-- 查询所有按照从小到大排序

-- asc可以省略,默认就是从小到大

select * from studentinfo order by studentage;

select * from studentinfo order by studentage asc;

-- 从大到小排序

select * from studentinfo order by studentage desc;

-- order by 多个字段

-- 如果有两个年龄相同的,他会默认用主键排序,我想让他用班级id排序

select * from studentinfo order by studentage asc,classid desc;

聚合函数

--总数 count

--查询男性有多少人

select count(*) as 男的 from studentinfo where studentsex = 1;

--最大值 max

--查询年龄的最大值

select max(studentage) as 最大年龄 from studentinfo;

--最小值 mix

--查询年龄的最小值

select mix(studentage) as 最小年龄 from studentinfo;

--求和 sum

--查询所有年龄的和

select sum(studentage) as 年龄和 from studentinfo;

--平均值avg

--查询所有年龄的平均值

select avg(studentage) as 年龄平均值 from studentinfo;

--或者

select sum(studentage)/count(*) as 年龄平均值 from studentinfo;

--如果我想四舍五入,保留一位小数

--round(111.444,1) 输出 111.4

select round(avg(studentage),1) as 年龄平均值 from studentinfo;

分组

--group by

--按照性别分组,查询男,女各有几个人。

select count(*),studentsex from studentinfo group by studentsex;

--只查询男的人数

select count(*),studentsex from studentinfo where studentsex = 1 group by studentsex;

--查询男,女各有几个人,并且显示出姓名

select count(*),studentsex,group_concat(studentname) from studentinfo group by studentsex;

count(*)

studentsex

group_concat(studentname)

3

张三,李四,王五

3

小花,小猫,小狗

--查询男,女各有几个人,并且显示出姓名和年龄

select count(*),studentsex,group_concat(studentname,studentage) from studentinfo group by studentsex;

count(*)

studentsex

group_concat(studentname)

3

张三18,李四21,王五19

3

小花20,小猫18,小狗25

--但是查询多了会连在一起这样写

select count(*),studentsex,group_concat("name_",studentname,"id_",studentage) from studentinfo group by studentsex;

--自己写看效果

--对分组进行条件查询

--查询男,女人数,并且平均年龄大于20

select count(*),studentsex,group_concat(studentname),avg(studentage) from studentinfo group by studentsex having avg(studentage)>20;

分页

--limit

--查询全部只提取前3行数据

select * from studentinfo limit 3;

--条件查询显示男的2行数据

select * from studentinfo where studentsex=1 limit 2;

--只查询了前面的,剩余的怎么查询?

select * from studentinfo limit 0,3; 第一页数据

select * from studentinfo limit 3,3; 第二页数据

0和1表示从第几个开始。

所有查询 limit是在最后的。

--查询所有女性,按照年龄从大到小,并且显示2条数据。

select * from studentinfo where studentsex=2 order by studentage desc limit 2;

连接查询

--两个表联查

--内连接

select * from studentinfo inner join classinfo;

我们发现,数据乱了。但是实现了双表联查。这不是我们想要的。我们把数据对应起来。

select * from studentinfo inner join classinfo on studentinfo.classid=classinfo.classid;

--如果我不想显示这么多数据,我只想要姓名和班级

select studentinfo.studentname,classinfo.classname from studentinfo inner join classinfo on studentinfo.classid=classinfo.classid;

--名字太长了给表格别名

select s.studentname,c.classname from studentinfo as s inner join classinfo as c on s.classid=c.classid;

所谓内连接就是找到条件,这里是classid中相同的显示出来,如果在studentinfo表中含有classid为4,而classinfo表中没有4就不会显示出来。

--外链接 left join

--外链接分为左连接和右链接

--左连接

--左连接以左表为主,相当于先查询左表的全部内容,右表根据相关字段匹配,没有的以空值匹配。

--这里两个表都是相关的数据,所以和内连接没有差别。

select s.studentname,c.classname from studentinfo as s left join classinfo as c on s.classid=c.classid;

--右链接 right join

select s.studentname,c.classname from studentinfo as s right join classinfo as c on s.classid=c.classid;

自关联

--什么是自关联?

--自己关联自己。

--为什么关联自己?

--比如省市区,表结构都是一样的,如果你创建三个表,比较麻烦,都创建一个表,用自连接就可以完成。

这里补充一个知识,我添加数据不可能去一个一个添加吧,

可以直接在网上下载一个sql脚本,直接执行sql脚本来添加数据,怎么执行sql脚本?

source sql文件名;

比如我写一个创建表的sql:

创建一个txt文件,写上

create table City(

cid int,

cname varchar(20),

pid int

);

修改为sql文件,

source C:/WINDOWS/Temp/city.sql;即可

可能会报错,出现没有权限访问,所以需要把sql文件放在C:\WINDOWS\Temp\下即可

我们添加数据的时候就可以用这种方式来添加。

--自关联还是用的内链接,数据可以去网上下载,很多的。

--查询湖北省的所有区

select * from City c1 inner join City c2 on c1.cid = c2.pid having c1.cname="湖北省"

即可。

子查询

--select 中套select 就是子查询

--在查询的时候先查询子条件中的select,把子条件当做一个条件查询。

--查询年龄最大的

select * from studentinfo where studentage =(select max(studentage) from studentinfo)

--像刚刚的自关联也可以用子查询解决

select * from studentinfo where pid = (select cid from studentinfo where cname = "湖北省")

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python入门到放弃 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档