创建数据表:
SQL Code复制内容到剪贴板
- CREATE TABLE `test1` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `firstname` TINYBLOB NOT NULL COMMENT '用户名/支持表情符号255字节',/* 修改字段类型 */
- `question_id` int(11) NOT NULL DEFAULT '0' COMMENT '问题ID',
- `customer_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',
- `approved` tinyint(1) NOT NULL DEFAULT '0' COMMENT '字段备注',
- `customer_name` varchar(32) NOT NULL DEFAULT '' COMMENT '用户姓名',
- `customer_phone` varchar(11) NOT NULL DEFAULT '' COMMENT '用户手机号',
- `value` text NOT NULL COMMENT '值',
- `order_total` decimal(15,4) NOT NULL DEFAULT '0.0000',
- `status` enum('new','invalid','valid','transfered') NOT NULL DEFAULT 'new',
- `date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
- PRIMARY KEY (`id`),
- KEY `question_id` (`question_id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
PHP Code复制内容到剪贴板
- 标准命令:mysql -u数据库用户名 -p数据库密码 数据库名 < 数据库文件名.sql
- 示范案例:mysql -ulaozuo -plaozuo.org laozuo < laozuo.sql
求取平均值:
SQL Code复制内容到剪贴板
- SELECT AVG(column_name) FROM table_name
SQL添加一个字段
SQL Code复制内容到剪贴板
- ALTER TABLE `test1` ADD COLUMN `description` varchar(255) NOT NULL DEFAULT '' COMMENT '备注';
SQL添加一个枚举类型的字段(节省数据库资源)
SQL Code复制内容到剪贴板
- ALTER TABLE `mcc_service_question_options` ADD COLUMN `if_temp` ENUM( 'use_temp', 'no_temp') NOT NULL DEFAULT 'no_temp' COMMENT '回复是否有模板';
SQL添加索引
SQL Code复制内容到剪贴板
- 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复制内容到剪贴板
- INSERT INTO `test1` (`value`, `status`) VALUES ('值测试', 'new');
删:
SQL Code复制内容到剪贴板
- DELETE FROM `test1` where `id`='1';
改:
SQL Code复制内容到剪贴板
- UPDATE `test1` SET `question_id` = '10' WHERE `id` = '2';
多个字段:
SQL Code复制内容到剪贴板
- UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
- 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复制内容到剪贴板
- SELECT * FROM `test1` WHERE id = 2
表的记录数:
SQL Code复制内容到剪贴板
- SELECT COUNT(*) AS `total` FROM `test1`
keyboard的存储格式是:1,3,4的格式存储
我们的$tagId 假设是4,那么我们需要找到 keyboard中含有4的条数,那么就是FIND_IN_SET的出场了
SQL Code复制内容到剪贴板
- // 查询新闻表中,keyboard字段中包含 tagid
- select * from {$dbtbpre}ecms_news where FIND_IN_SET('".$tagId."',keyboard) group by id order by id desc limit 15
场景一:
(一对多,以多条件为基准,查询一)
要求: 查询 biz_order 订单表的时候,关联查询 biz_order_goods 商品表(一对多)的结束时间:course_end_time, 查询订单列表,如果有其中一条关联商品的结束时间,大于当前时间,那么不展示该条订单
这里的id为1 的商品,有一条商品的结束时间在7月份,设当前是6月份,那么订单1,就应该是不展示的,看一下sql:
SQL Code复制内容到剪贴板
- SELECT
- t.*, t2.maxVal
- FROM
- `biz_order` t
- JOIN (
- SELECT
- order_id,
- MAX(course_end_time) maxVal
- FROM
- `biz_order_goods`
- GROUP BY
- order_id
- ) t2 ON t.id = t2.order_id WHERE t.id in (1,2,3) and t2.maxVal < '2017-06-07 9:54';
这里的datetime会有点问题,可以在sql中转换一下
SQL Code复制内容到剪贴板
- SELECT
- t.id,t.order_no, t2.maxVal
- FROM
- `biz_order` t
- JOIN (
- SELECT
- order_id,
- MAX( UNIX_TIMESTAMP(course_end_time) ) maxVal
- FROM
- `biz_order_goods`
- GROUP BY
- order_id
- ) t2 ON t.id = t2.order_id WHERE t.id in (1,2,3) and t2.maxVal < '1496801089';
场景:全年级 有20个班 我现在要给每个班的第一名做一个排行榜. 现有表 class_user
比如
name class_num score
小明 1 100
小红 1 95
大东 2 30
大民 2 50
小力 2 99
要求按成绩排名返回 name class_num score
SQL Code复制内容到剪贴板
- select a.name, b.class_num, b.score
- from class_user a, (
- select class_num, max(score) as score from class_user group by class_num
- ) b
- where a.class_num=b.class_num and a.score=b.score
同一张表中,查询符合两条记录的记录,示意图:
需要查询出,同时符合,filter_id = 5,并且符合filter_id = 6的数据
SQL Code复制内容到剪贴板
- SELECT *
- FROM `hzb_article_filter`
- WHERE filter_id IN (
- SELECT filter_id
- FROM `hzb_article_filter`
- WHERE filter_id IN(5,6)
- GROUP BY article_id
- HAVING COUNT(*) > 1
- )
结果,article_id=25的已经没有了
(如果是多个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复制内容到剪贴板
- SELECT
- `t1`.*
- FROM
- `hzb_article_filter` `t1`
- JOIN `hzb_article_filter` `t2` ON t1.article_id = t2.article_id
- AND t2.filter_id = 5
- JOIN `hzb_article_filter` `t3` ON t2.article_id = t3.article_id
- AND t3.filter_id = 8
- JOIN `hzb_article_filter` `t4` ON t3.article_id = t4.article_id
- AND t4.filter_id = 13
- WHERE
- t1.filter_id = 3
sql查询进行中和未进行的数据:
SQL Code复制内容到剪贴板
- "
- SELECT `id` , `title` , `titlepic` , `classid` , `dizhi` , `price` , `goup` , `startime` , `endtime` , `likenum` , `area` , `date` , `zxid` , `plnum`
- FROM phome_ecms_news
- WHERE classid =6
- AND ( {$currentTime} > startime
- AND {$currentTime} < endtime )
- OR {$currentTime} < startime
- LIMIT 0 , 30
- "
sql中多处理一个时间格式的:
SQL Code复制内容到剪贴板
- SELECT
- EventId,
- EmployeeID,
- EventTime,
- ControlText,
- EventType,
- EventText,
- MAX(DATE_FORMAT(EventTime, "%Y%m%d%H%i")) maxVal
- FROM
- `widom_monitor_door_tevent`
- WHERE EventType IN (10, 11)
- GROUP BY EmployeeID, DATE_FORMAT(EventTime, "%Y%m%d%H%i")
- ORDER BY DATE_FORMAT(EventTime, "%Y%m%d%H") DESC
时间转换函数
FROM_UNIXTIME(EventData.DataTime,'%Y-%m-%d %H:%i:%s') as EventTime,
或者
DATE_FORMAT(EventTime, "%Y%m%d%H%i")
时间字段存为float格式:
在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复制内容到剪贴板
- select created_at, FROM_UNIXTIME(created_at,'%Y-%m-%d %H:%i:%S') as created FROM `ningwang_enewsuser_profile`
如果是需要将日期转为时间戳再格式化:
PHP Code复制内容到剪贴板
- 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 下,放入其它位置无效
根据数据库中的EmployeeID人员ID和EventType刷卡动作过滤,过滤掉同一时间(Y-m-d H:i)的记录
bug:应该调3947的那条数据
SQL Code复制内容到剪贴板
- SELECT
- EventId,
- EmployeeID,
- EventTime,
- ControlText,
- EventType,
- EventText,
- max(EventId)
- FROM
- `widom_monitor_door_tevent`
- WHERE EventType IN (10, 11)
- GROUP BY EmployeeID, DATE_FORMAT(EventTime, "%Y%m%d%H%i")
- ORDER BY EventTime DESC
case when
SQL Code复制内容到剪贴板
- select u.id,u.name,u.sex,
- (case u.sex
- when 1 then '男'
- when 2 then '女'
- else '空的'
- end
- )性别
- from users u;
结果中的"sex"是用代码表示的,希望将代码用中文表示。可在语句中使用case语句
access数据库不支持case when,可以使用switch替代:
SQL Code复制内容到剪贴板
- SELECT USERID,
- CHECKTYPE,
- SWITCH(
- CHECKTYPE = 'I', '签到',
- CHECKTYPE = 'O', '签退',
- True,'') AS 行为
- from CHECKINOUT
三张表,cut,label,map,通过一条sql查询其多条label,以逗号隔开
cut表
label表
map关联表
SQL Code复制内容到剪贴板
- SELECT
- c.*,
- GROUP_CONCAT(l.label_name SEPARATOR ', ') AS label
- FROM
- `yy_cut` c
- INNER JOIN `yy_cut_map` m
- ON m.`cut_id` = c.`id`
- INNER JOIN
- `yy_cut_label` l
- ON m.`label_id` = l.`id`
- AND m.`cut_id` = 1
SQL Code复制内容到剪贴板
- SELECT
- c.*,
- GROUP_CONCAT(l.id SEPARATOR ', ') AS label_id,
- GROUP_CONCAT(l.label_name SEPARATOR ', ') AS label
- FROM
- `yy_cut` c
- INNER JOIN `yy_cut_map` m
- ON m.`cut_id` = c.`id`
- INNER JOIN
- `yy_cut_label` l
- ON m.`label_id` = l.`id`
- AND m.`cut_id` = 1
查询指定用户参与的全部项目下的,所有用户id,过滤掉相同用户id:
SQL Code复制内容到剪贴板
- SELECT
- DISTINCT user_id
- FROM
- block_project_user
- WHERE
- project_id IN (
- SELECT
- DISTINCT project_id
- FROM
- block_project_user
- WHERE
- user_id = 28
- )