MYSQL常用查询

Wesley13
• 阅读 741
一、MYSQL查询的五种子句

where(条件查询)、having(筛选)、group by(分组)、order by(排序)、limit(限制结果数)

【1】where:

比较运算符
     > ,  < ,=  , != (< >),>=   ,   <=  
        in(param1,param2...paramN) 
        between param1 and param2在param1至param2之间(包含param1,param2) 
逻辑运算符
       not ( ! ) 逻辑非 
       or ( || ) 逻辑或 
       and ( && ) 逻辑与
模糊查询
        like 像
        通配符:
        %  任意字符
        _  单个字符
            where goods_name like 'TOM%'
            where goods_name like 'TOM__'

【2】having查询

 having与where类似,可以筛选数据,where后的表达式怎么写,having后就怎么写
        where针对表中的列发挥作用,查询数据
        having对查询结果中的列发挥作用,筛选数据
        例子
        #查询本店商品价格比市场价低多少钱,输出低200元以上的商品
        select goods_id,good_name,market_price - shop_price as s from goods having s>200 ;
        //这里不能用where因为s是查询结果,而where只能对表中的字段名筛选

        如果用where的话则是:
        select goods_id,goods_name from goods where market_price - shop_price > 200;

【3】Group by分组

一般情况下group需与统计函数(聚合函数)一起使用才有意义

 如:select goods_id,goods_name,cat_id,max(shop_price) from goods group by cat_id;

这里取出来的结果中的good_name是错误的!因为shop_price使用了max函数,那么它是取最大的,而语句中使用了group by 分组,那么goods_name并没有使用聚合函数,它只是cat_id下的第一个商品,并不会因为shop_price改变而改变
      mysql中的五种统计函数:1)max:求最大值、2)min:求最小值、3)sum:求总数和、4)avg:求平均值、5)count:求总行数  

【4】Order by排序      

(1)order by price  //默认升序排列      
(2)order by price desc //降序排列      
(3)order by price asc //升序排列,与默认一样
(4)order by rand() //随机排列,效率不高

【5】limit(限制结果数) 

做以下实验:
   语句1:
          select * from table limit 150000,1000;
    语句2:
          select * from table while id>=150000 limit 1000;
    语句1为0.2077秒;语句2为0.0063秒

     LIMIT 150000,1000意味着先要找到前150000条满足where条件的记录而后舍弃这些记录取之后满足where条件的1000条,这样的代价注定会非常高。
             比较以上的数据时,我们可以发现采用where...limit....性能基本稳定,受偏移量和行数的影响不大

             而单纯采用limit的话,受偏移量的影响很大,当偏移量大到一 定后性能开始大幅下降。不过在数据量不大的情况下,两者的区别不大。

       所以应当先使用where等查询语句,配合limit使用,效率才高

二、左连接,右连接,内连接

【0】笛卡尔积

 现有表a有10条数据,表b有8条数据,那么表a与表b的笛尔卡积是多少?

 select * from ta,tb   //输出结果为8*10=80条(笛卡尔积) 如果在两张表里有相同字段,做联合查询的时候,要区别表名,否则会报错误(模糊不清)。

【1】左连接

以左表为准,去右表找数据,如果没有匹配的数据,则以null补空位,所以输出结果数>=左表原数据数

...... from ta left join tb on ta.n1= ta.n2 [这里on后面的表达式,不一定为=,也可以>,<等算术、逻辑运算符]【连接完成后,可以当成一张

新表来看待,运用where等查询左连接,其实就可以看成左表是主表,右表是从表。

【2】右连接

右连接查询跟左连接查询类似,只是右连接是以右表为主表,会将右表所有数据查询出来,而左表则根据条件去匹配,如果左表没有满足条件的行,则左边默认显示NULL。左右连接是可以互换的。

【3】内连接

内连接查询,就是取左连接和右连接的交集,如果两边不能匹配条件,则都不取出。它也被称为一个等值连接

查询结果是左右连接的交集,【即左右连接的结果去除null项后的并集(去除了重复项)】

语法:select n1,n2,n3 from ta inner join tb on ta.n1= ta.n2

【4】全连接查询 full join ... on ...

全连接会将两个表的所有数据查询出来,不满足条件的为NULL。

全连接查询跟全相乘查询的区别在于,如果某个项不匹配,全相乘不会查出来,全连接会查出来,而连接的另一边则为NULL。

【5】联合查询 union

union是求两个查询的并集。union合并的是结果集,不区分来自于哪一张表,所以可以合并多张表查询出来的数据。将两张表的数据合并查询出来

SELECT id, content, user FROM comment UNION (SELECT id, msg AS content, user FROM feedback);union查询,列名不一致时,以第一条sql语句的列名对齐使用union查询会将重复的行过滤掉使用union all查询所有,重复的行不会被过滤union查询,如果列数不相等,会报列数不相等错误union查询时,order by放在内层sql中是不起作用的;因为union查出来的结果集再排序,内层的排序就没有意义了;因此,内层的order by排序,在执行期间,被mysql的代码分析器给优化掉了。order by 如果和limit一起使用,就显得有意义了,就不会被优化掉。

( SELECT goods_name,cat_id,shop_price FROM goods WHERE cat_id = 3 ORDER BY shop_price DESC LIMIT 3 )
UNION
( SELECT goods_name,cat_id,shop_price FROM goods WHERE cat_id = 4 ORDER BY shop_price DESC LIMIT 2 );

MYSQL常用查询

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这