精华内容
下载资源
问答
  • MySQL SQL查询语句大全集锦(经典珍藏),可以每天练习的
  • SQL查询语句大全集锦(超经典)
  • Oracle查询语句大全-精华版

    热门讨论 2013-08-05 23:53:44
    Oracle查询语句大全,这个主要适合新人或者转数据库的人做字典型查询
  • 常用数据库查询语句

    千次阅读 2021-01-06 21:32:40
    常用数据库查询语句 基本查询 select 字段1, 字段2,…from 表名; 例如:select id , name from stu; 条件查询 select 字段1, 字段2,…from 表名 where 字段 关系符号 值 ; 关系符号 < = >= <= != 大于 等于 ...

    数据库常用查询语句(DQL)

    基本查询

    select 字段1, 字段2,…from 表名;

    例如:select id , name from stu;

    条件查询

    select 字段1, 字段2,…from 表名 where 字段 关系符号 值 ;

    关系符号

    < = >= <= != 大于 等于 大于等于 小于等于 不等于

    例如:select * from stu id > 2;

    and or in(范围内满足in内部条件) not in 相反

    例如: select * from stu where id>1 and age <40;

    ​ select * from stu where id >1 or name =‘张三’;

    ​ select * from stu where id in(3,4);

    between 值1 and 值2 在[值1,值2]之间 包含两边临界值

    例如: select * from stu where id between 2 and 4;

    模糊查询

    select * from 表名 where 字段 like ‘%值%’;

    例如: select * from stu where name like ‘陈%’;

    注: %的位置不同 表达的意思不同 陈% : 陈某某 ,%陈% : 某陈某,%陈:某某陈

    % 匹配任意字符 (%可以是任意长度)_匹配指定长度字符 一个_代表一个长度

    排序查询

    select * from 表名 order by 字段 排序类型 asc 升序 desc 降序 没写排序类型 默认 升序

    例: select * from stu order by id desc ;

    聚合函数 多行数据一行返回

    count(字段) 计数 计算该列不为空的数据个数

    例 :select count(name) from stu;

    sum(字段) 求和 计算该列所有数字的和 字符串求和结果为0

    例:select sum(age) from stu;

    max(字段) 最大值 获取该列最大值

    例: select max(age) from stu;

    min(字段) 最小值 获取该列最小值

    例: select min(age) from stu;

    avg(字段) 平均值 不为null的进行平均

    例: select avg(age) from stu;

    注:聚合函数要放在select 和 from 之间

    去重

    distinct(列) 一般配合count()一起使用

    例;:select count(distinct 字段名) from stu;

    分组查询

    group by

    例:select * from stu group by 字段名

    流程控制函数

    if(expr1,expr2,expr3)

    ​ 如果 expr1 为真 则返回expr2, 否则返回expr3

    ​ is null() 函数 判断为空

    ​ is null(字段) 如果是null 返回1 不是返回0

    例:select id name if(isnull(score)=1,‘缺考’,score)from stu;

    case

    when 条件 then 执行语句

    when 条件 then 执行语句

    else 执行语句

    end

    执行第一个when后的条件,如果为true,执行then后的语句,

    如果when后的条件为false,执行第二个when后的条件

    如果都为flase 执行else后的语句

    多表联查

    1 联合查询-合并结果集

    union 将两表的查询结果纵向连接(会去重)

    union all 纵向拼接会保留全部

    2 连接查询

    将多个表多行数据相乘(笛卡尔积).

    一对一: 在任何一张表添加字段均可

    一对多:只能在多的表添加字段

    多对多:定义中间表

    连接方式:

    内连接: select * from 表1 inner join 表2 on 关联条件(过滤条件);

    ​ 简写: select * from 表1,表2 where 表1.字段名 = 表2.字段名;

    注:只会保留完全符合关联条件的数据

    外连接: select * from

    ​ 左外连接: select * from 表1 left [outer] join 表2 on 表1.字段名 = 表2.字段名

    ​ 注:会保留左表中不符合条件的数据

    ​ 右外连接: select * from 表1 right [outer] join 表2 on 表1.字段名 = 表2.字段名

    ​ 注:会保留右表中不符合条件的数据

    ​ 注:会保留不满足条件的数据

    子查询

    子查询就是嵌套查询.

    一般子查询出现在:

    ​ from后 : 当做一张表使用

    ​ where后: 当做条件使用

    ​ select 后

    自连接:

    自己连接自己

    展开全文
  • mysql关联查询语句

    万次阅读 2019-01-04 10:36:55
    场景:假如要给与Jim Jones同一公司的所有顾客发送一封邮件,这个查询要求首先找出Jim Jones 工作的公司,然后找出在该公司工作的顾客,下面是查询语句: #方式一:采用子查询 select user_id,cust_name,cust...

    今天和mysql相关死磕到底

    Baby 我的眼里都是

    心里都是全部都是你

    哒哒哒哒哒哒 哒哒哒

    一、前言

    1.1关系表

    理解关系表,以一个例子展开:

    有一个包含产品目录的数据库表,其中每一类物品占一行。对于每一种物品,要存储的信息包含产品描述,价格,以及生产该产品的供应商。

    现在有同一供应商生产的多个产品,那么在何处存储供应商名称,地址,联系方法等供应商信息呢?将这些数据与产品信息分开存储的理由是:

    []同一供应商生产的每个产品,其供应商的信息都是相同的,对每个产品重复此信息既浪费时间又浪费空间

    []如果供应商的信息发生变化,例如供应商迁址或者电话号码变动,只需要修改一次即可

    []如果有重复的数据(即每种产品都存储供应商信息),则很难保证每次输入该数据的方式都相同,不一致的数据在报表中就很难利用。

    关键是,相同的数据出现多次不是一个好事,也是关系数据库设计的基础,关系表的设计就是要把信息分解成多个表,一类数据一个表。各个表通过某些共同的值互相关联,所以才叫关系数据库。

    1.2关系表的连接

    如上所述,将数据分解成多个表可以更有效的存储,更方便的处理,并且可伸缩性更好,但是这些好处是有代价的。

    如果数据存储在多个表中,怎样用一条select语句检索出数据?答案就是使用连接。简单来说,连接是一种机制,用来在一条select 语句中关联表,因此称为连接。使用特殊的用法,可以关联多个表返回一组输出,连接在运行时关联表中正确的行。

    二、关联查询

    基于前言,本篇重点在于关联查询,Let's begin!

    2.1创建连接

    创建连接非常简单,指定要连接的所有表以及关联他们的方式即可,重点在于找到关联的方式。其实就是找关联行。

    例如:

    $select vend_name,prod_name,prod_price from Vendors,Products where Vendors.vend_id=Products.vend_id;

    分析:

    (1)select 语句与前面所有查询语句一样,指定要检索的列。这里最大的差别在于所指定的两列(prod_name,prod_price)在一个表中,而第三列(vend_name,)在另外一张表中。

    (2)from子句。与以前的select语句不一样,这里列出了两个表:Vendors,Products,它们就是这select语句连接的两个表的名字。这两个表通过where子句正确的连接,where子句指示DBMS将Vendords表中的vend_id与Products中的vend_id匹配起来。

    (3)可以看到要匹配的两列指定为Vendors.vend_id=Products.vend_id。这里必须完全指定列名,要不然DBMS无法区分需要哪一个表和哪一个表的什么去做关联。

    (4)where子句的重要性:在连接两个表时,实际要做的是就是将第一表中的每一行与第二个表中的每一行去配对,where子句作为过滤条件,只包含那些可以匹配条件的行,如果没有where子句,实际要做的是就是将第一表中的每一行与第二个表中的每一行去配对,而不管是否可以匹配在一起,然后返回,生成的记过就是笛卡尔积,类似于:排列组合。

    2.2内连接

    目前未知的连接叫做等值连接,它基于两个表之间的相等测试。这种连接也叫作内连接。然而内连接也可以使用另外一种语法,如下:

    $select vend_name,prod_name,prod_price from Vendors inner join Products on Vendors.vend_id=Products.vend_id;

    可以看出,这里用到了 inner join .. on 来连接两个表,而不是where,但是效果都是一样的,具体采用哪种方式,依据个人习惯。

    上面的连接我们用到了两张表,实际呢连接的话其实可以使用多个表,虽然mysql本身不限制连接的表的个数,但是出于性能考虑,以及可读性上,连接3张表算是最多的了。

    实际举例:

    系统分为了三个表:user表,driverv表,transport_protocal表;transport_protocal表通过fk_driver_id与driver表id 关联,driver表通过fk_user_id与user表id关联

    要求:查询用户名为18012345678的在途运单号是多少?

    查询语句如下:

    $select user.username,tp.trans_number from user,driver,transport_protocol tp  where tp.fk_driver_id=driver.id and driver.fk_user_id=user.id and user.username='18112345678' and tp.is_onway=1;

    2.3自连接

    自连接就是需要查询的两个表实际是相同的表,需要根据表第一次查询出来的结果再次过滤,这里需要用到表别名进行表区分:

    场景:假如要给与Jim Jones同一公司的所有顾客发送一封邮件,这个查询要求首先找出Jim Jones 工作的公司,然后找出在该公司工作的顾客,下面是查询语句:

    #方式一:采用子查询

    select user_id,cust_name,cust_contact from Customers where cust_name = (select cust_name from Customers where cust_contact='Jim Jones';

    #方式二:自连接

    select c1.user_id,c1.cust_name,c1.cust_contact from Customers c1,Customers c2 where c1.cust_name = c2.cust_name and c2.cust_contact ='Jim Jones';

    tip :可以看出子查询写起来比较麻烦,所以习惯用自连接而不用子查询

    2.4 外连接

    许多连接将一个表中的行与另外一个表中的行相关联,但有时候需要包含没有关联行的那些行

    通俗的讲:没有关联行的时候可能才会用到,内连接的时候肯定存在关联行,要不然无法匹配

    举栗子:

    查询要求:对每个顾客下的订单数进行计数,包括至今未下过单的顾客

    顾客表:Customers  订单表:Orders

    select Customers.cust_id,Orders.order_num from Customer left join Orders on Customers.cust_id =Orders.cust_id;

    解释:未下过单的顾客因为在订单表里面,是没有数据的,那就没有关联行,那么还需要统计出这部分顾客的姓名和计数,那么就需要外连接顾客表,查询出这部分顾客的id和计数(没有那肯定是0了)

    常用的外连接用到:left join 和right join ;具体用哪个join关键在于sql查询语句中需要连接表格的位置。

    三、其他

    3.1组合查询:两个表联合查询相同列:UNION

    UNION 语句:用于将不同表中相同列中查询的数据展示出来; (不包括重复数据)

    UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来; (包括重复数据)

    mysql>select country from Websites

    union select country from apps;

    3.2 update 单表,根据查询结果,修改数据

    例子:需要根据查出来的车牌id,修改对应的这些id的车辆某个数据

    $update truck inner join (select id from truck where plate like "粤%" limit 30) t1 on t1.id=truck.id set carrier_code=' 2016040' ;

    延伸---------------------------------------------------------------------------------------------

    1.MySQL不允许SELECT FROM后面指向用作UPDATE的表。

    2.MySQL不允许UPDATE在SET时直接SELECT

    3.Currently, you cannot update a table and select from the same table in a subquery.[other table 也是一样]

    4.MySQL是通过临时表来实现FROM子句里面的嵌套查询

    # update select 语句(注意:必须使用inner join)

    #语法:update a inner join (select yy from b) c on a.id=c.id set a.xx=c.yy;

    Happy Ending~,最近沉迷于sql语句学习无法自拔。

    数据库练习题:https://www.cnblogs.com/aqxss/p/6563625.html

    展开全文
  • MySQL之数据库基本查询语句

    千次阅读 多人点赞 2019-11-18 13:42:03
    ——————·今天距2020年43天·——————这是ITester软件测试小栈第80次推文SELECT基本查询语句查询单个列#查询Author表name列的值 select name ...

    ——————·今天距2020年43天·——————

    这是ITester软件测试小栈第80次推文

    SELECT

    基本查询语句

    查询单个列

    #查询Author表name列的值
    select name from Author;
    

    查询多个列

    #查询Author表id,name两列的值
    select id,name from Author;
    

    查询所有列

    #查询Author表所有列的信息
    select * from Author;
    

    查询不同的行(distinct去重)

    #查询Article表所有作者
    select distinct author from Article;
    

    限制查询结果(limit分页)

    #查询Article表前3行的文章类型
    select type from Article limit 1,3;
    select type from Article limit 3;
    

    SELECT

    ORDER BY子句

    对单个查询列进行排序(order by)

    #Article表按aid从低到高查询作者姓名和文章类别
    select aid,author,type from Article order by aid;
    

    对多个查询列进行排序(order by a,b:a排序的基础上,b再排序):

    #Article表按aid和粉丝数从低到高查询作者姓名和文章类别
    select aid,author,type,fans from Article order by aid,fans;
    

    对单个列降序排列(desc降序,从高到低)

    #按粉丝数降序排列Article信息
    select * from Article order by fans desc;
    

    对多个列降序排列

    #按fans降序排列Article信息,再对articles排序
    select * from Article order by fans desc,articles;
    #以上仅对fans降序,articles仍为升序,articles降序需加desc
    

    select..from..order by ..desc limit..;

    #根据文章数降序排列查询前三条Article信息
    select * from Article order by articles desc limit 3;
    

    根据字符集进行排序

    #如果字符集采用的是 gbk(汉字编码字符集),直接在查询语句后边添加 ORDER BY
    select * from Article order by type;
    
    
    #如果字符集采用的是 utf8(万国码),需要先对字段进行转码然后排序
    select * from Article order by convert(type using gbk);
    

    SELECT

    grop by子句

    对条件进行分组排序 

    #分别统计coco和vivi的文章数
    select au_id,count(*) as '数目' from Article where author='coco' or author='vivi' group by au_id;
    

    分组排序复合查询(having) 

    #根据aid统计文章总数大于5的
    select au_id,count(*) as '数目' from Article group by au_id having count(*)>5;
    

    with rollup实现在分组统计数据基础上再进行统计

    #将Article按author进行分组,再统计每个人的总文章数
    select author,sum(articles) as '总文章数' from Article group by author with rollup;
    

    使用 coalesce 来设置一个可以取代 NUll 的名称

    #coalesce 语法:select coalesce(a,b,c);
    select coalesce(author,'昵称') ,sum(articles) as '总文章数' from Article group by author with rollup;
    

    SELECT

    WHERE子句

    where单个条件查询 

    #查询Python文章类型的QQ交流群号信息
    select type,qq_group from Article where type='Python';
    
    #查询粉丝数大于400的Article信息,按降序排列
    select * from Article where fans>400 order by fans desc;
    
    #查询粉丝数不是450的Article信息
    select * from Article where fans!=450;
    select * from Article where fans not in(450);
    

    between ..and..(在什么之间)

    #查询粉丝数在400到450之间的Article信息,按文章数降序排列
    select * from Article where fans between 400 and 450 order by articles desc;
    

    is null(查询某个列的值为空)

    #查询fans为空的Article信息(没有则返回空表)
    select * from Article where fans is null;
    

    SELECT

    数据过滤

    and操作符查询多个条件,每多一个条件就多加一个and

    #查询粉丝数为450且文章类型为Python的Article信息
    select * from Article where fans=450 and type='Python';
    

    or操作符 查询匹配任一条件的行

    #查询粉丝数为300或400的Article信息
    select * from Article where fans=300 or fans=400;
    

    and ..or..高级过滤(and计算次序更高,需要用圆括号明确分组操作符)

    #查询文章数在10以上并且粉丝数为300或400的Article信息
    select * from Article where (fans=300 or fans =400 )and articles>10;
    

    in操作符(值由逗号分隔,括在圆括号中)

    #查询粉丝数在400和500的Article信息,降序排列
    select * from Article where fans in(400,500) order by fans desc;
    

    not操作符与in操作符结合

    #查询粉丝数不是300和400的Article信息,按文章数降序排列
    select * from Article where fans not in(300,400) order by articles desc;
    

    SELECT

    通配符进行过滤查询

    like操作符与百分号(%)通配符

    #查询QQ群以6开头的Article信息
    select * from Article where qq_group like '6%';
    
    #查询作者名中有o的Article信息,按粉丝数降序排列
    select * from Article where author like '%o%' order by fans desc;
    
    #查询aid以2开头、1结尾的Article信息,按文章数降序排列
    select * from Article where aid like '2%1' order by articles desc;
    

    like操作符与下划线(_)通配符

    #匹配单个字符
    select * from Article where type like 'Seleni_m';
    

    SELECT

    正则表达式进行过滤查询

    regexp正则提取匹配的字符

    #查询Type中有SQL的Article信息
    select * from Article where type regexp '.SQL';
    

    regexp 正则或(|)

    #查询学生粉丝数为300或400的Article信息,按文章数降序排列
    select * from Article where fans regexp '300|400' order by articles desc;
    

    regexp 正则和([])

    #查询文章类型中e前有L或S的Article信息
    select * from Article where type regexp '[SL]e' order by type;
    

    regexp 正则匹配范围[a-b]

    #查询文章数为20-25的Article信息
    select * from Article where articles regexp '2[0-5]';
    

    regexp 正则匹配特殊字符\\转义(.*@!_等)

    #查询姓名中有*的学生信息
    select * from Article where type regexp '\\*';
    

    SELECT

    使用函数处理数据

    concat()函数拼接

    #将类型和对应的qq群连接起来,并按类型排序(a-z)
    select concat(type,'(',qq_group,')')from Article order by type;
    

    使用列别名

    select concat(type,'(',qq_group,')') as '技术交流QQ群' from Article order by type;
    

    upper():将文本转换为大写

    #将Article表的文章类型转换为大写TYPE_UPPER,列出type和TYPE_UPPER
    select type,upper(type) as TYPE_UPPER from Article order by type;
    

    lower():将文本转换为小写

    #将Article表的文章类型转换为小写TYPE_LOWER,列出type和TYPE_LOWER
    select type,lower(type) as TYPE_LOWER from Article order by type;
    

    length():返回字符串的长度

    #计算Article表的文章类型的字符长度
    select type,length(type) as TYPE_LENGTH from Article order by type;
    

    Soundex()函数:匹配所有类似于要检索的字符串

    #查询类型类似于APP的Article信息
    select * from Article where SOUNDEX(type)=SOUNDEX('App');
    

    Trim()函数去掉字符串左右两边的空格

    select concat(TRIM(type),'(',TRIM(qq_group),')')from Article order by type;
    

    执行算术计算

    select type,fans,articles,fans/articles as avg_fans from Article order by type desc ;
    

    日期函数

    #获取系统当前日期时间 年-月-日 时:分:秒
    select sysdate();
    
    
    #获取系统当前日期 年-月-日
    select curdate();
    
    
    #获取系统当前时间 时:分:秒
    select curtime();
    
    
    #获取给定日期的年份——获取当前系统时间的年份
    select year(CURDATE());
    
    
    #获取给定日期的月份——获取当前系统时间的月份
    select month(CURDATE());
    
    
    #获取给定日期的天数——获取当前系统时间的天数
    select day(CURDATE());
    
    
    #获取当前时间的前一天
    select date_add(CURDATE(),INTERVAL -1 day);
    
    
    #获取当前时间的后一天
    select date_sub(CURDATE(),INTERVAL -1 day);
    
    
    #查看文章更新时间为2020-01-01 00:00:00的文章类型
    select type,update_date from Article where update_date='2020-01-01 00:00:00';
    
    
    #查看文章更新时间为2020-01-01的文章类型
    select type,update_date from Article where date(update_date)='2020-01-01';
    #查询2019年11月更新的文章(两种写法)
    #写法一:between...and 指定匹配的日期范围
    select type,update_date from Article where date(update_date) between '2019-11-01' and '2019-11-30';
    #写法二:year() and month()指定年份和月份
    select type,update_date from Article where year(update_date)=2019 and month(update_date)=11;
    
    
    

    数值处理函数

    #abs()返回一个数的绝对值
    select abs(-5);
    
    
    #cos()返回一个角度的余弦
    select cos(30);
    
    
    #sin()返回一个角度的正弦
    select sin(60);
    
    
    #tan()返回一个角度的正切
    select tan(45);
    
    
    #返回一个数的平方根
    select sqrt(4);
    
    
    #返回一个除操作的余数(m,n),除以n的余数
    select mod(5,2);
    
    
    #返回圆周率
    select pi();
    
    
    #返回一个随机数(小数)
    select rand();
    

    聚和函数

    #AVG()函数返回列的平均值
    #计算平均粉丝数
    select avg(fans) as '平均粉丝数' from Article order by type desc ;
    
    
    #COUNT()函数返回某列的行数
    #COUNT(*)对表中行的数目进行计数, 不管表列中包含的是空值( NULL)还是非空值
    #统计类型总数
    select count(*) from Article;
    
    
    #COUNT(column)对特定列中具有值的行进行计数,忽略NULL值
    #统计文章数
    select count(articles) from Article;
    
    
    #MAX()函数返回某列的最大值
    #查询阅读量最多的文章类型
    select max(fans) as '受众最大值' from Article;
    
    
    
    
    #MIN()函数返回某列的最小值
    select min(fans) as '受众最小值' from Article;
    
    
    #SUM()函数返回某列值之和
    #统计文章总数
    select sum(articles) from Article;
    

    组合聚集函数

    #DISTINCT()函数只考虑不同值的平均值
    select avg(distinct fans) as '平均粉丝数' from Article order by type desc ;
    select avg(fans) as '平均粉丝数' from Article order by type desc ;
    
    
    #组合聚集函数
    select count(*) as '总数',
    max(articles) as '文章数最大值',
    min(articles) as '文章数最小值' ,
    avg(fans) as '平均粉丝数'
    from Article;
    

    总结:SELECT子句顺序

    SELECT:要返回的列或表达式

    ...

    FROM:要检索的数据表

    WHERE:行级过滤

    ...

    GROUP BY:分组说明

    HAVING:组级过滤

    ...

    ORDER BY:输出时排序

    ...

    LIMIT:要检索的行数

    ...

    附:Author表

    Article表

    ArticleDetail表

    最后是今天的分享:Author、Article、ArticleDetail三张表一键建表SQL语句

    ITester软件测试小栈今日分享

    获取内容

    Author、Article、ArticleDetail三张表一键建表SQL语句

    领取方式

    微信公众号后台回复:MySQL表

    有图有真相

    以上

    That's  all

    下一篇介绍多表查询

    敬请期待

    ITester软件测试小栈

    往期内容宠幸

    叮—这有一打让你666的测试终极资料包,请查收!

    打开PyCharm永久激活的这两个锦囊,再也不用担心写代码的时候让我付费了!

    QQ空间面试题放送,速度教科书式扑街补救offer!

    金九银十加薪季,测试题预热一波。

    测试面试题集-测试基础理论

    测试面试题集-测试用例设计:登录、购物车、QQ收藏表情、转账、充值、提现

    测试面试题集-生活物品测试:杯子、伞、钢笔、桌子

    Selenium系列文章汇总

    30个MySQL数据库常用小技巧,吐血整理

    SQL从入门到入魔之初入门

    SQL从入门到入魔之数据库基本操作

    SQL从入门到入魔之select简单查询

    MySQL之数据库基本操作语句

    MySQL之创建表以及数据库增删改操作

    速看,APP测试之ADB最全指南!

    APP测试之Monkey压力测试(一)

    APP测试之Monkey压力测试(二)

    快来星标 置顶 关注我

    后台回复资源取干货

    想要获取相关资料和软件 ?

    Q群:727998947

    展开全文
  • mysql在子查询中使用自定义变量和条件语句实现编程思维的查询语句 自定义变量和条件语句语法规则 自定义变量规则 @变量名:=固定值 | 函数调用 | 条件语句 别名 mysql> SELECT @min_price:=MIN(price),@max_...

    前言

    mysql语法简单,但也正因如此,在检索稍微复杂的数据时,有时可能需要连续的子查询的嵌套以及表连接的组合应用,其逻辑上的循环嵌套远不如通过中间变量来存储易于理解。但一般情况下,我们倾向于通过一个分号来输出一次查询结果,而不是保存为视图进行二次查询。这样的情况下,对于不是特别复杂的检索逻辑我们可以尽量通过自定义变量来存储值,达到编程语言中的函数效果,而不是完全依靠where子句进行一箩筐的添加条件让机器思考,这样既易于编写又提升了速度。

    自定义变量和条件语句语法规则

    自定义变量规则

    @变量名:=固定值 | 函数调用 | 条件语句		别名
    
    mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;		# 初始化变量
    
    mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;	# 引用变量
    

    条件语句

    在非funtionprocedure的一般查询语法中,sql中的条件语句和高级编程语言中的条件语句用法上有所不同,sql中的if更像一个函数,而不是代表一个语句,但也有和编程语言中相差不大的条件语句,比如case。简单介绍一下3种在一般条件语句中的用法,不做更深的理解。不深究的原因可以看下例题思路解析部分。

    IF( expr1 , True_expr , False_expr )	#	expr1为真返回True_expr, 假则返回False_expr
    
    IFNULL( expr1 , Null_expr )	#	expr1的值不为空仍返回该值, 值为空则返回Null_expr
    
    case when 条件1 then 结果1 
    		when 条件2 then 结果2 
    		else 结果N 
    end
    

    例题简介

    Leetcode 180:编写一个 SQL 查询,查找所有至少连续出现三次的数字。

    +----+-----+
    | Id | Num |
    +----+-----+
    | 1  |  1  |
    | 2  |  1  |
    | 3  |  1  |
    | 4  |  2  |
    | 5  |  1  |
    | 6  |  2  |
    | 7  |  2  |
    +----+-----+
    

    思路解析

    写代码写多了,遇到这种情况程序思维就觉得很简单,if+count的组合应该很容易就解决了。但是在sql中,一方面我对if,ifnull, case when等条件语句和函数不太了解,在帮助文档以及mysql应知应会这种工具书中都没有怎么提及,只能在csdn上搜索相关文档,另一方面,这类题目的逻辑并非非常复杂,我个人是不想为这种程度的逻辑去使用functionprocedure
    一般的sql解法可能会对同一张表多次连接后加上较复杂的where子句,但我是有些不太习惯这种思维模式的,感觉过于暴力;另外一种解法是程序思维,使用自定义变量和条件语句来达到函数的效果。因此,我会列出两种方法,但对第二种方法更有倾向性。

    方法1:同表多连接

    无论如何,用的最多的可能还是相同表连接的查询方式来表示检索条件。

    mysql> select distinct L1.Num as ConsecutiveNums
        -> from Logs L1, Logs L2, Logs L3
        -> where L1.Id = L2.Id - 1		# 条件语句
        -> and L2.Id = L3.Id - 1
        -> and L1.Num = L2.Num
        -> and L2.Num = L3.Num;
    
    +-----------------+
    | ConsecutiveNums |
    +-----------------+
    |               1 |
    +-----------------+
    1 row in set (0.01 sec)
    

    这里有至少有一处可以优化,就是在表连接出可以使用外连接减少检索的行数,速度的确快了,但思路上基本没有变化。

    mysql> select distinct L1.Num as ConsecutiveNums
        -> from Logs L1 left join Logs L2 on L1.Num = L2.Num
        -> left join Logs L3 on L2.Num = L3.Num
        -> where L1.Id = L2.Id - 1
        -> and L2.Id = L3.Id - 1;
        
    +-----------------+
    | ConsecutiveNums |
    +-----------------+
    |               1 |
    +-----------------+
    1 row in set (0.00 sec)
    
    

    方法2:子查询(自定义变量)

    这种解法是我希望在sql中实现的,但在我原来的理解中,可能需要定义functionor procudure,不过因为逻辑上又没那么复杂不想麻烦所以一直觉得没必要。但这位老兄的解法给我提供了一个类函数的查询模板让我思考。
    可能因为mysql的直接堆叠的查询逻辑更容易看懂,我看到Leetcode上数据库练习下的评论既少又表示对这种编程思维不太理解。其实包括我自己第一次看到的时候也有点懵。但看懂了以后会觉得比原来的方法更有趣也更快。
    先把代码附上,接下来从子查询开始说明这种逻辑如何在sql中更好的实现。

    SELECT DISTINCT a.Num ConsecutiveNums FROM (		# 主句
    SELECT t.Num ,										# 子表1
           @cnt:=IF(@pre=t.Num, @cnt+1, 1) cnt,
           @pre:=t.Num pre
      FROM Logs t, (SELECT @pre:=null, @cnt:=0) b) a		# 子表2
      WHERE a.cnt >= 3
    
    作者:hy3300
    链接:https://leetcode-cn.com/problems/two-sum/solution/bu-shi-yong-idqing-kuang-xia-tong-ji-by-hy3300/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    方法2详解

    子查询理解如果从主句开始,比较难用语言说明子查询返回的表的结构组成,所以我从子表2开始说明,并依次扩充直到主句

    1. 子表2
      select @pre:=null, @cnt:=0
      生成包含两个字段的表,但这两个字段本身没有意义,其主要作用是通过建立表来初始化两个自定义变量用于迭代,cnt变量用于存储当前Num出现的次数,pre用于存储当前的Num进行下一条数据比较。

    2. 子表1

      SELECT t.Num ,
         @cnt:=IF(@pre=t.Num, @cnt+1, 1) cnt,
         @pre:=t.Num pre
      	FROM Logs t, 子表2 b
      
      	+------+------+------+
      	| Num  | cnt  | pre  |
      	+------+------+------+
      	|    1 |    1 |    1 |
      	|    1 |    2 |    1 |
      	|    1 |    3 |    1 |
      	|    2 |    1 |    2 |
      	|    1 |    1 |    1 |
      	|    2 |    1 |    2 |
      	|    2 |    2 |    2 |
      	+------+------+------+
      
      

    将子表2替换命名为b,该句可以理解为从表Logs t中选取t.Num, cnt, pre 三个字段,依次返回三个值:Num,Num出现次数,保存本条数据中的Num值。因为没有where子句的限制,select会对每行的Num检索一次,并计算出相对应的cnt和pre值。这种结构类似于编程语言中的while-if,每一行相当于一次循环,cnt和pre变量会在每次循环中随条件而变化,同时这里如果需要控制次数可以使用LIMIT语句。
    可以看到,子表1的效果就是函数封装的效果,相当有趣。

    1.  SELECT DISTINCT a.Num ConsecutiveNums
       FROM 子表1 a
       WHERE a.cnt >= 3
      
      当我们看到子表1的结果表之后,再来看主句就相当容易理解了,无外乎是一个简单的查询语句。

    总结

    以往我使用子查询,通常会将子查询作为计算字段来使用,比如select c1, (select c2 from t2) as c2 from t1select * from t1 where t1.c1 = (select c2 from t2 where id=1),而在本例中,子查询起到了类似过滤的作用,即利用变量重新构建了一个新表,这种方法大大增加了子查询的易用性和可行性,未来在遇到比一般查询稍复杂一些,但逻辑上又不会过于繁杂的情况,可以尝试在子查询中使用自定义函数和条件语句,构建一个具有函数效果的sql查询语句。

    展开全文
  • 数据库查询语句大全

    千次阅读 2021-01-21 15:49:04
    8、查询上季度数据 select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(DATE_SUB(now(),interval 1 QUARTER)); 9、查询本年数据 select * from `ht_invoice_information` where YEAR...
  • SQL查询语句大全(个人总结)

    万次阅读 多人点赞 2020-01-14 17:14:37
    全面的sql查询总结
  • mysql 查询语句汇总学习

    万次阅读 多人点赞 2018-10-25 11:08:37
    数据库的操作作为计算机行业的必备技能,这里将用的最多的数据库查询语句汇总到这里(参考链接:https://blog.csdn.net/github_37767025/article/details/67636061),供大家交流学习 (一)单表查询 1.查询一张表...
  • 达梦数据库查询语句

    千次阅读 2020-05-07 18:09:24
    DM_SQL语言是一种介于关系代数与关系演算之间的语言,其功能主要包括数据定义、 查询、操纵和控制四个方面,通过各种不同的SQL语句来实现。按照所实现的功能,DM_SQL 语句分为以下几种: 用户、模式、基表、视图、...
  • jdbc查询语句的执行

    千次阅读 2019-09-12 17:05:53
    由 SELECT 语句返回的行集合包括满足该语句...一、定义实体类封装查询结果 1、创建Department实体类 package com.xzit.pojo; import java.util.Date; public class Department { private String deptno; priv...
  • 数据库基础:select基本查询语句

    万次阅读 多人点赞 2019-03-20 13:40:05
    数据库基本查询语句规范为:select 区域 from 表名 查询指定表 select * from 表名 *:代表所有列 示例:select * from TL_REQUEST 查询指定列 select 列名 from 表名 列名:代表从指定的列名中查找 ,:...
  • Java中使用Mongodb查询语句

    千次阅读 2019-04-16 20:27:49
    基本查询语句: MongoTemplate().find(query, Model.class); 当有多个查询条件时,我们需要构造Criteria[]数组,两种方式: 直接赋值,这种方式缺点在于每一条查询语句中,只能够赋值一次,意思就是,在声明...
  • InfluxDB 查询语句

    千次阅读 2020-05-13 17:36:59
    InfluxDB influxdb 数据交互基于 http请求 influxdb 对大小写不敏感,对单双引号敏感 missing fields dropped=0 原因是字符串中含有换行符\n, 导致写入失败
  • MySQL查询语句

    万次阅读 多人点赞 2019-08-27 14:39:32
    查询之前,我们也先准备好一些数据 -- 创建 db2 数据库 CREATE DATABASE db2;-- 使用 db2 数据库 USE db2;-- 数据 student 数据表 CREATE TABLE student ( id INT, -- 编号 NAME VARCHAR(20), -- 姓名 ...
  • Spring Boot JPA的查询语句

    万次阅读 2020-03-03 09:30:52
    Spring Boot JPA的查询语句 之前的文章中,我们讲解了如何使用Spring Boot JPA, 在Spring Boot JPA中我们可通过构建查询方法或者通过@Query注解来构建查询语句,本文我们将会更详细的讨论查询语...
  • PostgreSQL:八. 查询语句

    千次阅读 2020-04-30 18:26:46
    查询语句 首先定义数据表, CREATE TABLE fruits ( f_id char(10) NOT NULL, s_id INT NOT NULL, f_name char(255) NOT NULL, f_price decimal(8,2) NOT NULL, PRIMARY KEY(f_id) ); 为了演示如何使用S...
  • sql常用查询语句

    万次阅读 2019-06-01 16:29:56
    单表查询: #查询pname和price,去掉pname和price同时重复的数据 select distinct pname,price from product; #查询商品名和价格并起别名 select pname as 商品名称,price as 商品价格 from product; #查询商品...
  • mysql查询语句——模糊查询

    千次阅读 2019-07-26 17:16:15
    查询名称里面带蔡徐坤的名字 select * from stu where name like '%蔡徐坤%'; 这样就能查询出“是蔡徐坤是”,“蔡徐坤咯”这样类似的名称 下划线'_'可以匹配单一字符 select * from stu where name='_蔡...
  • MongoDB 查询语法与常用查询语句总结

    万次阅读 2018-09-30 17:28:04
    MongoDB 常用查询语句总结 先来一波查询语句语法的基本解释: 列子: db.mycol.find({&amp;quot;likes&amp;quot;: {$gt:10}, $or: [{&amp;quot;by&amp;quot;: &amp;quot;yiibai tutorials&...
  • Python MySQL数据库执行查询语句

    千次阅读 2019-11-27 18:20:11
    使用 MySQL 数据库模块执行查询语句,与使用 SQLite 数据库模块执行查询语句基本相似,只需注意 SQL 语句中的占位符的差别即可。例如,如下程序示范了查询 MySQL 数据库中的数据: import mysql.connector conn = ...
  • SQL查询语句的基本使用方法

    万次阅读 多人点赞 2018-10-30 17:13:23
    实验四 数据库的组合查询和统计查询 以下通过几个实例来演示sql语句的基本查询和多表联查,以及统计查询 假设目前已经创建好名成为’JXGL’的数据库,并且... SELECT查询语句 --查询所有的学生的学号和姓名 U...
  • 常用的SQL Server查询语句

    千次阅读 2019-06-10 11:44:37
    SQL语句由命令、子句、运算符和统计函数组成。 一. 命令 1. 数据定义命令: CREATE: 建立新的数据表、字段和索引表; DROP: 从数据库删除数据表或索引; ALTER: 增加或修改字段属性; 2. 数据操作命令: ...
  • sqlserver常用查询语句

    万次阅读 2017-11-24 18:21:48
    --查询语句 SELECT * FROM BASE_USER; --查询前10条语句 SELECT TOP 10 * FROM BASE_USER; --允许脏读查询 SELECT * FROM BASE_USER WITH(NOLOCK); --获取当前数据库名称 SELECT DB_NAME(dbid) as dbName FROM ...
  • Mongodb模糊查询语句

    千次阅读 2019-09-30 17:51:59
    语句:类比SQL ( SELECT * FROM tableName WHERE queryStr LIKE '%fuseReport%' ) db.tableName.find({"queryStr": {$regex: 'fuseReport', $options:'i'}}); 语句:类比SQL ( SELECT _id,queryStr FROM ...
  • linux下Mysql查询语句

    千次阅读 2019-09-02 19:37:17
    查询 库和表信息 mysql> show databases; 查看数据 mysql> use mysql;进入数据库 mysql> show tables; 看当前库中有哪些表 二.查询表内容 mysql> select * from mysql.user; 查看表内容 mysql> ...
  • Oracle数据库查询语句

    千次阅读 2019-01-04 23:08:10
    1 oracle数据库查询表的所有数据–select * ...3 oracle数据库往表中添加数据信息–(添加信息使用insert into语句) insert into 表名 values(添加相对应的数据信息,如果在一个字段名中没有信息可以用“null”nul...
  • 经过上面一系列的梳理,相信大家对 MySQL 查询语句的流程也有了一个大致的了解,下面是针对查询语句的流程做的一张图,方便大家记忆理解: By the way 有问题?可以给我留言或私聊 有收获?那就顺手点个赞呗~...
  • Mysql分页查询语句

    千次阅读 2019-05-23 19:23:12
     经常用到在数据库中查询中间几条数据的需求  比如下面的sql语句:  ① selete * from testtable limit 2,1;  ② selete * from testtable limit 2 offset 1;  注意:  1.数据库数据计算是从0开始的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,308,371
精华内容 523,348
关键字:

查询语句