面試的時候,面試官不可能只問你最基本的增刪改查,你還需要學習稍微複雜一些的查詢,由於沒有去過公司實習,故感覺自己對這些查詢的熟練度完全不夠,特此總結一些常用查詢方法。
創建數據表
DROP TABLE IF EXISTS `good_order`;
CREATE TABLE `good_order` (
`bid` int(11) NOT NULL AUTO_INCREMENT COMMENT '訂單ID',
`vid` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'vipID',
`good_num` int(11) NULL DEFAULT NULL COMMENT '貨品數量',
`money` double(11, 2) NULL DEFAULT NULL COMMENT '訂單金額',
`fmoney` double(11, 2) NULL DEFAULT NULL COMMENT '最終支付金額',
`created_time` datetime(3) NULL DEFAULT NULL COMMENT '訂單創建時間',
`good_id` int(255) NULL DEFAULT NULL COMMENT '商品ID',
`commodity_specification` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品屬性',
`order_status` int(255) NULL DEFAULT NULL COMMENT '訂單狀態',
PRIMARY KEY (`bid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 723 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
添加數據
INSERT INTO `good_order` VALUES (704, '123456', 1, 50.00, 7617.00, '2020-02-12 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (705, '123456', 1, 50.00, 98614.00, '2020-02-13 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (706, '123456', 1, 50.00, 86518.00, '2020-02-14 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (707, '123456', 1, 50.00, 6246.00, '2020-02-15 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (708, '123456', 1, 50.00, 5782.00, '2020-02-16 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (709, '123456', 1, 50.00, 18102.00, '2020-02-17 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (710, '123456', 1, 50.00, 6613.00, '2020-02-18 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (711, '123456', 1, 50.00, 10857.00, '2020-02-19 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (712, '123456', 1, 50.00, 59046.00, '2020-02-20 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (713, '123456', 1, 50.00, 35589.00, '2020-02-21 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (714, '123456', 1, 50.00, 20275.00, '2020-02-22 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (715, '123456', 1, 50.00, 30643.00, '2020-02-23 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (716, '123456', 1, 50.00, 58552.00, '2020-02-24 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (717, '123456', 1, 50.00, 6226.00, '2020-03-03 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (718, '123456', 1, 50.00, 32865.00, '2020-03-03 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (719, '123456', 1, 50.00, 64380.00, '2020-03-03 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (720, '123456', 1, 50.00, 32503.00, '2020-03-03 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (721, '123456', 1, 50.00, 79259.00, '2020-03-02 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (722, '123456', 1, 50.00, 97098.00, '2020-03-02 12:00:00.000', 42, 'middleCup#littleSweet', 1);
INSERT INTO `good_order` VALUES (723, '123456', 1, 50.00, 8633.00, '2020-03-02 12:00:00.000', 42, 'middleCup#littleSweet', 0);
找出數據表中交易量最多的一天
先 按照年月日分組,查找到某天有最多的交易量,之後再去分組,如果某組的交易條數爲最大值,則輸出該組的日期值。
SELECT
date(created_time) 時間 ,count( * ) 交易筆數
FROM
good_order
GROUP BY
DATE_FORMAT( created_time, '%Y-%m-%d' )
HAVING
count( * ) = (
SELECT
max( mycount )
FROM
( SELECT *, count( * ) mycount FROM `good_order` GROUP BY DATE_FORMAT( created_time, '%Y-%m-%d' ) ) AS total
);
查詢結果:
找出指定年月份2020-3月份中交易量最多的天數
SELECT
date( created_time ),
count( * )
FROM
good_order
WHERE
DATE_FORMAT( created_time, '%Y-%m' ) = '2020-03'
GROUP BY
DAY ( created_time )
HAVING
count( * ) = (
SELECT
max( mycount )
FROM
( SELECT *, count( * ) mycount FROM `good_order` WHERE DATE_FORMAT( created_time, '%Y-%m' ) = '2020-03' GROUP BY DAY ( created_time ) ) AS total
);
找出某月每日交易總筆數以及交易成功的交易額
先按照年月日分組,算出每日交易總筆數,然後找出交易成功的條件算出交易額
SELECT
count( * ) 交易總筆數,
(
SELECT
sum( money )
FROM
good_order a
WHERE
DATEDIFF( a.created_time, b.created_time ) = 0
AND a.order_status = 1
) 交易成功總額,
date(created_time) 日期
FROM
good_order b
GROUP BY
DATE_FORMAT( created_time, '%Y-%m-%d' )
ORDER BY
sum( money ) DESC;
查詢結果:
找出指定月份2020-3月份的交易總數以及交易成功的交易額
SELECT
count( * ) 交易總筆數,
(
SELECT
sum( money )
FROM
good_order a
WHERE
DATEDIFF( a.created_time, b.created_time ) = 0
AND a.order_status = 1
) 交易成功總額,
date( created_time ) 日期
FROM
good_order b
WHERE
DATE_FORMAT( created_time, '%Y-%m' ) = '2020-03'
GROUP BY
DAY ( created_time )
ORDER BY
sum( money ) DESC;
mysql 常用日期查詢
#時期格式化
select date_format(now() ,'%Y-%m-%d %T');
select date_format(now(),'%Y-%m-%d %H:%i:%s');
#查找前一個小時
select DATE_SUB(now(), interval 1 hour);
#查找前一個秒
select DATE_SUB(now(), interval 1 second);
#查找後30分鐘
select date_add(now(),interval 30 minute);
#今天
select * from 表名 where to_days(時間字段名) = to_days(now());
SELECT * FROM 表名 WHERE ( datediff ( update_time , '2017-09-27' ) = 0 )
SELECT * FROM 表名 WHERE year(update_time ) = 2017 and month(update_time )= 09 and day(update_time ) = 27
#昨天
SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())=-1;
#本週
SELECT * FROM 表名 WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now());
#上週
SELECT * FROM 表名 WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now())-1;
#近7天
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(時間字段名)
#近30天
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(時間字段名)
#本月
SELECT * FROM 表名 WHERE DATE_FORMAT( 時間字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )
#上一個月
SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 時間字段名, '%Y%m' ) ) =1
#本季度
SELECT * FROM 表名 where QUARTER(create_date)=QUARTER(now());
#上季度
SELECT * FROM 表名 where QUARTER(create_date)=QUARTER(DATE_SUB(now(),interval 1 QUARTER));
#本年
SELECT * FROM 表名 where YEAR(create_date)=YEAR(NOW());
#去年
SELECT * FROM 表名 where year(create_date)=year(date_sub(now(),interval 1 year));