Mysql - 常用sql

1. 查看sql执行情况,用于分析sql语句可优化方案(关键字:explain)。

 

explain select * from user where name = 'my name';

 

2. 查看字段名称和类型(COLUMN_NAME,DATA_TYPE)。

select * from information_schema.columns where table_name='表名'

 

3. 查询记录是否存在。

sql1: select count(*) from table where id = 1 最慢 
sql2: select count(id) from table where id = 1 略快
sql2: select count(1) from table where id =1 比略快快
sql3 select 1 from table where id = 1 limit 1 暂时理论最快
解释:sql3 中1为常量,无需查字典表,Ilimit 如果遇到1条就返回,无需再向后查询。

 

4. 字符串比较通常不区分大小写,这意味着当你想要查询 where name = '小a' 的时候,小A也会和你say hello。如果你不想看见小A请在查询条件前使用关键字  BINARY;  例如:where BINARY name = '小a'。对于排序也是一样的。 

 

5. 按月统计开始时间到结束时间的某些数据,当月数据不存在则显示0。

    

-- 以下并不是生产使用的sql, 只是简版,如果需要交叉生成日期,请搜索关键字 "mysql 笛卡尔积"
SELECT   date_month.m,   IF(data.BeginDate IS NULL,a.m, data.BeginDate) as BeginDate -- 如果data.BeginDate值为null,则等于date_month.m的值,否则等于data.BeginDate的值
FROM (
  SELECT DATE_FORMAT(DATE_ADD("2020-10-01", INTERVAL - 0 MONTH),'%Y-%m') as m -- 查询日期并格式化格式
  UNION ALL SELECT DATE_FORMAT(DATE_ADD("2020-10-01", INTERVAL - 1 MONTH),'%Y-%m') as m --查询日期-1个月格式化格式,结果合并到上表。(合并关键字:UNION)   UNION ALL SELECT DATE_FORMAT(DATE_ADD("2020-10-01", INTERVAL - 2 MONTH),'%Y-%m') as m ) as date_month LEFT JOIN (   SELECT     DATE_FORMAT((date_begin),'%Y-%m')AS BeginDate, -- 格式化日期格式     sum(if(invalid=0,amount+tax_amount,0)) AS TaxableSales, --按条件累加     sum(if(invalid=0 AND invoice_type_code IN ('01','02','08','004','009','s'),amount+tax_amount,0)) AS OutputVATSpecialInvoiceAmount, -- 销项增值税专用发票金额     sum(if(amount<0 and tax_amount<0,amount+tax_amount,0)) AS RedNoteAmount,     sum(if(invalid=1,amount+tax_amount,0)) AS InvalidBillAmount,     count(1) as InvoicedQuantity,     count(if(invoice_type_code IN ('01','02','08','004','009','s'),true,null)) as OutputVATSpecialInvoiceQuantity,     count(if(amount<0,true,null)) as NumberOfRedTickets,     count(if(invalid=1,true,null)) as NumberOfInvalidTickets,     sum(if(invalid=0,tax_amount,0)) as TaxAmount   FROM
    bs_invoice_bill_excluding_details
    where query_id = "test"
    AND date_begin >= "2012-12-12 12:12:12"
    AND date_begin <= "2013-13-13 13:13:13"
    group by BeginDate -- 根据BeginDate分组进行计算
  ) as data on data.BeginDate = date_month.m

 

posted @ 2021-09-17 10:58  `YU  阅读(34)  评论(0)    收藏  举报