常用sql语句(备忘)

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
简介:

1、添加一个自增ID字段

1
ALTER  TABLE  tblname  ADD  COLUMN  csmid COUNTER (0, 1)

2、删除一个字段

1
ALTER  TABLE  tblname  DROP  COLUMN  csmid

3、access创建一个有自增字段的表

1
CREATE  TABLE  tblname(id autoincrement, sname memo, ...)

4、sql server判断某个字段是否为空字符串

1
2
3
SELECT  FROM  tblname  where  fieldname!= ''
或者
SELECT  FROM  tblname  where  fieldname<> ''

5、取某一列的最大值

1
SELECT  MAX (fieldname)  from  tblname;

6、查询一个字段有哪几种取值

1
SELECT  DISTINCT  fieldname  From  tblname;

6.1、统计一个字段不同取值的数量,即有多少种取值。

1
SELECT  COUNT ( DISTINCT  fieldname)  FROM  tblname;

7、统计一个字段的几种取值,并按统计量降序排列。

1
2
3
4
SELECT  fieldname,  COUNT (*)
FROM  tblname
GROUP  BY  fieldname
ORDER  BY  COUNT (*)  DESC ;

8、统计学号相同,班级不同的学生

1
2
3
4
5
6
7
SELECT  sno,  COUNT (*)  FROM
(
SELECT  sno, sclass  FROM  students
GROUP  BY  sno, sclass
)
GROUP  BY  SNO
ORDER  BY  COUNT (*)  DESC

9、ACCESS,在students表中将name字段中含有abc的字段放在前面。其他数据库可能要将INSTR换为CHARINDEX。在access中instr从1开始计数,而不是从0开始计数。

1
2
3
SELECT  *
FROM  students
ORDER  BY  INSTR( name 'abc' DESC ;

9.1、instr函数切记注意第一个和第四个参数。(可参考这里)

10、设置和去除主键,参考这里

1
2
3
4
设置主键
ALTER  TABLE  tblname  ADD  CONSTRAINT  PrimaryKey  Primary  Key (主键字段名)
去除主键
ALTER  TABLE  tblname  DROP  CONSTRAINT  PrimaryKey

11、ACCESS从数据库A复制表A到数据库B(新建了表B)。先连上数据库A,然后

1
SELECT  INTO  tableB [ IN  'D:\B.mdb' FROM  tableA

12、ACCESS从数据库A复制表A到数据库B(追加数据到表B)。先连上数据库A,然后

1
INSERT  INTO  tableB(field1, field2) [ IN  'D:\B.mdb' SELECT  field1, field2  FROM  tableA

当表结构完全相同,合并表时可以这么写:

1
INSERT  INTO  tableB [ IN  'D:\B.mdb' SELECT  FROM  tableA

13、MySQL查询时将日期加8小时。(DATE_ADD函数)

1
SELECT  DATE_ADD(datefiled, INTERVAL 8  HOUR  FROM  tbl;

14、MySQL清除空白可查阅trim和replace函数。

15、根据关键字段去重,需用到临时表。这里主要是提供思路,需根据具体数据库得到具体sql语句。(参考这里

1
2
3
4
5
6
/*添加自增ID*/
select  identity( int ,1,1)  as  autoID, *  into  tmpTable  from  tableName
/*选出重复记录中值最小的自增ID*/
select  min (autoID)  as  autoID  into  tmpTable2  from  tmpTable  group  by  keyField1, keyField2
/*得到最终结果*/
select  from  tmpTable  where  autoID  in ( select  autoID  from  tmpTable2)

16、ADO获取SELECT COUNT(*)的结果。

1
num = rs->GetCollect(_variant_t(( long )0))

17、ADO判断字段值是否为NULL。

1
vField.vt ?= VT_NULL

18、ADO访问ACCESS的3092错误的两种可能原因。

1
2
3
4
/*  date 为保留字,应该加中括号 */
SELECT  date  FROM  tableName
/* 这个中括号按说不应该影响的 */
SELECT  COUNT (*)  FROM  tableName  WHERE  field<> '[D2037'

原来第2种问题是有说法的,解决办法见这里

19、ACCESS与外部其它数据交互 - IN子句,可参考这里

20、VC++下使用ADO访问Access数据库完整篇

21、ACCESS单引号的转义字符是单引号,也就是说如果字段值中出现单引号,需用两个单引号表示。(可参见这里

21.1、另外注意,字符串中若有nul字符,也会插入失败,这种情况比较难以排查。因为看起来的状况是,拷贝到access文件里面里能执行,而代码里不能执行。

22、SQLServer导出到excel

23、设置表的autoid字段从10开始自增,每次增1。

1
2
ALTER  TABLE  tableName
ALTER  COLUMN  [autoid] COUNTER (10, 1)

24、ACCESS得到数据库中所有表名。

1
2
SELECT  NAME  FROM  MSysObjects
WHERE  TYPE=1  AND  FLAGS=0

25、ACCESS设置字段前导0示例。

1
2
UPDATE  tblname
SET  fieldname=FORMAT(fieldname,  "00000" );

26、mysql无重复插入。(参考这里

1)、无则插入,有则忽略。

1
2
3
4
/*某些版本的mysql会有一个警告*/
INSERT  IGNORE  INTO  tblname(a,b,c)  VALUES  (1,2,3); 
/*不会有警告*/
INSERT  INTO  tblname(a,b,c)  VALUES  (1,2,3)  ON  DUPLICATE  KEY  UPDATE  c=c;

2)、无则插入,有则更新。

1
INSERT  INTO  tblname(a,b,c)  VALUES  (1,2,3)  ON  DUPLICATE  KEY  UPDATE  c=c+1;

27、mssql(SQLServer)无重复插入,注意下面两个1并不是walker抽风了。(参考这里那里

1
2
3
INSERT  INTO   tableName(keyA, keyB)  SELECT  valA, valB
  WHERE  NOT  EXISTS 
  ( SELECT  TOP  1 1  FROM  tableName  WHERE  keyA=valA  AND  keyB=valB);

28、两表相减。(in、not in、exists、not exists

1)、单字段。

1
2
3
4
5
SELECT  field  FROM  tableA
WHERE  field  NOT  IN
(
SELECT  field  FROM  tableB
)

2)、多字段。

1
2
3
4
5
6
SELECT  FROM  tableA
WHERE  NOT  EXISTS
(
SELECT  FROM  tableB 
WHERE  tableA.field1=tableB.field1  AND  tableA.field2=tableB.field2
)

29、Access跨文件连接查询。(Access 跨数据库查询和插入数据

1
2
3
4
5
SELECT  FROM  [; database =d:\A.mdb].tblA,[; database =d:\B.mdb].tblB
WHERE  tblA.fieldA=tblB.fieldB;
 
SELECT  FROM  tblA,[; database =d:\B.mdb].tblB
WHERE  tblA.fieldA=tblB.fieldB;

30、Access数据导入到SQLServer可用如下Transact-SQL语句。(参考这里

1
2
3
4
INSERT  INTO  destTable
SELECT  FROM  OPENROWSET ( 'Microsoft.Jet.OLEDB.4.0' 'D:\test\test.mdb' ; 'admin' ; '' , srcTable);
INSERT  INTO  destTable
SELECT  FROM  OPENROWSET ( 'Microsoft.ACE.OLEDB.12.0' 'D:\test\test.mdb' ; 'admin' ; '' , srcTable);

31、查找以数字打头的数据。(MySQL,正则)

1
SELECT  FROM  tableName  WHERE  fieldName REGEXP  '^[0-9]'  LIMIT 100;

32、MySQL利用存储过程执行循环语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
USE dbname;
 
DELIMITER $$   --定义结束符为$$
 
DROP  PROCEDURE  IF EXISTS test_insert;   --删除已有存储过程 
 
CREATE  PROCEDURE  test_insert()   --创建新的存储过程
     BEGIN  
     DECLARE  INT  DEFAULT  1;
     WHILE i<10  DO
         INSERT  INTO  tableName(idx)  VALUES  (i); 
         SET  i=i+1;
     END  WHILE;
     
END  $$   --结束定义语句
 
DELIMITER ;   --恢复结束符为;
 
CALL test_insert();   --调用存储过程

33、SQLite数据多表联合update。(注意:这种方式会伤害无关字段!


N、....


*** walker * Updated 2016-08-05 ***

本文转自1、添加一个自增ID字段

1
ALTER  TABLE  tblname  ADD  COLUMN  csmid COUNTER (0, 1)

2、删除一个字段

1
ALTER  TABLE  tblname  DROP  COLUMN  csmid

3、access创建一个有自增字段的表

1
CREATE  TABLE  tblname(id autoincrement, sname memo, ...)

4、sql server判断某个字段是否为空字符串

1
2
3
SELECT  FROM  tblname  where  fieldname!= ''
或者
SELECT  FROM  tblname  where  fieldname<> ''

5、取某一列的最大值

1
SELECT  MAX (fieldname)  from  tblname;

6、查询一个字段有哪几种取值

1
SELECT  DISTINCT  fieldname  From  tblname;

6.1、统计一个字段不同取值的数量,即有多少种取值。

1
SELECT  COUNT ( DISTINCT  fieldname)  FROM  tblname;

7、统计一个字段的几种取值,并按统计量降序排列。

1
2
3
4
SELECT  fieldname,  COUNT (*)
FROM  tblname
GROUP  BY  fieldname
ORDER  BY  COUNT (*)  DESC ;

8、统计学号相同,班级不同的学生

1
2
3
4
5
6
7
SELECT  sno,  COUNT (*)  FROM
(
SELECT  sno, sclass  FROM  students
GROUP  BY  sno, sclass
)
GROUP  BY  SNO
ORDER  BY  COUNT (*)  DESC

9、ACCESS,在students表中将name字段中含有abc的字段放在前面。其他数据库可能要将INSTR换为CHARINDEX。在access中instr从1开始计数,而不是从0开始计数。

1
2
3
SELECT  *
FROM  students
ORDER  BY  INSTR( name 'abc' DESC ;

9.1、instr函数切记注意第一个和第四个参数。(可参考这里)

10、设置和去除主键,参考这里

1
2
3
4
设置主键
ALTER  TABLE  tblname  ADD  CONSTRAINT  PrimaryKey  Primary  Key (主键字段名)
去除主键
ALTER  TABLE  tblname  DROP  CONSTRAINT  PrimaryKey

11、ACCESS从数据库A复制表A到数据库B(新建了表B)。先连上数据库A,然后

1
SELECT  INTO  tableB [ IN  'D:\B.mdb' FROM  tableA

12、ACCESS从数据库A复制表A到数据库B(追加数据到表B)。先连上数据库A,然后

1
INSERT  INTO  tableB(field1, field2) [ IN  'D:\B.mdb' SELECT  field1, field2  FROM  tableA

当表结构完全相同,合并表时可以这么写:

1
INSERT  INTO  tableB [ IN  'D:\B.mdb' SELECT  FROM  tableA

13、MySQL查询时将日期加8小时。(DATE_ADD函数)

1
SELECT  DATE_ADD(datefiled, INTERVAL 8  HOUR  FROM  tbl;

14、MySQL清除空白可查阅trim和replace函数。

15、根据关键字段去重,需用到临时表。这里主要是提供思路,需根据具体数据库得到具体sql语句。(参考这里

1
2
3
4
5
6
/*添加自增ID*/
select  identity( int ,1,1)  as  autoID, *  into  tmpTable  from  tableName
/*选出重复记录中值最小的自增ID*/
select  min (autoID)  as  autoID  into  tmpTable2  from  tmpTable  group  by  keyField1, keyField2
/*得到最终结果*/
select  from  tmpTable  where  autoID  in ( select  autoID  from  tmpTable2)

16、ADO获取SELECT COUNT(*)的结果。

1
num = rs->GetCollect(_variant_t(( long )0))

17、ADO判断字段值是否为NULL。

1
vField.vt ?= VT_NULL

18、ADO访问ACCESS的3092错误的两种可能原因。

1
2
3
4
/*  date 为保留字,应该加中括号 */
SELECT  date  FROM  tableName
/* 这个中括号按说不应该影响的 */
SELECT  COUNT (*)  FROM  tableName  WHERE  field<> '[D2037'

原来第2种问题是有说法的,解决办法见这里

19、ACCESS与外部其它数据交互 - IN子句,可参考这里

20、VC++下使用ADO访问Access数据库完整篇

21、ACCESS单引号的转义字符是单引号,也就是说如果字段值中出现单引号,需用两个单引号表示。(可参见这里

21.1、另外注意,字符串中若有nul字符,也会插入失败,这种情况比较难以排查。因为看起来的状况是,拷贝到access文件里面里能执行,而代码里不能执行。

22、SQLServer导出到excel

23、设置表的autoid字段从10开始自增,每次增1。

1
2
ALTER  TABLE  tableName
ALTER  COLUMN  [autoid] COUNTER (10, 1)

24、ACCESS得到数据库中所有表名。

1
2
SELECT  NAME  FROM  MSysObjects
WHERE  TYPE=1  AND  FLAGS=0

25、ACCESS设置字段前导0示例。

1
2
UPDATE  tblname
SET  fieldname=FORMAT(fieldname,  "00000" );

26、mysql无重复插入。(参考这里

1)、无则插入,有则忽略。

1
2
3
4
/*某些版本的mysql会有一个警告*/
INSERT  IGNORE  INTO  tblname(a,b,c)  VALUES  (1,2,3); 
/*不会有警告*/
INSERT  INTO  tblname(a,b,c)  VALUES  (1,2,3)  ON  DUPLICATE  KEY  UPDATE  c=c;

2)、无则插入,有则更新。

1
INSERT  INTO  tblname(a,b,c)  VALUES  (1,2,3)  ON  DUPLICATE  KEY  UPDATE  c=c+1;

27、mssql(SQLServer)无重复插入,注意下面两个1并不是walker抽风了。(参考这里那里

1
2
3
INSERT  INTO   tableName(keyA, keyB)  SELECT  valA, valB
  WHERE  NOT  EXISTS 
  ( SELECT  TOP  1 1  FROM  tableName  WHERE  keyA=valA  AND  keyB=valB);

28、两表相减。(in、not in、exists、not exists

1)、单字段。

1
2
3
4
5
SELECT  field  FROM  tableA
WHERE  field  NOT  IN
(
SELECT  field  FROM  tableB
)

2)、多字段。

1
2
3
4
5
6
SELECT  FROM  tableA
WHERE  NOT  EXISTS
(
SELECT  FROM  tableB 
WHERE  tableA.field1=tableB.field1  AND  tableA.field2=tableB.field2
)

29、Access跨文件连接查询。(Access 跨数据库查询和插入数据

1
2
3
4
5
SELECT  FROM  [; database =d:\A.mdb].tblA,[; database =d:\B.mdb].tblB
WHERE  tblA.fieldA=tblB.fieldB;
 
SELECT  FROM  tblA,[; database =d:\B.mdb].tblB
WHERE  tblA.fieldA=tblB.fieldB;

30、Access数据导入到SQLServer可用如下Transact-SQL语句。(参考这里

1
2
3
4
INSERT  INTO  destTable
SELECT  FROM  OPENROWSET ( 'Microsoft.Jet.OLEDB.4.0' 'D:\test\test.mdb' ; 'admin' ; '' , srcTable);
INSERT  INTO  destTable
SELECT  FROM  OPENROWSET ( 'Microsoft.ACE.OLEDB.12.0' 'D:\test\test.mdb' ; 'admin' ; '' , srcTable);

31、查找以数字打头的数据。(MySQL,正则)

1
SELECT  FROM  tableName  WHERE  fieldName REGEXP  '^[0-9]'  LIMIT 100;

32、MySQL利用存储过程执行循环语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
USE dbname;
 
DELIMITER $$   --定义结束符为$$
 
DROP  PROCEDURE  IF EXISTS test_insert;   --删除已有存储过程 
 
CREATE  PROCEDURE  test_insert()   --创建新的存储过程
     BEGIN  
     DECLARE  INT  DEFAULT  1;
     WHILE i<10  DO
         INSERT  INTO  tableName(idx)  VALUES  (i); 
         SET  i=i+1;
     END  WHILE;
     
END  $$   --结束定义语句
 
DELIMITER ;   --恢复结束符为;
 
CALL test_insert();   --调用存储过程

33、SQLite数据多表联合update。(注意:这种方式会伤害无关字段!


N、....


*** walker * Updated 2016-08-05 ***

本文转自walker snapshot博客51CTO博客,原文链接http://blog.51cto.com/walkerqt/1149535如需转载请自行联系原作者


RQSLT

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL XML Oracle
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
396 0
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
|
26天前
|
SQL Oracle 关系型数据库
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
32 0
|
SQL 存储 缓存
一文搞懂MySQL中一条SQL语句是如何执行的
一文搞懂MySQL中一条SQL语句是如何执行的
|
9月前
|
SQL 存储 关系型数据库
MySQL的第一篇文章——了解数据库、简单的SQL语句
MySQL的第一篇文章——了解数据库、简单的SQL语句
|
SQL Python
Pandas与SQL的数据操作语句对照
Pandas与SQL的数据操作语句对照
122 0
Pandas与SQL的数据操作语句对照
|
SQL 数据库 Python
Python 数据库Insert语句脚本生成工具(SQL Server)
Python 数据库Insert语句脚本生成工具(SQL Server)
335 0
Python 数据库Insert语句脚本生成工具(SQL Server)
|
SQL 程序员 开发工具
【Sql Server】基础之分组查询重复出现多条记录的SQL语句,以及group by和having、min函数运用
基础之分组查询重复出现多条记录的SQL语句,以及group by和having、min函数运用
476 0
【Sql Server】基础之分组查询重复出现多条记录的SQL语句,以及group by和having、min函数运用
SQL 查询表中每门课程成绩最好的前n名学生 优于group by语句的方法
SQL 查询表中每门课程成绩最好的前n名学生 优于group by语句的方法
SQL 查询表中每门课程成绩最好的前n名学生 优于group by语句的方法
|
SQL 数据库 数据安全/隐私保护
使用SQL语句 查询电话号码 加密显示
使用SQL语句 查询电话号码 加密显示
190 0
使用SQL语句 查询电话号码 加密显示
|
SQL 存储 安全
MYSQL数据库初窥门径, SQL语句地熟练使用, 图形化界面提高效率
MYSQL数据库初窥门径, SQL语句地熟练使用, 图形化界面提高效率
MYSQL数据库初窥门径, SQL语句地熟练使用, 图形化界面提高效率