mysql语句学习(一)

1.EXISTS 和 IN

SELECT COUNT(ca.aaa)
FROM xx ca
WHERE EXISTS(
    SELECT label.*
    FROM xxx label
    WHERE label.aaa = ca.aaa
)

SELECT COUNT(ca.aaa)
FROM xx ca
WHERE ca.aaa IN(
    SELECT label.aaa
    FROM xxx label
    WHERE label.aaa = ca.aaa
)

2.查询表结构

-- 查询指定表的字段结构
select (@i:=@i+1) i,COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_COMMENT
from information_schema.columns,(SELECT @i:=0) as i where table_schema = 'xxx' #表所在数据库
and table_name = 'xxx' ; #你要查的表

-- 查询所有表结构
select table_name,COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_COMMENT,IF(columns.COLUMN_KEY='PRI','是',NULL) AS IS_KEY
from information_schema.columns columns where table_schema = 'xxx'; #表所在数据库

-- 查询所有表名
show tables;

-- 查询所有表名和记录总数
SELECT TABLE_NAME,TABLE_COMMENT,TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='xxx';

-- 查询有url字段的表
SELECT table_name, (@i:=@i+1) i,COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_COMMENT
FROM information_schema.columns,(SELECT @i:=0) as i
WHERE table_schema = 'xxx'
AND (COLUMN_NAME LIKE '%url%' OR COLUMN_NAME LIKE '%path%' OR COLUMN_NAME LIKE '%file%');

3.按照指定字段分组,有着重复字段的多条记录中,取修改时间最新的那条记录

SELECT ca.*
FROM (select aaa, MAX(change_time) as change_time from xxx group by aaa) AS temp
LEFT JOIN xxx ca ON temp.aaa = ca.aaa AND temp.change_time = ca.change_time

4.数据库锁、线程

(1)数据库锁等待超时

java中报错:java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

先查看当前库的所有线程

show full processlist;

然后查看innodb(存储引擎)的事务表innodb_trx,看下里面是否有正在锁定的事务线程

select * from information_schema.innodb_trx;

有一个正在锁定的事务线程 trx_state:RUNNING trx_mysql_thread_id:527491,

看看ID是否在show full processlist里面的sleep线程中:

如果是,就证明这个sleep的线程事务一直没有commit或者rollback被卡住了,我们需要手动kill掉。

最后杀掉该线程

kill 527491;

information_schema数据库 INNODB_LOCKS、INNODB_TRX

SHOW VARIABLES LIKE 'innodb_lock_wait_timeout'

(2)死锁:

Deadlock found when trying to get lock; try restarting transaction

找到引起死锁的语句,然后针对语句进行优化

show engine innodb status;

5.IF函数

SELECT IF(lo.aaa=1,lo.bbb*12,lo.bbb) as rate

WHERE IF(ld.aaa!=0, lo.`bbb`=10, ld.ccc=0)

6.排序

-- DESC 降序时候默认null值排在后面、ASC升序时默认null值排在前面,可使用 IS NULL处理
-- null值放在最后
ORDER BY sort_num is null, sort_num

7.存放数字/日期的字符串字段排序

SELECT data_value
FROM xxx
ORDER BY data_value + 0 DESC;

SELECT aaa
FROM xxx
ORDER BY STR_TO_DATE(aaa, '%Y年%m月') DESC;

8.FIELD函数

对查询结果集进行指定顺序排序
ORDER BY field(p.aaa, 'ccc','bbb')

9.FIND_IN_SET函数

查询 某元素 是否存在于 集合类型的字符串
SELECT *
FROM xxx
WHERE FIND_IN_SET('auditJob', job) -- auditJob存放值:job,test

10.case...when

CASE [col_name]
WHEN [value1] THEN [result1]
WHEN [value1] THEN [result1]
ELSE [default]
END

SELECT aaa as 测试,
CASE bbb
WHEN 0 THEN '开发'
WHEN 1 THEN '产品'
ELSE '项目'
END as 运维,

11.查询结果集的序号

SELECT (@i:=@i+1) as 序号
FROM xxx, (select @i:=0) t

12.distinct

去重的统计
SELECT count(DISTINCT(aaa))
from xxx
WHERE `status`=1

13.REPLACE函数

url去掉第一个字符,并把/改成_
UPDATE xxx SET aaa = REPLACE(SUBSTRING(aaa,2), '/', '_')

UPDATE xxx SET aaa = REPLACE(aaa,'.png','-short.png');

14.GROUP_CONCAT()函数

分组后数据值的拼接(多个用,隔开,也可以指定分隔符)
SELECT GROUP_CONCAT(bbb)
FROM xxx
GROUP BY aaa

15.TRUNCATE TABLE

truncate删除整表数据(或navicat工具中:右击-截断表)

与delete不同的是:

删除后将重新水平线和索引(id从零开始)

16.设置数据包的大小

数据库对大量数据插入或者更新有限制,可以自己设置

show global variables like 'max_allowed_packet';

set global max_allowed_packet=157286400;

mysql中,in语句中参数个数是不限制的,不过对整段sql语句的长度有了限制max_allowed_packet

17.upper(str)转大写、lower(str)转小写

18.字符串连接concat函数

19.MAX、MIN函数

查询最大id,用MAX(id)

查询最小id,用MIN(id)

20.删除或更新的表和条件用的表如果一样

则条件表需起别名,删除表不能有别名

delete from xxx where id in(
    select u.id from xxx as u where u.status = 1
)

UPDATE xxx SET mobile = '110'
WHERE id in(
    SELECT temp.id
    FROM (
        SELECT u.id
        FROM xxx AS u
        where u.status = 1
    ) AS temp
);

更新 SET 自己表
UPDATE xxx t1
INNER JOIN (select * from xxx as t where t.grant_num = 1) t2 ON t1.ccc = t2.ccc
SET t1.aaa = t2.bbb;

21.COUNT函数

SELECT COUNT(vo.id)
FROM(
    SELECT ca.id
    FROM xxx ca
    LEFT JOIN xx ld ON ld.user_id = ca.user_id
    WHERE ca.status=1 AND ld.id is NULL
    GROUP BY ca.aaa
) vo

22.insert into select from

INSERT INTO `xxx`(`aaa`, `bbb`)
SELECT 1, '测试'
FROM `xx`
WHERE status= 0;

23.查询重复数据

SELECT GROUP_CONCAT(id), GROUP_CONCAT(mobile)
FROM xxx
GROUP BY mobile HAVING count(mobile)>1;

24.时间查询

近三年: date(sentiment_time) BETWEEN CURDATE() - INTERVAL 3 YEAR AND CURDATE()
近一年: date(sentiment_time) BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 YEAR) AND CURDATE()
近一周: date(sentiment_time) BETWEEN DATE_SUB(CURDATE(),INTERVAL 7 DAY) AND CURDATE()
近三天: date(sentiment_time) BETWEEN CURDATE() - INTERVAL 3 DAY AND CURDATE()
今日: date(sentiment_time) = CURDATE()

25.with as

26.联合查询

union 的查询结果不会有重复项,因为它的内部使用了一次 distinct,

而 union all 的查询结果包含重复项。

SELECT 'all' `bankTypeName`, COUNT(*) total
FROM xxx a
WHERE a.platform = 'xxx'
UNION ALL
SELECT 'bank' `bankTypeName`, COUNT(*) total
FROM xxx a
WHERE a.platform = 'xxx'
AND b.valid=1
注意:参与联合查询的各查询结果的列数必须相同,对应项的数据类型也必须相同

同时查询多张没有关联的表数据
(SELECT UNIT_TYPE, UNICODE,"NAME",'xxx' AS label from xxx)
union all
(SELECT UNIT_TYPE, UNICODE,"NAME",'xxx' AS label from xxx)
union all
(SELECT UNIT_TYPE, UNICODE,"NAME",'xxx' AS label from xxx)

列:相同数量、相似的数据类型、顺序相同。返回第一个select的列名

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 学习MySQL语句的书籍有很多,以下是几本常见且值得推荐的。 1.《MySQL必知必会》:这本书适合初学者入门,以简单易懂的语言介绍了MySQL的基本概念和语句,包括创建数据库、表格、插入、更新、删除等操作。它结构清晰,示例实用,适合希望迅速掌握MySQL语句的人阅读。 2.《高性能MySQL》:该书深入讲解MySQL的内部机制和性能优化技巧,涵盖了索引、查询优化、存储引擎、锁和事务等重要内容。对于想要深入理解MySQL并提升性能的开发者和管理员来说,这本书是非常有价值的。 3.《MySQL技术内幕:SQL编程》:该书适合对MySQL已有基础的人士,详细介绍了MySQL的内部工作原理和高级编程技巧。它包含了更复杂和高级的SQL语句用法,如子查询、连接、视图、触发器等,帮助读者更深入地理解MySQL的功能和应用。 4.《MySQL性能调优与架构设计》:这本书探讨了MySQL性能调优的方方面面,涉及了硬件选择、数据库架构设计、查询优化和索引优化等。对于需要优化大型MySQL数据库性能的开发者和运维人员来说,这是一本非常实用的指南。 总而言之,选择合适的学习MySQL语句的书籍取决于自己的水平和需求。对于初学者,建议选择简单易懂的入门书籍;而对于已有一定基础的人士,可以选择深入讲解MySQL内部机制和高级编程技巧的书籍。不论选择哪本书,坚持阅读并实践,结合实际项目经验,才能更好地掌握MySQL语句的使用和优化。 ### 回答2: 学习 MySQL 语句的书籍有很多,下面我将介绍几本值得推荐的书籍: 1. 《高性能MySQL》:这本书详细介绍了MySQL的架构、索引、查询优化、性能调优等内容,对于想要深入了解MySQL内部工作原理和提高数据库性能的人来说是一本非常不错的书籍。 2. 《MySQL必知必会》:这是一本适合初学者的MySQL入门书籍,它以简明易懂的方式介绍了MySQL的基本语法、常用命令以及创建和管理数据库的方法,非常适合初学者入门。 3. 《MySQL技术内幕:InnoDB存储引擎》:这本书深入讲解了MySQL的InnoDB存储引擎,包括其架构、并发控制、事务、锁、索引等方面的内容。对于想深入研究InnoDB存储引擎的人来说是一本非常宝贵的书籍。 4. 《MySQL性能调优与架构设计》:这本书主要介绍了MySQL的性能优化和架构设计的相关知识,包括查询优化、索引优化、硬件配置、数据库拆分等内容。对于想要提升MySQL性能和设计高可用架构的人来说是一本非常实用的指南。 以上是几本学习MySQL语句的书籍的推荐,希望对你有所帮助。当然,实践也非常重要,只有不断实践和实际应用,才能真正掌握MySQL语句的应用和技巧。 ### 回答3: 学习MySQL语句的书籍有很多,我将根据自己的经验向你推荐几本比较好的。 1.《高性能MySQL》:这本书是MySQL方面的经典著作,详细介绍了MySQL的内部原理、优化方法和调优技巧,适合有一定数据库基础的读者。 2.《MySQL必知必会》:这是一本面向初学者的入门教材,适合那些没有数据库经验的人。书中内容简洁明了,通俗易懂,详细介绍了MySQL的基本概念、语法和常用操作。 3.《MySQL技术内幕:InnoDB存储引擎》:这本书主要介绍了MySQL的核心存储引擎InnoDB的架构、原理和优化方法。对于想要深入了解MySQL内部工作原理的读者来说是一本很好的选择。 4.《MySQL性能调优与架构设计》:这本书主要介绍了MySQL性能优化的一些常用技巧和方法,包括SQL语句优化、索引优化、数据库架构设计等方面的内容。适合那些想要提升数据库性能的读者。 当然,除了以上几本书籍,还有很多其他的MySQL学习资源,比如官方文档、在线教程、博客等等,可以根据自己的实际情况选择适合自己的学习方式和资源。另外,实际动手实践也非常重要,通过实际项目或者练习来巩固和应用所学的知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值