0
点赞
收藏
分享

微信扫一扫

mysql执行语句(SQL优化)

创建数据表:

SQL Code复制内容到剪贴板

  1. CREATE TABLE `test1` (    
  2.     `id` int(11) NOT NULL AUTO_INCREMENT,    
  3.     `firstname` TINYBLOB NOT NULL COMMENT '用户名/支持表情符号255字节',/* 修改字段类型 */  
  4.     `question_id` int(11) NOT NULL DEFAULT '0' COMMENT '问题ID',    
  5.     `customer_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',    
  6.     `approved` tinyint(1) NOT NULL DEFAULT '0' COMMENT '字段备注',    
  7.     `customer_name` varchar(32) NOT NULL DEFAULT '' COMMENT '用户姓名',    
  8.     `customer_phone` varchar(11) NOT NULL DEFAULT '' COMMENT '用户手机号',    
  9.     `value` text NOT NULL COMMENT '值',    
  10.     `order_total` decimal(15,4) NOT NULL DEFAULT '0.0000',    
  11.     `status` enum('new','invalid','valid','transfered') NOT NULL DEFAULT 'new',    
  12.     `date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',    
  13.     PRIMARY KEY (`id`),    
  14.     KEY `question_id` (`question_id`)    
  15. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;    

 

 

PHP Code复制内容到剪贴板

  1. 标准命令:mysql -u数据库用户名 -p数据库密码 数据库名 < 数据库文件名.sql  
  2. 示范案例:mysql -ulaozuo -plaozuo.org laozuo < laozuo.sql  

 

求取平均值:

SQL Code复制内容到剪贴板

  1. SELECT AVG(column_name) FROM table_name  

 

 

SQL添加一个字段

SQL Code复制内容到剪贴板

  1. ALTER TABLE `test1` ADD COLUMN `description` varchar(255) NOT NULL DEFAULT '' COMMENT '备注';   

 

SQL添加一个枚举类型的字段(节省数据库资源)

SQL Code复制内容到剪贴板

  1. ALTER TABLE `mcc_service_question_options` ADD COLUMN `if_temp` ENUM(  'use_temp',  'no_temp') NOT NULL DEFAULT  'no_temp' COMMENT '回复是否有模板';  

 

SQL添加索引

SQL Code复制内容到剪贴板

  1. ALTER TABLE `test1` ADD INDEX (`question_id`);  

 

添加字段:
alter table 表名
Add column 字段名 字段类型 默认值 AFTER 字段名 (在哪个字段后面添加)

例子:
alter table appstore_souapp_app_androidmarket
Add column getPriceCurrency varchar(50) default null AFTER getPrice

 

修改字段:
alter table表名
change 字段名 新字段名 字段类型 默认值

例子:
alter table appstore_souapp_app_androidmarket change hasPrice hasPrice varchar(10) null;

 

删除字段:
alter table 表名 drop column 字段名

例子:
alter table appstore_souapp_app_androidmarket
drop column getPriceCurrency

 

调整字段顺序:
alter table 表名
change 字段名 新字段名 字段类型 默认值 after 字段名(跳到哪个字段之后)

例子:
alter table appstore_souapp_app_androidmarket
change getPriceCurrency getPriceCurrency varchar(50) default null AFTER getPrice

 

增:

SQL Code复制内容到剪贴板

  1. INSERT INTO `test1` (`value`, `status`) VALUES ('值测试', 'new');  

删:

SQL Code复制内容到剪贴板

  1. DELETE FROM `test1` where `id`='1';  

改:

SQL Code复制内容到剪贴板

  1. UPDATE `test1` SET `question_id` = '10' WHERE `id` = '2';  

多个字段:

SQL Code复制内容到剪贴板

  1. UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'  
  2. WHERE LastName = 'Wilson'  

 

mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数去替换,用起来非常的方便,mysql 替换函数replace()
Update `table_name` SET `field_name` = replace (`field_name`,’from_str’,'to_str’) Where `field_name` LIKE ‘%from_str%’

实例:把'病假' 替换为 '--':UPDATE users SET username=REPLACE(username,'病假','--') WHERE username LIKE '%病假%';
说明:
table_name —— 表的名字
field_name —— 字段名
from_str —— 需要替换的字符串
to_str —— 替换成的字符串

 

查:

SQL Code复制内容到剪贴板

  1. SELECT * FROM `test1` WHERE id = 2  

 

表的记录数:

SQL Code复制内容到剪贴板

  1. SELECT COUNT(*) AS `total` FROM `test1`  

 

 

mysql执行语句(SQL优化)_SQL

 

keyboard的存储格式是:1,3,4的格式存储
我们的$tagId 假设是4,那么我们需要找到 keyboard中含有4的条数,那么就是FIND_IN_SET的出场了

SQL Code复制内容到剪贴板

  1. // 查询新闻表中,keyboard字段中包含 tagid  

  2. select * from {$dbtbpre}ecms_news where FIND_IN_SET('".$tagId."',keyboard) group by id order by id desc limit 15  

 

场景一:

(一对多,以多条件为基准,查询一)

mysql执行语句(SQL优化)_Code_02

mysql执行语句(SQL优化)_Code_03

要求: 查询 biz_order 订单表的时候,关联查询 biz_order_goods 商品表(一对多)的结束时间:course_end_time, 查询订单列表,如果有其中一条关联商品的结束时间,大于当前时间,那么不展示该条订单

这里的id为1 的商品,有一条商品的结束时间在7月份,设当前是6月份,那么订单1,就应该是不展示的,看一下sql:

 

SQL Code复制内容到剪贴板

  1. SELECT  
  2.     t.*, t2.maxVal  
  3. FROM  
  4.     `biz_order` t  
  5. JOIN (  
  6.     SELECT  
  7.         order_id,  
  8.         MAX(course_end_time) maxVal  
  9.     FROM  
  10.         `biz_order_goods`  
  11.     GROUP BY  
  12.         order_id  
  13. ) t2 ON t.id = t2.order_id WHERE t.id in (1,2,3) and t2.maxVal < '2017-06-07 9:54';  

mysql执行语句(SQL优化)_SQL_04

 

 

 

这里的datetime会有点问题,可以在sql中转换一下

SQL Code复制内容到剪贴板

  1. SELECT  
  2.     t.id,t.order_no, t2.maxVal  
  3. FROM  
  4.     `biz_order` t  
  5. JOIN (  
  6.     SELECT  
  7.         order_id,  
  8.         MAX( UNIX_TIMESTAMP(course_end_time) ) maxVal  
  9.     FROM  
  10.         `biz_order_goods`  
  11.     GROUP BY  
  12.         order_id  
  13. ) t2 ON t.id = t2.order_id WHERE t.id in (1,2,3) and t2.maxVal < '1496801089';  

mysql执行语句(SQL优化)_Code_05

 

 

场景:全年级 有20个班 我现在要给每个班的第一名做一个排行榜. 现有表 class_user

比如

name class_num score

小明 1 100

小红 1 95

大东 2 30

大民 2 50

小力 2 99



要求按成绩排名返回 name class_num score

SQL Code复制内容到剪贴板

  1. select a.name, b.class_num, b.score   
  2. from class_user a, (  
  3.    select class_num, max(score) as score from class_user group by class_num  
  4. ) b   
  5. where a.class_num=b.class_num and a.score=b.score  

 

 

 

同一张表中,查询符合两条记录的记录,示意图:

 

mysql执行语句(SQL优化)_剪贴板_06

需要查询出,同时符合,filter_id = 5,并且符合filter_id = 6的数据

SQL Code复制内容到剪贴板

  1. SELECT *  
  2. FROM `hzb_article_filter`  
  3. WHERE filter_id IN (  
  4.     SELECT filter_id  
  5.     FROM `hzb_article_filter`  
  6.     WHERE filter_id IN(5,6)  
  7.     GROUP BY article_id  
  8.     HAVING COUNT(*) > 1  
  9. )  

 

结果,article_id=25的已经没有了

 

mysql执行语句(SQL优化)_SQL_07

 (如果是多个ID:select * from hzb_article_filter WHERE filter_id in (select filter_id from hzb_article_filter WHERE filter_id in(2,5,11,13) GROUP BY article_id HAVING COUNT(*) > 3))

 

上面的有问题,另一种方式,join:

SQL Code复制内容到剪贴板

  1. SELECT  
  2.     `t1`.*  
  3. FROM  
  4.     `hzb_article_filter` `t1`  
  5. JOIN `hzb_article_filter` `t2` ON t1.article_id = t2.article_id  
  6. AND t2.filter_id = 5  
  7. JOIN `hzb_article_filter` `t3` ON t2.article_id = t3.article_id  
  8. AND t3.filter_id = 8  
  9. JOIN `hzb_article_filter` `t4` ON t3.article_id = t4.article_id  
  10. AND t4.filter_id = 13  
  11. WHERE  
  12.     t1.filter_id = 3  

 

 

sql查询进行中和未进行的数据:

SQL Code复制内容到剪贴板

  1. SELECT  `id` ,  `title` ,  `titlepic` ,  `classid` ,  `dizhi` ,  `price` ,  `goup` ,  `startime` ,  `endtime` ,  `likenum` ,  `area` ,  `date` ,  `zxid` ,  `plnum`  
  2. FROM phome_ecms_news 
  3. WHERE classid =6 
  4. AND ( {$currentTime} > startime 
  5. AND {$currentTime} < endtime )  
  6. OR {$currentTime} < startime 
  7. LIMIT 0 , 30 
  8. "  

 

 

sql中多处理一个时间格式的:

SQL Code复制内容到剪贴板

  1. SELECT   
  2.   EventId,  
  3.   EmployeeID,  
  4.   EventTime,  
  5.   ControlText,  
  6.   EventType,  
  7.   EventText,  
  8.   MAX(DATE_FORMAT(EventTime, "%Y%m%d%H%i")) maxVal   
  9. FROM  
  10.   `widom_monitor_door_tevent`  
  11. WHERE EventType IN (10, 11)   
  12. GROUP BY EmployeeID, DATE_FORMAT(EventTime, "%Y%m%d%H%i")  
  13. ORDER BY DATE_FORMAT(EventTime, "%Y%m%d%H") DESC   

mysql执行语句(SQL优化)_剪贴板_08

时间转换函数

FROM_UNIXTIME(EventData.DataTime,'%Y-%m-%d %H:%i:%s') as EventTime,

或者

DATE_FORMAT(EventTime, "%Y%m%d%H%i")

 

 

时间字段存为float格式:

mysql执行语句(SQL优化)_Code_09

在access库转换成时间格式:

Format(EventData.DataTime, "dd mmmm yyyy") as EventTime,

Format(EventData.DataTime, "yyyy-mm-dd hh:nn:ss") as EventTime, 

在sqlserver中转换成时间格式: 

convert(datetime,EventData.DataTime,120) as EventTime, 

 

在mysql中转换成时间格式:

FROM_UNIXTIME(created_at,'%Y-%m-%d %H:%i:%S')

PHP Code复制内容到剪贴板

  1. select created_at, FROM_UNIXTIME(created_at,'%Y-%m-%d %H:%i:%S') as created FROM `ningwang_enewsuser_profile`  

 

如果是需要将日期转为时间戳再格式化:

PHP Code复制内容到剪贴板

  1. from_unixtime(UNIX_TIMESTAMP(pay_time), '%Y-%c-%d') as time  

 

 

 

这里会出一个问题就是mysql的时区很可能不对,可以进入mysql查看当前时间对不对,如果是以下这种情况,当前时间是2020-12-17 17:02,那么表示时区有问题,需要在mysql中配置时区

mysql> select now();

+---------------------+

| now()  |

+---------------------+

| 2020-12-17 09:00:55 |

+---------------------+

1 row in set (0.00 sec)

 

mysql> show VARIABLES like '%time_zone%';

+------------------+--------+

| Variable_name | Value |

+------------------+--------+

| system_time_zone | UTC |

| time_zone | SYSTEM |

+------------------+--------+

2 rows in set (0.01 sec)

 

修改配置文件

找到my.ini, 在mysqld 下增加 default-time-zone = '+8:00'

必须放到mysqld 下,放入其它位置无效

 

 

mysql执行语句(SQL优化)_Code_10

 

 

根据数据库中的EmployeeID人员ID和EventType刷卡动作过滤,过滤掉同一时间(Y-m-d H:i)的记录

bug:应该调3947的那条数据

mysql执行语句(SQL优化)_Code_11

 

SQL Code复制内容到剪贴板

  1. SELECT   
  2.   EventId,  
  3.   EmployeeID,  
  4.   EventTime,  
  5.   ControlText,  
  6.   EventType,  
  7.   EventText,  
  8.   max(EventId)   
  9. FROM  
  10.   `widom_monitor_door_tevent`  
  11. WHERE EventType IN (10, 11)   
  12. GROUP BY EmployeeID, DATE_FORMAT(EventTime, "%Y%m%d%H%i")  
  13. ORDER BY EventTime DESC   

 

 

 

case when

 

SQL Code复制内容到剪贴板

  1. select u.id,u.name,u.sex,  
  2.    (case u.sex  
  3.      when 1 then '男'  
  4.      when 2 then '女'  
  5.      else '空的'  
  6.      end  
  7.     )性别  
  8.  from users u;  

结果中的"sex"是用代码表示的,希望将代码用中文表示。可在语句中使用case语句

 

access数据库不支持case when,可以使用switch替代:

SQL Code复制内容到剪贴板

  1. SELECT USERID,  
  2. CHECKTYPE,  
  3. SWITCH(  
  4.  CHECKTYPE = 'I', '签到',  
  5.  CHECKTYPE = 'O', '签退',  
  6.  True,'') AS 行为   
  7. from CHECKINOUT  

 

 

三张表,cut,label,map,通过一条sql查询其多条label,以逗号隔开

cut表

mysql执行语句(SQL优化)_剪贴板_12

label表

mysql执行语句(SQL优化)_剪贴板_13

map关联表

mysql执行语句(SQL优化)_剪贴板_14

 

SQL Code复制内容到剪贴板

  1. SELECT   
  2.   c.*,  
  3.   GROUP_CONCAT(l.label_name SEPARATOR ', ') AS label   
  4. FROM  
  5.   `yy_cut` c   
  6.   INNER JOIN `yy_cut_map` m   
  7.     ON m.`cut_id` = c.`id`   
  8.   INNER JOIN   
  9.    `yy_cut_label` l   
  10.     ON m.`label_id` = l.`id`   
  11.     AND m.`cut_id` = 1   

mysql执行语句(SQL优化)_SQL_15

 

SQL Code复制内容到剪贴板

  1. SELECT   
  2.   c.*,  
  3.   GROUP_CONCAT(l.id SEPARATOR ', ') AS label_id,  
  4.   GROUP_CONCAT(l.label_name SEPARATOR ', ') AS label   
  5. FROM  
  6.   `yy_cut` c   
  7.   INNER JOIN `yy_cut_map` m   
  8.     ON m.`cut_id` = c.`id`   
  9.   INNER JOIN   
  10.    `yy_cut_label` l   
  11.     ON m.`label_id` = l.`id`   
  12.     AND m.`cut_id` = 1   

 

mysql执行语句(SQL优化)_Code_16

 

查询指定用户参与的全部项目下的,所有用户id,过滤掉相同用户id:

SQL Code复制内容到剪贴板

  1. SELECT   
  2.     DISTINCT user_id  
  3. FROM  
  4.     block_project_user  
  5. WHERE  
  6.     project_id IN (  
  7.         SELECT  
  8.             DISTINCT project_id  
  9.         FROM  
  10.             block_project_user  
  11.         WHERE  
  12.             user_id = 28   
  13.     )  

 

mysql执行语句(SQL优化)_SQL_17

举报

相关推荐

0 条评论