表相关
DESC 表名 :查看表结构
SELECT * FROM 表名; 查看表内容
SELECT userid as ‘id’ FROM users; 使用as 起别名
SELECT userid * 12 as ‘id’ FROM users; 使用运算符操作列
show create table 表名:查看建表语句;
distinct 去重。
条件查询
条件查询包括常用的<,>,=,>=,<=等基本操作。注意不等于操作可以用<>,!=。这两个都是可以的。
除此之外还有一些字符串:
And,Or,Not,就是与或非操作。
特殊条件:
between a and b; 区间判断
in(a,b);
a is NULL ; 空值判断 is not null; 非空判断
Like : 模糊查询 (% 代表多个字符,_代表一个字符,\ 转义)
链接:
这里推荐leetcode 问题:组合两个表
在数据库中 链接分为6种:
交叉连接(笛卡尔链接):
SELECT * FROM A,B(,C)
或者SELECT * FROM A CROSS JOIN B (CROSS JOIN C)
没有任何关联条件,结果是笛卡尔积
内连接(常见的链接):
SELECT * SROM A,B WHERE A.id=B.id
SELECT * FROM A INNER JOIN B ON A.id=B.id
就是常见的判断链接两个表中符合条件的行的合并
外连接(分为左连接和右链接):
SELECT FirstName,LastName,City,State
FROM Person
LEFT JOIN Address
On Person.PersonId = Address.PersonId
left 左侧的表不符合条件的行也会出现在结果集中。
right 则是右侧。(这是上面leetcode题的答案)
全连接(相当于左链接和右链接的统合):
mysql不支持全连接,但是可以通过左连接和右连接的联合查询实现。
SELECT * FROM A LEFT JOIN B ON A.id=B.id UNION SELECT * FROM A RIGHT JOIN B ON A.id=B.id
联合查询(把结果集合并,只要求结果集列数相同):
上面全连接已经展示了一个联合查询的实例,UNION 后面可以添加all ,表示允许相同的结果出现,union 相当于 union unique。
leetcode 题目:第二高的薪水
排序
排序使用Order By :
Order by 列名 [asc|desc]
当有多个列名时,先执行,前面的列名排序,当相同时,再使用后面的列名进行排序。
分页查询
mysql 中使用limit 进行分页查询。limit 时mysql 特有的。
SELECT * FROM table LIMIT 5,10; // 检索记录
这里检索的时从第6条开始的十条记录,limit 接受两个参数,第一个参数是偏移量,第二个参数是检索的数目,注意,偏移量是从0开始,所以这里的5代表第6条。
特殊情况:设置第二个参数为-1,代表检索从偏移开始到结尾的所有参数。
只保留一个参数则是默认从0开始。
SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 10
SELECT * FROM articles WHERE id >= (SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10
这里介绍一下,这种结合子查询进行的分页。从效果上来看,语句一比语句二更加简洁且,效果相同,但是当偏移量到达一定程度时,建议使用第二种,因为第二种是先用子查询缩小查找范围,再用limit,分页。因为子查询是使用的索引,所以效率会快很多。而偏移值太大,则会严重降低速率。
建议分界点为100.
分组函数
Count,sum,avg,max,min.
如同字面意思,总数,综合,平均值,最大值,最小值.
这里不一一举例。
分组函数的注意事项:
-
分组函数自动忽略NULL,
对于单行处理函数,当运算式中出现NULL时,运算结果为NULL。可用ifnull来处理,ifnull(col,target).就是出现null,就用target替代。 -
分组函数不能再where中使用
-
count(*) 是统计总记录条数,count(col)是统计某个字段不为NULL的元素总数。
-
group by
group by 是根据某些条件进行分组, group by发生在where之后,group by 才能进行分组查询,这就是为什么不能在where中使用分组查询,当没有使用group by时,把整个表当成一个分组。
当分组函数结合group by 使用时只能Select与group by相关的列。
group by 后面可以跟多个字段。 -
having
having 的功能类似与where,但是他是在group by 之后运行的,所以可以处理一些where 无法处理的情况,但是where 效率更高,所以能够使用where 就尽量使用Where.