关闭

sql语句备忘录

时间: 2019-07-03阅读: 801标签: sql
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

添加一个自增ID字段
ALTER TABLE tblname ADD COLUMN csmid COUNTER (0, 1)

access 创建一个有自增字段的表
CREATE TABLE tblname(id autoincrement, sname memo, ...)

删除一个字段
ALTER TABLE tblname DROP COLUMN csmid

sql server判断某个字段是否为空字符串
SELECT * FROM tblname where fieldname!=''
# OR
SELECT * FROM tblname where fieldname<>''

取某一列的最大值
SELECT MAX(fieldname) from tblname;

查询一个字段有哪几种取值
SELECT DISTINCT fieldname From tblname;

统计一个字段不同取值的数量,即有多少种取值。
SELECT COUNT(DISTINCT fieldname) FROM tblname;

统计一个字段的几种取值,并按统计量降序排列。
SELECT fieldname, COUNT(*)
FROM tblname
GROUP BY fieldname
ORDER BY COUNT(*) DESC;

统计学号相同,班级不同的学生
SELECT sno, COUNT(*) FROM
(
SELECT sno, sclass FROM students
GROUP BY sno, sclass
)
GROUP BY SNO
ORDER BY COUNT(*) DESC

ACCESS,在students表中将name字段中含有abc的字段放在前面。其他数据库可能要将INSTR换为CHARINDEX。在access中instr从1开始计数,而不是从0开始计数。
SELECT *
FROM students
ORDER BY INSTR(name, 'abc') DESC;

Access 的 instr 函数切记注意第一个和第四个参数。(可参考这里)设置和去除主键,参考这里
# 设置主键
ALTER TABLE tblname ADD constRAINT PrimaryKey Primary Key(主键字段名)
# 去除主键
ALTER TABLE tblname DROP constRAINT PrimaryKey

ACCESS从数据库A复制表A到数据库B(新建了表B)。先连上数据库A,然后
SELECT * INTO tableB [IN 'D:\B.mdb'] FROM tableA

ACCESS从数据库A复制表A到数据库B(追加数据到表B)。先连上数据库A,然后
INSERT INTO tableB(field1, field2) [IN 'D:\B.mdb'] SELECT field1, field2 FROM tableA
# 当表结构完全相同,合并表时可以这么写:
INSERT INTO tableB [IN 'D:\B.mdb'] SELECT * FROM tableA

MySQL查询时将日期加8小时。(DATE_ADD函数)
SELECT DATE_ADD(datefiled, INTERVAL 8 HOUR ) FROM tbl;

MySQL清除空白可查阅 trim 和 replace 函数。根据关键字段去重,需用到临时表。这里主要是提供思路,需根据具体数据库得到具体sql语句。(参考这里)
# 添加自增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)

ADO获取SELECT COUNT(*)的结果。
num = rs->GetCollect(_variant_t((long)0))

ADO 判断字段值是否为 NULL。
vField.vt ?= VT_NULL

ADO 访问 ACCESS 的 3092 错误的两种可能原因。
# date为保留字,应该加中括号 
SELECT date FROM tableName
# 这个中括号按说不应该影响的 
SELECT COUNT(*) FROM tableName WHERE field<>'[D2037'

ACCESS与外部其它数据交互 - IN子句,可参考这里VC++下使用ADO访问Access数据库完整篇ACCESS单引号的转义字符是单引号,也就是说如果字段值中出现单引号,需用两个单引号表示。(可参考这里

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

设置表的autoid字段从10开始自增,每次增1。
ALTER TABLE tableName
ALTER COLUMN [autoid] COUNTER (10, 1)

ACCESS得到数据库中所有表名。
SELECT NAME FROM MSysObjects
WHERE TYPE=1 AND FLAGS=0

ACCESS 设置字段前导 0 示例
UPDATE tblname
SET fieldname=FORMAT(fieldname, "00000");

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

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

/*某些版本的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)、无则插入,有则更新。

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

mssql(SQLServer)无重复插入,注意下面两个1并不是walker抽风了。(参考这里和那里)
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)、单字段。

SELECT field FROM tableA
WHERE field NOT IN
(
SELECT field FROM tableB
)

2)、多字段。

SELECT * FROM tableA
WHERE NOT EXISTS
(
SELECT * FROM tableB 
WHERE tableA.field1=tableB.field1 AND tableA.field2=tableB.field2
)

Access 跨文件连接查询。(Access 跨数据库查询和插入数据
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;

Access数据导入到 SQLServer 可用如下 Transact-SQL 语句。(参考这里
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);

查找以数字打头的数据。(MySQL,正则)
SELECT * FROM tableName WHERE fieldName REGEXP '^[0-9]' LIMIT 100;

MySQL 利用存储过程执行循环语句。
USE dbname;

DELIMITER $$  # 定义结束符为$$

DROP PROCEDURE IF EXISTS test_insert;  # 删除已有存储过程 

CREATE PROCEDURE test_insert()  # 创建新的存储过程
    BEGIN  
    DECLARE i INT DEFAULT 1;
    WHILE i<10  DO
        INSERT INTO tableName(idx) VALUES (i); 
        SET i=i+1;
    END WHILE;
    
END $$  # 结束定义语句

DELIMITER ;  # 恢复结束符为;

CALL test_insert();  # 调用存储过程

SQLite数据多表联合update 注意:这种方式会伤害无关字段!
本文出自 walker snapshot


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/4478

关闭

这才是 SQL 优化的正确姿势

当然,本篇是关于性能优化的,那性能优化就应该一把梭子吗?还是要符合一些规范和原则呢?所以,在开始之前(MySQL 优化),咱们先来聊聊 性能优化 的一些原则。

websql操作类封装

由于websql操作都是异步操作,当我们为了获取到websql操作的结果之后再进行后续操作时,往往是通过回调函数来实现的,当回调一多的时候,回调地狱就出现了,为了解决回调地狱问题,我将通过Promise来改写,后续调用时

MySQL排名函数实现

现在有个需求对所有学生分数进行排名,并且列出名次。刚看到这个需求,我有点懵逼,完全没有思路:joy:,为什么难一点需求

为什么企业依赖于NoSQL

如果你关注大数据科技动向,你对 NoSQL 一定不陌生,NoSQL 是一个分布式数据库。在过去时间,数据存储一直关系型数据库天下,有着良好的控制并发操作、事务功能。

开发者必知的MySQL 8.0 新功能

下面将以 MySQL 社区的优先级从高到低来展示这些功能:MySQL 文档存储;默认 utf8mb4 编码;JSON 增强;CTEs(译者注:Common Table Expresssions 公共表格表达式)

Mysql性能优化:为什么你的count(*)这么慢?

在开发中一定会用到统计一张表的行数,比如一个交易系统,老板会让你每天生成一个报表,这些统计信息少不了sql中的count函数。但是随着记录越来越多,查询的速度会越来越慢

node.js防止Sequelize在执行查询时将SQL输出到控制台?

有没有办法得到这个不显示?一些标志,我在一个配置文件中设置某处?最佳答案创建Sequelize对象时,将false传递给logging参数:

Sql中Left Join、Right Join、Inner Join的区别?

left join(左联接) :返回包括左表中的所有记录和右表中联结字段相等的记录;right join(右联接) :返回包括右表中的所有记录和左表中联结字段相等的记录

mysqldump 备份数据库_mysqldump备份详解

数据备份是一个网站能够正常运营的保障,数据备份包括网站源码备份和数据库备份,如果你使用的是ACCESS数据库,那么直接使用FTP下载数据库文件就可以了,但如果你使用了PHP+MYSQL进行网站建设,数据库备份就没有那么容易了。

这种SQL写法会导致索引失效?

网上经常能看到一些文章总结在 mysql 中不能命中索引的各种情况,其中有一种说法就是指使用了 or 的语句都不能命中索引。这种说法其实是不够正确的,正确的结论应该是

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!