分类 SQL 下的文章

SQL查询数据库中带有某个相同字段的所有表

一,MySQL查询带有某个字段的所有表:

SELECT * FROM information_schema.columns WHERE column_name='字段名';

二,Oracle查询带有某个字段的所有表:

SELECT * FROM user_tab_columns WHERE column_name='字段名';

三,SQLServer查询带有某个字段的所有表:

SELECT * FROM [库名].[dbo].sysobjects WHERE id IN (SELECT id FROM [库名].[dbo].syscolumns WHERE name = '字段名')

注意:库名、字段名替换为对应的内容

SQL批量修改数据库表中的Unix时间戳

我接触的绝大部分PHP的Web项目,在存时间时,都是存的Unix时间戳,字段类型是int(10),显示的东西类似于1108879309这种数字。

批量修改这种Unix时间戳的MYSQL语句是:

UPDATE `table` SET addtime = unix_timestamp(DATE_SUB(from_unixtime(addtime), INTERVAL 1 MONTH)) WHERE 1

解释上面MYSQLSQL语句中涉及到的SQL函数:
1,用FROM_UNIXTIME()函数将Unix时间戳转换成 YYYY-MM-DD H:I 这种常见的格式,语法:FROM_UNIXTIME(unix_timestamp,format)
2,用DATE_SUB()函数从日期中减去指定的时间间隔,语法:DATE_SUB(date,INTERVAL expr type);如果要加上指定的时间间隔,用DATE_ADD(date,INTERVAL expr type)
DATE_SUB()DATE_ADD()函数不能直接操作Unix时间戳,所以用FROM_UNIXTIME()转换了一下
3,把Unix时间戳转换成 YYYY-MM-DD H:I 这种格式后,减去指定的时间间隔后,肯定要再转换成Unix时间戳才能更新到数据库中,用unix_timestamp()函数





阅读剩余部分

MYSQL用group by去重后,再用count计算条数

假如表数据是:

name    id
刘德华   1
张学友   2
黎明     3
杨幂     2
赵丽颖   3

现在要查出有相同id的数量,并按id顺序排列,形成如下结果:

id    num
1     1
2     2
3     2

SQL语句:

SELECT id,COUNT(*) as num FROM table WHERE 1=1 GROUP BY id ORDER BY id

无限级结构SQL查询所有下级和所有下级

Id,PId无限级结构,查询某个Id的所有下级或所有上级,使用WITH AS查询:

/*查找Id为1所有的下级*/
WITH T
AS( 
    SELECT Id,PId,Name,0 L FROM User WHERE Id=1
    UNION ALL 
    SELECT U.Id,U.PId,U.Name,L+1   
    FROM User U INNER JOIN T ON U.PId=T.Id  
) 
SELECT * FROM T

/*查找Id为100所有的上级*/
WITH T
AS( 
    SELECT Id,PId,Name,0 L FROM User WHERE Id=100
    UNION ALL 
    SELECT U.Id,U.PId,U.Name,L+1   
    FROM User U INNER JOIN T ON U.Id=T.PId  
) 
SELECT * FROM T