
文章目录
聚合查询是针对行与行之间的计算,常见的聚合函数有:
| 函数 | 作用 |
|---|---|
| COUNT(expr) | 查询数据的数量 |
| SUM(expr) | 查询数据的总和 |
| AVG(expr) | 查询数据的平均值 |
| MAX(expr) | 查询数据的最大值 |
| MIN(expr) | 查询数据的最小值 |
create table stu(id int primary key,name varchar(50),math int,english int);
insert into stu values
(001,"张三",80,90),
(002,"李四",75,80),
(003,"王五",85,90),
(004,"小王",90,80),
(005,"小孙",null,null);
count函数:
顾名思义,count函数就是用来统计我们表的行数的。

但注意的是,我们再给count函数传参数时,这一列不能有null值。

我们发现当传入math参数时,因为math有一行的数据是null,count函数在统计时,自动省略这一行。

当然我们还可以传入全列,count传入全列时,只要这一列有不为null的值就会被统计上,但时间会相对增大,一般建议传入主键或者not null的列。
SUM函数:
用来计算某一列数值的综合,null自动省略。

也可以进行表达式进行聚合计算。

AVG函数:
avg函数对某一列求平均值,我们可以发现计算平均值是,null既不计入分子也不计入分母。

MAX函数:
求某一列的最大值

MIN函数:
求某一列的最小值

有时候单纯使用聚合查询没啥意思,我们需要先分组在进行聚合计算。
create table stu(id int,name varchar(20),class varchar(20),math int,english int);
insert into stu values(001,"张三","计算机1班",80,95),
(002,"李四","计算机1班",90,76),
(003,"王五","计算机2班",86,77),
(004,"小王","计算机2班",92,86),
(005,"张良","计算机2班",86,96);

我们来计算平均数学成绩

这样的平均成绩没啥意思,我们来求一下每个班的数学平均成绩
select class,avg(math) from stu group by class;

我们在来求一下,每班的数学最高分。
select name,class,max(math) from stu group by class;

分组查询,也可以指定条件
1.分组之前指定条件,先筛选在分组,WHERE
2.分组之后指定条件,先分组在筛选, HAVING
3.分组之前和分组之后都指定条件,WHERE HAVING都使用。
分组之前: 查询每个班的平均数学成绩,但是去掉小王的成绩
select class,avg(math) from stu where name != '小王' group by class;

分组之后: 查询每个班级的平均数学成绩,但去除平均成绩为85的班级。
select class,avg(math) from stu group by class having avg(math) != 85;

分组之前和分组之后都指定条件: 查询班级的平均成绩,去掉小王的成绩,并且去除计算机1班的平均数学成绩
select class,avg(math) from stu where name != '小王' group by class having class != '计算机1班';

当我们多张表建立联系时,我们就可以进行联合查询,多表查询就是对多张表取笛卡尔积。

笛卡尔的结果列数是两张表列数之和,行数是两张表的行数之积.
create table classes (id int primary key auto_increment, name varchar(20), `desc` varchar(100));
create table student (id int primary key auto_increment, sn varchar(20), name varchar(20), qq_mail varchar(20) ,
classes_id int);
create table course(id int primary key auto_increment, name varchar(20));
create table score(score decimal(3, 1), student_id int, course_id int);
select * from student,classes

大家轻易可以发现,笛卡尔积里的结果很多都是无效的数据,因此我们需要将一部分无意义的数据给去掉。

我们通过这两个变量来建立关系,多表查询时,我们访问表中的变量时用表名点(.)变量表示。
select * from student,classes where classes.id = student.classes_id;


当我们加上条件(这个条件我们成为连接条件)之后,剩下的都是“正确"的数据.
我们也可以指定列查询。
select student.id,student.name,student.classes_id,classes.name from student,classes where classes.id = student.classes_id;

我们现在构造了四张表出来,student(学生表),classes(班级表),course(课程表),score(分数表).




我们查询一下白素贞的班级:
我们在进行联合查询的时候,不必急于求成,一步一步进行。
-- 1.先计算笛卡尔积
select * from student,classes;

-- 2.引入连接条件
select * from student,classes where classes.id = student.classes_id;

-- 3.引入名字为白素贞的条件
select * from student,classes where classes.id = student.classes_id and student.name = '白素贞';

-- 4.只保留必要的列
select student.name,classes.name from student,classes where classes.id = student.classes_id and student.name = ' 白素贞';

联合查询也可以用join来完成:
select student.name,classes.name from student join classes on classes.id = student.classes_id and student.name = '白素贞';

内连接还可以使用inner join完成。
select student.name,classes.name from student inner join classes on classes.id = student.classes_id and student.name = '白素贞';

我们还可以进行多张表进行联合查询。

select * from student,score,course where student.id = score.student_id and course.id = score.course_id;

我们可以省略部分列,使用别名,join来查询
select student.name as 学生姓名,course.name as 课程名称,score.score as 分数 from student join score on student.id = score.student_id join course on score.course_id = course.id;

内连接和外连接在一些情况下,查询的结果没有差异(当两个表一一对应时),如果没有一一对应那么就有区别了。


我们可以用这两张表,建立一下内外连接看一下效果。
-- 内连接
select * from student join score on student.id = score.student_id;

-- 外连接
select * from student left join score on student.id = score.student_id;

我们可以发现内外连接查询的结果是一样的。因为我们两个表的内容是一一对应的。

这时我们发现student表id为6的数据在score无对应


这时我们发现,内外查询的结果就有所差异了。
外连接:
当进行外连接时,如果是左连接,会把左表所有的数据查询到总结果中,如果右表没有对应数据,就是用NULL补充(右连接同理)。
SQL中无法对行和行之间使用条件比较,当我们要进行行行运算时,我们可以使用自连接进行调整。


我们想查询那个同学的java成绩比英文成绩高。

我们可以发现至今将表明写两遍,会报一个表名不唯一的错误。正确的做法是为表名起别名。

这里我们是自己和自己比,所以我们加上student_id相等的条件


然后对score1的科目进行限制为java,score2的科目限制为英文
select * from score as score1,score as score2 where score1.student_id = score2.student_id and score1.course_id = 1 and score2.course_id = 6;

我们发现只有两名学生即选择了java,又选择了英文。
我们再加上java比英文高的条件。
select * from score as score1,score as score2 where score1.student_id = score2.student_id and score1.course_id = 1 and score2.course_id = 6 and score1.score > score2.score;

我们发现没有java比英文高的数据

所以我们查出来的是空集合。
在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION和UNION ALL时,前后查询的结果集中,字段需要一致。

-- union
select * from course where id < 4 union select * from course where name != 'java';

-- union all
select * from course where id < 4 union all select * from course where name != 'java';

这里我们可以发现union可以去掉重复数据,而union all不去重。
大家需要注意or 与 union的区别,or的查询只能针对同一个表,而union可以来自于多张表,只要查询的结果能够对应列即可。
子查询最本质就是套娃,将多个SQL组合起来。
实际开发中,子查询的使用要小心(子查询会构造出来一些非常复杂并且不好理解的SQL,对于代码的可读性,执行效率都有可能造成很大的影响。
查询许仙的同班同学

正常思路,先去查询许仙的班级号,再去按照班级号去查那些同学和他一个班
select classes_id from student where name = '许仙';

select name from student where classes_id = 1 and name != '许仙';

子查询:
select name from student where classes_id = (select classes_id from student where name = '许仙') and name != '许 仙';

子查询返回一条记录,才可以写等号

查询java或者英文课的成绩信息
先查询java或者英文课的课程号,再根据课程号去查询课程分数
select id from course where name = 'java' or name = '英文';

select * from score where course_id = 1 or course_id = 6;

子查询:
select * from score where course_id in (select id from course where name = 'java' or name = '英文');


EXISTS关键字: 可读性比较差,效率也大大的比in低,适用于解决特殊情况
还是更推荐大家分步查询。
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
我目前还在上学,正在上一门关于用C++实现数据结构的类(class)。在业余时间,我喜欢使用“高级”语言(主要是Ruby和一些c#)进行编程。既然这些高级语言为你管理内存,你会用数据结构做什么?我可以理解对队列和堆栈的需求,但是您需要在Ruby中使用二叉树吗?还是2-3-4树?为什么?谢谢。 最佳答案 Sosincethesehigherlevellanguagesmanagethememoryforyou,whatwouldyouusedatastructuresfor?使用数据结构的主要原因与垃圾收集无关。但它是以某种方式有效的
我正在尝试绕过rails配置这个极其复杂的迷宫。到目前为止,我设法在ubuntu上设置了rvm(出于某种原因,ruby在ubuntu存储库中已经过时了)。我设法建立了一个Rails项目。我希望我的测试项目使用mysql而不是mysqlite。当我尝试“rakedb:migrate”时,出现错误:“!!!缺少mysql2gem。将其添加到您的Gemfile:gem'mysql2'”当我尝试“geminstallmysql”时,出现错误,告诉我需要为安装命令提供参数。但是,参数列表很大,我不知道该选择哪些。如何通过在ubuntu上运行的rvm和mysql获取rails3?谢谢。
RGeo有可用的凸包方法,但在这方面根本没有文档。给定一组点,我如何找到它们的凸包? 最佳答案 好问题。事实证明,有一种名为“MultiPoint”的几何类型适用于此。我做了一个简单的例子来测试它,它似乎运行良好。f=RGeo::Geos.factory(:srid=>3361,:buffer_resolution=>8)#mytypicallocalrectilinearprojectionfactorywithmydefaultsettings.coords=[[1,1],[2,2],[1,3]]points=[]coords.
目录1、yum安装mysql修改密码(1)在mysql里面修改(2)第二种方式,利用mysqladmin修改密码2、没有密码,登录mysql修改密码3、mysql的安全设置1、yum安装mysql在CentOS中默认安装有MariaDB(MySQL的一个分支),安装完成之后可以直接覆盖MariaDB。rpm-qa|grepmariadb查询是否安装了mariadbrpm-e--nodepsmariadb-libs-5.5.60-1.el7_5.x86_64卸载mariadwgethttp://dev.mysql.com/get/mysql57-community-release-el7-11.
我是Ruby的新手。我安装了DataMapper并且正在尝试安装dm-mysql-adapter-1.0.2gem。但是当我尝试安装时,出现以下错误。我正在使用ubuntu操作系统。vinoth@vinoth-laptop:~/Downloads$geminstalldm-mysql-adapter-1.0.2----with-mysql-lib=/usr/lib/mysql----with-mysql-conf=/usr/bin/mysqlWARNING:Installingto~/.gemsince/home/vinoth/gemsand/home/vinoth/gems/bina
我目前正在构建一个需要mysql2gem的RoR项目。我成功安装了gem。因为它出现在我的gem列表中。[root@vc2cmmka035538nsimple_cms]#gemlist***LOCALGEMS***actionmailer(3.2.3)actionpack(3.2.3)activemodel(3.2.3)activerecord(3.2.3)activeresource(3.2.3)activesupport(3.2.14,3.2.3)arel(3.0.2)bigdecimal(1.1.0)builder(3.2.2,3.0.0)bundler(1.1.5)c2c_li
我想使用托管在我自己服务器上的mysql数据库。我已经更改了DATABASE_URL和SHARED_DATABASE_URL配置变量以指向我的服务器,但它仍在尝试连接到heroku的amazonaws服务器。我该如何解决? 最佳答案 根据Herokudocumentation,更改DATABASE_URL是正确的方法。Ifyouwouldliketohaveyourrailsapplicationconnecttoanon-Herokuprovideddatabase,youcantakeadvantageofthissamemec