2.查询操作-mysql

主要总结:单表查询,使用各聚合函数查询,连接查询,子查询,合并查询结果,为表、字段取别名。

练的时候还是用图形化界面去写sql,黑框写sql错了不好改 也不太好编辑。

一、单表查询

1.1查询所有字段信息和查询指定字段信息

查询所有字段的话可以直接上select*可以把所有字段写出来,区别的是写所有字段的话可以按照字段排列的顺序显示,select*查询出来显示的就是表的顺序结构

select * from t_bookInfo
select bookName,id,bookPrice from t_bookInfo;

 结果分别是

1.2带where条件的查询

SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 条件表达式;

where的约束条件可以用一个等号连接,它并不像c,java是两个等号==判断是否相等。比如找出id为2的书

select * from t_bookInfo where id = 2;

1.3带IN关键词查询

SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] IN (元素 1,元素 2,元素 3);

这个关键字和where配置使用,筛选条件的作用,in后面跟的是一个元素集合,只要这个判断条件的字段在集合里面就符合条件

比如这样

select * from t_bookInfo where id in (2,4);

当然也可以not in原理用法都是一样的

1.4带between and关键词查询

SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] BETWEEN 取值 1 AND 取值 2

between and关键词判断的是一个区间而不是一个集合。当然也有not不在这个区间内。

比如这样

select * from t_bookInfo where id BETWEEN 2 and 4;

得到id在区间[2, 4]的记录,左右都是闭区间。

1.5带like的模糊查询

SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] LIKE ‘字符串’;

模糊查询有两个字符:'%'代表任意字符,'_'代表单个字符。比如在某些时候不知道一本书的全部名字,只知道书名的几个字开头什么的,就可以 用模糊查询完成。很多时候查询操作都是进行的模糊查询,查询出来的记录都有相同的部分。

想得到关于书名有算法两个字的书 就可以通过like结合%字符完成

select * from t_bookInfo where bookName like  '%算法%';

这里   %算法%     %可以理解为代表若干个任意字符

select * from t_bookInfo where bookName like  '算法__';

 

select * from t_bookInfo where bookName like  '算法_';


'_'代表的也是任意字符 不过是一个不是若干个 ,通过测试发现一个下划线代表的一个字符,一个汉字通过一个模糊字符也能完成,我的猜测是一个汉字是两字节的,比如由字节ab构成一个汉字,字节a和模糊字符匹配上就算是符合条件了。反正是模糊查询。

1.6空值查询,带AND,OR查询

空值查询就是判断条件的时候判断属性是否为空,不难理解。

SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 IS [NOT] NULL;

AND和OR就是且、或的意思,就如同条件 && 和 ||

SELECT 字段 1,字段 2...FROM 表名 WHERE 条件表达式 1 AND 条件表达式 2 [...AND 条件表达式 n]

查询书名有算法二字的并给70块以上的书本

select * from t_bookInfo where bookName like  '算法%' AND bookPrice > 70;

记录必须得都满足这两条件才算符合条件 就是都得符合

就是这样纸的

SELECT 字段 1,字段 2...FROM 表名 WHERE 条件表达式 1 OR 条件表达式 2 [...OR 条件表达式 n]

or的话就是只要判断所有条件中的任一就算符合条件

select * from t_bookInfo where bookName like  '%算法%' OR bookPrice > 70;

只要是名字里面有算法二字或者说大于70块钱就符合条件。

1.7  DISTINCT 去重复查询

SELECT DISTINCT 字段名 FROM 

在字段前面加上distinct修饰,去掉相同的记录,判断相同的时候是根据你选择的字段,判断记录的这些属性是否都相同,都相同才算是重复的

表数据是这样的

有两本算法基础 使用disitinct关键词去重

select DISTINCT  bookName, bookPrice from t_bookInfo;

这个去重操作可以看一下所有书的价格情况,去掉重复的价格。

1.8对查询结果排序

SELECT 字段 1,字段 2...FROM 表名 ORDER BY 属性名 [ASC|DESC]

使用order by对查询的记录排序,asc是升序,desc是降序

select * from t_bookinfo ORDER BY bookPrice desc;

根据书的价格降序排列

1.9使用group by分组查询

GROUP BY 属性名 
[HAVING 条件表达式][WITH ROLLUP]1,单独使用无意义
2,与 GROUP_CONCAT()函数一起使用;
3,与聚合函数一起使用
4,与 HAVING 一起使用(限制输出的结果);
5,与 WITH ROLLUP 一起使用(最后加入一个总和行)
这个看着有点复杂 还是通过实际的sql语句看比较清晰。

这个关键词上次去银联面试就被问到了,当时不确定答案没说,group by在面试的时候还是较频繁的提问的。

用法就是分组,根据字段进行分组,单独使用是没有意义的,通常和group_concat()一起使用。

先给表里加一个字段,书的类型 type

我现在要根据书的类型来分类,看一下每个类型下都有哪些书

select bookType,GROUP_CONCAT(bookName) from t_bookinfo GROUP BY bookType;

和Having的用法是限制分组里面的成员的数量,现在继续增加需求,分类完了,那个类里面有超过1本书再输出。

select bookType,GROUP_CONCAT(bookName) from t_bookinfo GROUP BY bookType HAVING COUNT(bookName) > 1;

with rollup就是多输出一行,汇总一下

select bookType,GROUP_CONCAT(bookName) from t_bookinfo GROUP BY bookType WITH ROLLUP;

聚合函数后面还有很多。

1.10 limit分页查询

SELECT 字段 1,字段 2...FROM 表名 LIMIT 初始位置,记录数;

这个表里面有很多记录,查询的时候,整个表查,但可以通过limit限制范围

把整个表分页,一页有多少个数据

select * from t_bookinfo LIMIT 0,3;

select * from t_bookinfo LIMIT 4,6;

limit a,b 这个用法相当于 从表里面第a+1条件 到b+1条结束,就在这个范围内。

  limit关键词常和排序order by联合一起考察,比如查询价格70元的书籍,降序输出前5条

这是表数据

SELECT bookName,bookPrice,bookType from  t_bookinfo WHERE bookPrice > 70 ORDER BY bookPrice desc LIMIT 0,4;

二、使用聚合函数查询

聚合函数通常也会group by结合一起使用,常用的有:count(),avg(),max(),min(),sum()。其他还有很多,查一下mysql手册都可以查到的。

2.1  count()聚合函数

用来统计查询到的记录的数量,比如查询各个类别的图书有多少本

SELECT bookType,COUNT(bookName),GROUP_CONCAT(bookName)
from t_bookinfo
GROUP BY bookType;

有时也可以单独使用都是可以的,

2.2  sum()函数

用来计算查询的所有记录之和,比如查询各个类别下的图书价格之和

SELECT bookType,SUM(bookPrice),GROUP_CONCAT(bookName)
from t_bookinfo
GROUP BY bookType;
和上面的计算count用法差不多,将count换成sum即可


2.3 max(),min(),avg()函数

这些都是一些数学的函数,求记录最大值,最小值,平均值

比如要求一个类别里面最贵的图书,最便宜的图书,平均价格

SELECT bookType,max(bookPrice), min(bookPrice), AVG(bookPrice), GROUP_CONCAT(bookName)
from t_bookinfo
GROUP BY bookType;


聚合函数用法大同小异,用法都是差不多的,没什么难的,多练习掌握用法。

三、连接查询 多表查询

通常是查询两个或两个以上表的数据,首先理解一个笛卡尔积,比如有两个集合A,B,A=[a1, a2], B=[b1, b2, b3];

这两个集合笛卡尔积的所有结果就是a1b1 , a1b2, a1b3, a2b1, a2b2, a2b3。

连接查询包括内连接和外连接查询。再建一张表t_bookType来练习,调整一下两个表的结构如下。

把以前表里面类型用序号来表示。先查询这两张表的所有记录

SELECT * FROM t_bookinfo t_bookType ;

查询到的记录是很多的,记录数量是两个表数量的成绩,就是一个笛卡尔积。

3.1 内连接查询

最常用的连接查询之一,可以查询两个或两个以上的表

SELECT * FROM t_bookinfo ,t_bookType where t_bookinfo.bookType = t_booktype.id ;

就查到了所有的图书 不像上面那样有很多重复的书名。

3.2外连接查询

SELECT 属性名列表 FROM 表名 1 LEFT|RIGHT JOIN 表名 2 ON 表名 1.属性名 1=表名 2.属性名 2;

 3.2.1  右连接查询

可以查询出“表名 2”的所有记录,而“表名 1”中,只能查询出匹配的记录

先给图书类型的表里面加几个记录, 表1里面没有的类型

SELECT * FROM t_bookinfo RIGHT JOIN t_bookType on t_bookinfo.bookType = t_booktype.id ;

虽然有的类型图书表1里面没有 但是还是显示出来 给个null

3.2.2 左连接查询

与左连接相反,可以查询出“表名 1”的所有记录,而“表名 2”中,只能查询出匹配的记录

表2有的记录和表1匹配才能查询出来 比如这里往表一里面加入一些新的记录 如下

新加入的操作系统类型是7 第二张表里面是没有的

SELECT * FROM t_bookinfo left JOIN t_bookType on t_bookinfo.bookType = t_booktype.id ;

表2里面没有类型7的记录。就显示一个null,可以得到表1的全部记录。

四、子查询

子查询可以理解为一个嵌套查询,对一个表查询得到的结果,接着对这些结果继续筛选接着查询。

4.1 带IN,EXISTS关键词查询

SELECT * FROM t_bookinfo WHERE t_bookinfo.bookType IN (SELECT id FROM t_booktype);

查询表1里面的图书类型 表2里面有这个类型才算符合条件

后面的sql语句返回的是一个集合,各个图书类型的集合,in的意思就是判断图书类型是否在这个集合里面


而EXISTS关键词查询得到的是一个逻辑值,空和非空,非空的情况下才执行外面也就是前面的查询

SELECT * from t_bookinfo WHERE EXISTS (SELECT * from t_booktype where id = 9);

后面这个子查询没查到记录 没有类型是9的类型 就不执行前面的操作

EXISTS关键词的作用就是来判断后面查询结果是否返回NULL

4.2 带ANY,ALL关键词查询

ANY 关键字表示满足其中任一条件 后面的子查询返回的集合只要有一个元素满足条件 就算是条件成立

ALL 关键字表示满足所有条件 后面子查询的集合,外层查询条件字段必须都大于集合里面每一个元素才算是条件成立

这里往表2里面再加一个字段用来练习ANY和ALL 如下


SELECT * FROM t_bookinfo WHERE bookPrice > ALL (SELECT price from t_booktype);

这里是ALL关键词,对查询到的集合,价格是都大于集合里每一个元素的。

SELECT * FROM t_bookinfo WHERE bookPrice > ANY (SELECT price from t_booktype);

而ANY的话只要价格大于集合里任意一个元素就算条件成立。

一个都满足条件,一个是满足任意一个条件成立即可。

五、合并查询结果

有两个关键词分别是UNION和UNION ALL,

UNION是对查询得到的记录合并去重复记录 显示出来

UNION ALL是不去重的操作合并

select bookPrice from t_bookinfo UNION  SELECT price from t_booktype;

这个可以看出去重后的结果两个表查询出来是没有重复的

这是不去重的 就是单纯的把两个表查询的所有记录罗列出来

select bookPrice from t_bookinfo UNION ALL SELECT price from t_booktype;

注意的是要合并两个表的查询结果,两个表选择的字段个数得相同,不能一个select两个字段,一个select三个字段,是没办法合并的。

六、表、字段取别名

给表取别名主要是在多表查询的时候,用别名代替表名,看着舒服点。

就是在from 表名的时候 后面加上别名   from 表名 别名

select * from t_bookinfo tbI, t_booktype tbt where tbI.bookType = tbt.id;


注意一下取别名之后用别名的时候别敲错了。

为字段取别名是为了输出的时候显示,有时候使用了聚合函数,显示的时候,那就是那个函数名字一堆的,我可以给这个字段娶一个别名使得显示不同。

直接在字段后面as别名就行了

SELECT  tbt.bookType, GROUP_CONCAT(tbi.bookName) as someBook, COUNT(tbi.bookName) as bookCount 
FROM t_bookinfo tbi, t_booktype tbt 
 WHERE tbi.bookType = tbt.id GROUP BY tbi.bookType;

统计一下各个类型下都有什么书 都有多少本书


注意这里输出显示的时候就是别名了而不是那个聚合函数的名字了。

下一篇:总结增删改查数据

猜你喜欢

转载自blog.csdn.net/yvken_zh/article/details/80501736