关于sql的一些小记录
1 关于like
like一般用于where中 可以搭配通配符使用 % _ [ ](字符串列表,匹配在其中的字符) [!] [^] (不在其中的)
2 Alias
为表或列名设置别名
3.join
Inner join 内连 将两个表的相匹配的数据输出
left join 左连 会将左表的数据完全输出 无论有没有被匹配 (左表就是被链接的那个表 table1 left join table2 table1就是左表)
right join 右连 输出所有右表的数据
full join 全连 输出所有的数据 无论在两个表中有没有相互匹配 如果没有匹配就单独输出
| LastName | FirstName | OrderNo |
|---|---|---|
| Adams | John | 2456 |
| Carter | Thomas | 7895 |
| Carter | Thomas | 4678 |
| Bush | George | |
| 4764 | ||
| 表一数据 | 表一数据 | 表二数据 |
4. union
将两个查询的结果集结合 可以在外面在套用一层sql语句 union不会输出重复的数据 想要输出重复的数据的时候可以使用 union all
select * from table1 where name like 'a%'
union
select * from table1 where name like 'b%' and sex = 1
可以连接一个表查询的数据也可以连接不同的表的数据 但是查出来的数据要求相同的列 列要有相似的数据类型 且顺序也要相同(明了一点就是吧两个结构相同但是数据不一样的表拼接在一起)
5.if 和 case when
if (判断,成立输出,不成立输出)
case when
SELECT game_name,os_type,(
case WHEN os_type = 1 THEN "IOS"
WHEN os_type = 2 THEN "Andriod"
ELSE "异常数据" END
) AS "系统" from game
这里如果想判断 null 需要注意sql数据库中null的特殊性
(case when 的一个小技巧 可以用来统计同一个字段的不同值的数量 之前想统计的时候没想到方法,后来注意到case when函数了之后想到的)
SELECT
sum( CASE WHEN os_type = 1 THEN 1 ELSE 0 END ) AS "IOS数量",
sum( CASE WHEN os_type = 2 THEN 1 ELSE 0 END ) AS "Andriod数量",
count(*) AS "总数量"
FROM
`game`
6. 排名关键字
一、ROW_NUMBER()
Row_number() 在排名是序号 连续 不重复,即使遇到表中的两个一样的数值亦是如此
select *,row_number() OVER(order by number ) as row_num from num
二、rank()
Rank() 函数会把要求排序的值相同的归为一组且每组序号一样,排序不会连续执行
select *,rank() OVER(order by number ) as row_num from num
三、dense_rank()
Dense_rank() 排序是连续的,也会把相同的值分为一组且每组排序号一样
select *,dense_rank() OVER(order by number ) as row_num from num
四、ntile()
Ntile(group_num) 将所有记录分成group_num个组,每组序号一样
select *,ntile(2) OVER(order by number ) as row_num from num
7.关于datetime字段的默认值问题
不知道是navicat的问题还是其他问题,用到datetime字段的时候不想它为null,又想给个默认值(之前一直用时间戳来记录时间的,突然用这个datetime字段),一般是用的CURRENT_TIMESTAMP,但是不知道为什么,navicat创建的时候一直报错,这里我的解决办法是先把数据库设计好,然后在navicat的sql预览中将sql保存,将datetime格式的字段修改为如下样子:
`add_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '添加时间',
再直接运行sql就好了,创建成功

浙公网安备 33010602011771号