MySQL 常用语句

1 新增

1.1 新增字段

ALTER TABLE shanghai_info ADD created DATETIME;

2 查询

3 修改

3.1 修改表名

alter table ts01 rename to ts01_new;

3.2 修改字段

ALTER TABLE shanghai_info MODIFY created DATETIME DEFAULT NULL COMMENT "新增时间";

3.3 替换字段中的某个字符串

UPDATE tableName SET phone = REPLACE(phone,'.000000','')

4 删除

4.1 清空表数据

  • truncate 是整体删除(速度较快), delete 是逐条删除(速度较慢)。
  • truncate 不写服务器 log,delete 写服务器 log,也就是 truncate 效率比 delete 高的原因。
  • truncate 不激活 trigger (触发器),但是会重置 Identity(标识列、自增字段),相当于自增列会被置为初始值,又重新从 1 开始记录,而不是接着原来的 ID 数。而 delete 删除以后,Identity 依旧是接着被删除的最近的那一条记录 ID 加 1 后进行记录。

4.2 删除某字段

ALTER TABLE table_name DROP COLUMN column_name;

5 重复记录操作

5.1 查询重复

  如,查找重复记录是根据单个字段(peopleId)来判断。

SELECT * FROM Tpeople 
  WHERE peopleId IN ( SELECT peopleId FROM Tpeople GROUP BY peopleId HAVING COUNT(peopleId) > 1)

  根据多个字段来判断

SELECT * FROM illegal_info 
  WHERE (illegal_code, city_id, reason) IN ( SELECT illegal_code, city_id, reason FROM illegal_info GROUP BY illegal_code, city_id, reason HAVING COUNT(*) > 1) ORDER BY illegal_code;
 

5.2 删除表中多余的重复记录

  例如,重复记录是根据单个字段(peopleId)来判断,只保留最先增加的记录,下面是保留 ID 最小的记录

DELETE FROM test WHERE id NOT IN (
	SELECT a.id FROM (
		SELECT MIN(id) AS id FROM test GROUP BY username HAVING COUNT(username) > 1 
		)AS a
	) AND username IN (
		SELECT b.username FROM (
			SELECT username FROM test GROUP BY username HAVING COUNT(username) > 1
			) AS b
		); 

  根据多个字段进行删除,只留有 rowid 最小的记录

delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

6 索引

6.1 添加普通索引

  • 存在表时添加普通索引
ALTER TABLE shanghai_info ADD INDEX (car_number);
  • 存在表时添加唯一索引
ALTER TABLE llegal_info ADD UNIQUE INDEX [索引名](字段1, 字段2, 字段3);
  • 建表时添加索引
CREATE TABLE `hunan_car` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `car_number` varchar(255) DEFAULT NULL COMMENT '车牌号',
  `vin` varchar(255) DEFAULT NULL COMMENT '车架号',
  `eng` varchar(255) DEFAULT NULL COMMENT '发动机',
  `car_type` varchar(255) DEFAULT NULL COMMENT '车辆类型',
  `status` int(11) DEFAULT NULL COMMENT '读取状态,0 未读 / 1 已读',
  `success` int(11) DEFAULT NULL COMMENT '读取成功状态 0 爬取失败 / 1 爬取成功',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `car_number` (`car_number`) 
) ENGINE=InnoDB AUTO_INCREMENT=110280 DEFAULT CHARSET=utf8;

6.2 添加唯一索引

  • 存在表时添加索引
ALTER TABLE shanghai_info ADD UNIQUE (car_number);
  • 建表时添加索引
CREATE TABLE `hunan_car` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `car_number` varchar(255) DEFAULT NULL COMMENT '车牌号',
  `vin` varchar(255) DEFAULT NULL COMMENT '车架号',
  `eng` varchar(255) DEFAULT NULL COMMENT '发动机',
  `car_type` varchar(255) DEFAULT NULL COMMENT '车辆类型',
  `status` int(11) DEFAULT NULL COMMENT '读取状态,0 未读 / 1 已读',
  `success` int(11) DEFAULT NULL COMMENT '读取成功状态 0 爬取失败 / 1 爬取成功',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `car_number`` (`car_number``) 
) ENGINE=InnoDB AUTO_INCREMENT=110280 DEFAULT CHARSET=utf8;

6.3 创建组合索引

  • 存在表时添加索引
ALTER TABLE illegal_info ADD INDEX idx_reason_money_city_id (reason,money,city_id);
  • 建表时添加索引
CREATE TABLE `illegal_info` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `illegal_code` varchar(6) DEFAULT NULL COMMENT '违章代码,截取第二个字符则为扣分,扣分为7则为12',
  `reason` varchar(300) DEFAULT NULL COMMENT '违章信息',
  `city_id` int(11) DEFAULT '0' COMMENT '城市id',
  `money` varchar(10) DEFAULT NULL COMMENT '罚款',
  PRIMARY KEY (`id`),
  KEY `idx_reason_money_city_id` (`reason`,`money`,`city_id`)
) ENGINE=InnoDB AUTO_INCREMENT=16448 DEFAULT CHARSET=utf8 COMMENT='各地违章信息扣分罚款详情表'

6.4 删除索引

ALTER TABLE shanghai_info DROP INDEX cphm;

7、以指定格式时间归类

SELECT STATUS AS '状态码', COUNT(1) AS '条数', DATE_FORMAT(updated, '%Y-%m') AS '月份' 
FROM notice_info GROUP BY STATUS, DATE_FORMAT(updated, '%Y-%m');

在这里插入图片描述

SELECT STATUS AS '状态码', COUNT(1) AS '条数', DATE_FORMAT(updated, '%Y-%m-%d') AS '日期' 
FROM notice_info GROUP BY STATUS, DATE_FORMAT(updated, '%Y-%m-%d')

在这里插入图片描述

8、有数据则修改,无则新增

  • 方法一:replace into

  replace into 会根据唯一索引或主键进行判断,如果存在则覆盖写入字段,如果不存在则新增。该方法底层是先 delete 再 insert,如果有子表依赖的话不建议使用。

REPLACE INTO demo(id,name,age) VALUES (1,''张山',19)
  • 方法二 :on duplicate key

  on duplicate key 新增时如果导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE,如果不会导致唯一值列重复的问题,则插入新行。该方法使用是要小心避免多个唯一索引的情况下使用,当出现多个唯一索引时会出现修改任意一行数据的结果。

#values(col_name)函数只是取当前插入语句中的插入值
INSERT INTO demo(id,name,age) VALUES (1,''张山',19)
ON DUPLICATE KEY UPDATE name = values(name),age = values(age);

#age = age + values(age)可起到累加作用
INSERT INTO demo(id,name,age) VALUES (1,''张山',19)
ON DUPLICATE KEY UPDATE name = values(name),age = age + values(age)

#@ageVal可起到原子性查询数据
INSERT INTO demo(id,name,age) VALUES (1,''张山',@ageVal:=19)
ON DUPLICATE KEY UPDATE name = values(name),age = age + values(age);
select @ageVal;

#当id为主键,age为唯一索引时,数据中存在id=1,age=19时,上面的语句就相当于
UPDATE demo SET name='张山' WHERE id=1 OR age=19 LIMIT 1;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值