GVKun编程网logo

Mssql,Access 的 sql 经典 SQL 语句大全(sql语言access)

4

关于Mssql,Access的sql经典SQL语句大全和sql语言access的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于15000字的SQL语句大全、lnmp环境里安装mssql及m

关于Mssql,Access 的 sql 经典 SQL 语句大全sql语言access的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于15000 字的 SQL 语句大全、lnmp 环境里安装 mssql 及 mssql 的 php 扩展、lua 访问 mssql 的驱动(好用的)是哪一个?对 mysql/pgsql 的支持不错,但希望先在 mssql 能用起来、MySQ--语句大全等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

Mssql,Access 的 sql 经典 SQL 语句大全(sql语言access)

Mssql,Access 的 sql 经典 SQL 语句大全(sql语言access)

常用不常用的一些 sql 语句,对数据库操作不是很熟练的朋友可以查询。
 下列语句部分是 Mssql 语句,不可以在 access 中使用。

SQL 分类:
DDL— 数据定义语言 (CREATE,ALTER,DROP,DECLARE)
DML— 数据操纵语言 (SELECT,DELETE,UPDATE,INSERT)
DCL— 数据控制语言 (GRANT,REVOKE,COMMIT,ROLLBACK)
首先,简要介绍基础语句:
1、说明:创建 数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份 sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice ''disk'', ''testBack'', ''c:\mssql7backup\MyNwind_1.dat''
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:
删除新表:drop table tabname
6、说明:
增加一个列:Alter table tabname add column col type
注:列增加后将不能删除。DB2 中列加上后数据类型也不能改变,唯一能改变的是增加 varchar 类型的长度。
7、说明:
添加主键:Alter table tabname add primary key (col)
说明:
删除主键:Alter table tabname drop primary key (col)
8、说明:
创建索引:create [unique] index idxname on tabname (col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:
创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的 sql 语句
选择:select * from table1 where 范围
插入:insert into table1 (field1,field2) values (value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’% value1%’ ---like 的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count * as totalcount from table1
求和:select sum (field1) as sumvalue from table1
平均:select avg (field1) as avgvalue from table1
最大:select max (field1) as maxvalue from table1
最小:select min (field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接 (右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
其次,大家来看一些不错的 sql 语句
1、说明:复制表 (只复制结构,源表名:a 新表名:b) (Access 可用)
法一:select * into b from a where 1 <>1
法二:select top 0 * into b from a
2、说明:拷贝表 (拷贝数据,源表名:a 目标表名:b) (Access 可用)
insert into b(a, b, c) select d,e,f from b;
3、说明:跨数据库之间表的拷贝 (具体数据使用绝对路径) (Access 可用)
insert into b (a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in '' "&Server.MapPath (".")&"\data.mdb"&"'' where..
4、说明:子查询 (表名 1:a 表名 2:b)
select a,b,c from a where a IN (select d from b) 或者: select a,b,c from a where a IN (1,2,3)
5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
6、说明:外连接查询 (表名 1:a 表名 2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、说明:在线视图查询 (表名 1:a)
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8、说明:between 的用法,between 限制查询数据范围时包括了边界值,not between 不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值 1 and 数值 2
9、说明:in 的使用方法
select * from table1 where a [not] in (‘值 1’,’值 2’,’值 4’,’值 6’)
10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff (''minute'',f 开始时间,getdate ())>5
13、说明:一条 sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a, 表名 b where b. 主键字段 = a. 主键字段 order by a. 排序字段
14、说明:前 10 条记录
select top 10 * form table1 where 范围
15、说明:选择在每一组 b 值相同的数据中对应的 a 最大的记录的所有信息 (类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
16、说明:包括所有在 TableA 中但不在 TableB 和 TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
17、说明:随机取出 10 条数据
select top 10 * from tablename order by newid()
18、说明:随机选择记录
select newid()
19、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
20、说明:列出数据库里所有的表名
select name from sysobjects where type=''U''
21、说明:列出表里的所有的
select name from syscolumns where id=object_id(''TableName'')
22、说明:列示 type、vender、pcs 字段,以 type 字段排列,case 可以方便地实现多重选择,类似 select 中的 case。
select type,sum(case vender when ''A'' then pcs else 0 end),sum(case vender when ''C'' then pcs else 0 end),sum(case vender when ''B'' then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
23、说明:初始化表 table1
TRUNCATE TABLE table1
24、说明:选择从 10 到 15 的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
随机选择数据库记录的方法(使用 Randomize 函数,通过 SQL 语句实现)
对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求 ASP “找个随机数” 然后打印出来。实际上常见的解决方案是建立如下所示的循环:
Randomize
RNumber = Int(Rnd*499) +1

While Not objRec.EOF
If objRec("ID") = RNumber THEN
... 这里是执行脚本 ...
end if
objRec.MoveNext
Wend
这很容易理解。首先,你取出 1 到 500 范围之内的一个随机数(假设 500 就是数据库内记录的总数)。然后,你遍历每一记录来测试 ID 的值、检查其是否匹配 RNumber。满足条件的话就执行由 THEN 关键字开始的那一块代码。假如你的 RNumber 等于 495,那么要循环一遍数据库花的时间可就长了。虽然 500 这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?
采用 SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的 recordset,如下所示:
Randomize
RNumber = Int(Rnd*499) + 1

SQL = "SELECT * FROM Customers WHERE ID = " & RNumber

set objRec = ObjConn.Execute(SQL)
Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")
不必写出 RNumber 和 ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作 “随机” 记录。Recordset 没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
再谈随机数
现在你下定决心要榨干 Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准 Random 示例扩展一下就可以用 SQL 应对上面两种情况了。
为了取出几条随机选择的记录并存放在同一 recordset 内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3
假如你想选出 10 条记录(也许是每次页面装载时的 10 条链接的列表),你可以用 BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的 ID 是自动生成的号码):
SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"
注意:以上代码的执行目的不是检查数据库内是否有 9 条并发记录。
随机读取若干条记录,测试过
Access 语法:SELECT top 10 * From 表名 ORDER BY Rnd (id)
Sql server:select top n * from 表名 order by newid ()
mysql select * From 表名 Order By rand () Limit n
Access 左连接语法 (最近 开发要用左连接,Access 帮助什么都没有,网上没有 Access 的 SQL 说明,只有自己测试,现在记下以备后查)
语法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
使用 SQL 语句 用... 代替过长的字符串显示
语法:
SQL 数据库:select case when len (field) >10 then left (field,10)+''...'' else field end as news_name,news_id from tablename
Access 数据库:SELECT iif (len (field) >2,left (field,2)+''...'',field) FROM tablename;
Conn.Execute 说明
Execute 方法
该方法用于执行 SQL 语句。根据 SQL 语句执行后是否返回记录集,该方法的使用格式分为以下两种:
1.执行 SQL 查询语句时,将返回查询得到的记录集。用法为:
Set 对象变量名 = 连接对象.Execute ("SQL 查询语言")
Execute 方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过 Set 方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。
2.执行 SQL 的操作性语言时,没有记录集的返回。此时用法为:
连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]
・RecordAffected 为可选项,此出可放置一个变量,SQL 语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道 SQL 语句队多少条记录进行了操作。
・Option 可选项,该参数的取值通常为 adCMDText,它用于告诉 ADO,应该将 Execute 方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。
・BeginTrans、RollbackTrans、CommitTrans 方法
这三个方法是连接对象提供的用于事务处理的方法。BeginTrans 用于开始一个事物;RollbackTrans 用于回滚事务;CommitTrans 用于提交所有的事务处理结果,即确认事务的处理。
事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
BeginTrans 和 CommitTrans 用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的 Error 集合来实现,若 Error 集合的成员个数不为 0,则说明有错误发生,事务处理失败。Error 集合中的每一个 Error 对象,代表一个错误信息。
SQL 语句大全精要
2006/10/26 13:46
DELETE 语句
DELETE 语句:用于创建一个删除查询,可从列在 FROM 子句之中的一个或多个表中删除记录,且该子句满足 WHERE 子句中的条件,可以使用 DELETE 删除多个记录。
语法:DELETE [table.*] FROM table WHERE criteria
语法:DELETE * FROM table WHERE criteria='' 查询的字''
说明:table 参数用于指定从其中删除记录的表的名称。
criteria 参数为一个表达式,用于指定哪些记录应该被删除的表达式。
可以使用 Execute 方法与一个 DROP 语句从数据库中放弃整个表。不过,若用这种方法删除表,将会失去表的结构。不同的是当使用 DELETE,只有数据会被删除;表的结构以及表的所有属性仍然保留,例如字段属性及索引。

UPDATE
有关 UPDATE,急!!!!!!!!!!!
在 ORACLE 数据库中
表 A (ID ,FIRSTNAME,LASTNAME)
表 B (ID,LASTNAME)
表 A 中原来 ID,FIRSTNAME 两个字段的数据是完整的
表 B 中原来 ID,LASTNAME 两个字段的数据是完整的
现在要把表 B 中的 LASTNAME 字段的相应的数据填入到 A 表中 LASTNAME 相应的位置。两个表中的 ID 字段是相互关联的。
先谢谢了!!!!
update a set a.lastname=(select b.lastname from b where a.id=b.id)

掌握 SQL 四条最基本的数据操作语句:Insert,Select,Update 和 Delete。
练掌握 SQL 是数据库用户的宝贵财 富。在本文中,我们将引导你掌握四条最基本的数据操作语句 —SQL 的核心功能 — 来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学习后,显然你已经开始算是精通 SQL 了。
在我们开始之前,先使用 CREATE TABLE 语句来创建一个表(如图 1 所示)。DDL 语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理,这是因为 DDL 语句并不处理数据库中实际的数据。这些工作由另一类 SQL 语句 — 数据操作语言(DML)语句进行处理。
SQL 中有四种基本的 DML 操作:INSERT,SELECT,UPDATE 和 DELETE。由于这是大多数 SQL 用户经常用到的,我们有必要在此对它们进行一一说明。在图 1 中我们给出了一个名为 EMPLOYEES 的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表,我们在后面的例子中将要用到它。


原文链接: http://www.cnblogs.com/hnyei/archive/2012/02/24/2367012.html

15000 字的 SQL 语句大全

15000 字的 SQL 语句大全

点击上方蓝色字体,选择“标星公众号


        
        
        

优质文章,第一时间送达

关注公众号后台回复paymall获取实战项目资料视频

       
               
               
               

点击此链接:一套的SpringCloud版聚合支付项目,资料文档教程齐全

作者:IT苦行僧

来源:cnblogs.com/liuqifeng/p/9148831.html

一、基础

1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice ''disk'', ''testBack'', ''c:\mssql7backup\MyNwind_1.dat''
--- 开始 备份
BACKUP DATABASE pubs TO testBack 
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表: 
A:create table tab_new like tab_old (使用旧表创建新表)
Bcreate table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表
drop table tabname 
6、说明:增加一个列
Alter table tabname add column col type
:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键:Alter table tabname add primary key(col) 
说明:删除主键:Alter table tabname drop primary key(col) 
8、说明:创建索引:create [unique] index idxname on tabname(col….) 
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname

搜索公纵号:MarkerHub,关注回复[ vue ]获取前后端入门教程

10、说明:几个简单的基本的sql语句

选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1

11、说明:几个高级查询运算词
A:UNION 运算符 
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 
B:EXCEPT 运算符 

EXCEPT运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

C:INTERSECT 运算符

INTERSECT运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 
注:使用运算词的几个查询结果行必须是一致的。 
12、说明:使用外连接 
A、left (outer) join: 
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right (outer) join: 
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 
C:full/cross (outer) join: 
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
12、分组:Group by:
一张表,一旦分组 完成后,查询后只能得到组相关的信息。
组相关的信息:(统计信息) count,sum,max,min,avg  分组的标准)
在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据
在selecte统计函数中的字段,不能和普通的字段放在一起;

 

13、对数据库进行操作:


分离数据库 sp_detach_db;

附加数据库sp_attach_db 后接表明,附加需要完整的路径名


14.如何修改数据库的名称:

sp_renamedb ''old_name'', ''new_name''

 

二、提升

 

1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)


法一:select * into b from a where 1<>1(仅用于SQlServer)

法二:select top 0 * into b from a

2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)

insert into b(a, b, c) select d,e,f from b;

 

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)

insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in ''"&Server.MapPath(".")&"\data.mdb" &"'' where..

 

4、说明:子查询(表名1:a 表名2:b)

select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

 

5、说明:显示文章、提交人和最后回复时间

select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

 

6、说明:外连接查询(表名1:a 表名2:b)

select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

 

7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;

 

8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括

select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2

 

9、说明:in 的使用方法

select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

 

10、说明:两张关联表,删除主表中已经在副表中没有的信息 

delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

 

11、说明:四表联查问题:

select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

 

12、说明:日程安排提前五分钟提醒 

SQL: select * from 日程安排 where datediff(''minute'',f开始时间,getdate())>5

 

13、说明:一条sql 语句搞定数据库分页


select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段


具体实现:关于数据库分页:


declare @start int,@end int
  @sql  nvarchar(600)
  set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’
  exec sp_executesql @sql

 

注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引)

 

14、说明:前10条记录


select top 10 * form table1 where 范围

 

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)

select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

 

16、说明:包括所有在 TableA中但不在 TableB和TableC中的行并消除所有重复行而派生出一个结果表

(select a from tableA ) except (select a from tableB) except (select a from tableC)

 

17、说明:随机取出10条数据

select top 10 * from tablename order by newid()

 

18、说明:随机选择记录

select newid()

 

19、说明:删除重复记录


1) delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)


2) select distinct * into temp from tablename
  delete from tablename
  insert into tablename select * from temp

评价:这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段

 

alter table tablename
--添加一个自增列
add  column_b int identity(1,1)
 delete from tablename where column_b not in(
select max(column_b) from tablename group by column1,column2,...)
alter table tablename drop column column_b

 

20、说明:列出数据库里所有的表名

select name from sysobjects where type=''U'' // U代表用户

 

21、说明:列出表里的所有的列名

select name from syscolumns where id=object_id(''TableName'')

 

22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。

select type,sum(case vender when ''A'' then pcs else 0 end),sum(case vender when ''C'' then pcs else 0 end),sum(case vender when ''B'' then pcs else 0 end) FROM tablename group by type

显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3

 

23、说明:初始化表table1

 

TRUNCATE TABLE table1

 

24、说明:选择从10到15的记录

select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

 

三、技巧

 

1、1=1,1=2的使用,在SQL语句组合时用的较多

 

“where 1=1” 是表示选择全部    “where 1=2”全部不选,
如:
if @strWhere !='''' 
begin
set @strSQL = ''select count(*) as Total from ['' + @tblName + ''] where '' + @strWhere
end
else 
begin
set @strSQL = ''select count(*) as Total from ['' + @tblName + '']'' 
end

 

我们可以直接写成

 

set @strSQL = ''select count(*) as Total from ['' + @tblName + ''] where 1=1 安定 ''+ @strWhere 


2、收缩数据库


--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE

 

3、压缩数据库


dbcc shrinkdatabase(dbname)

 

4、转移数据库给新用户以已存在用户权限


exec sp_change_users_login ''update_one'',''newname'',''oldname''
go

 

5、检查备份集
RESTORE VERIFYONLY from disk=''E:\dvbbs.bak''

 

6、修复数据库


ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB(''dvbbs'',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO

 

7、日志清除


SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
 @MaxMinutes INT,
 @NewSize INT

 

USE tablename -- 要操作的数据库名
SELECT  @LogicalFileName = ''tablename_log'', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
 @NewSize = 1  -- 你想设定的日志文件的大小(M)

 

Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size 
 FROM sysfiles
 WHERE name = @LogicalFileName
SELECT ''Original Size of '' + db_name() + '' LOG is '' + 
 CONVERT(VARCHAR(30),@OriginalSize) + '' 8K pages or '' + 
 CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + ''MB''
 FROM sysfiles
 WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
 (DummyColumn char (8000) not null)

 

DECLARE @Counter    INT,
 @StartTime DATETIME,
 @TruncLog   VARCHAR(255)
SELECT @StartTime = GETDATE(),
 @TruncLog = ''BACKUP LOG '' + db_name() + '' WITH TRUNCATE_ONLY''

 

DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
 AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  
 AND (@OriginalSize * 8 /1024) > @NewSize  
 BEGIN -- Outer loop.
SELECT @Counter = 0
 WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
 BEGIN -- update
 INSERT DummyTrans VALUES (''Fill Log'') DELETE DummyTrans
 SELECT @Counter = @Counter + 1
 END
 EXEC (@TruncLog)  
 END
SELECT ''Final Size of '' + db_name() + '' LOG is '' +
 CONVERT(VARCHAR(30),size) + '' 8K pages or '' + 
 CONVERT(VARCHAR(30),(size*8/1024)) + ''MB''
 FROM sysfiles 
 WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF

 

8、说明:更改某个表


exec sp_changeobjectowner ''tablename'',''dbo''

 

9、存储更改全部表

 

CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS

 

DECLARE @Name    as NVARCHAR(128)
DECLARE @Owner   as NVARCHAR(128)
DECLARE @OwnerName   as NVARCHAR(128)

 

DECLARE curObject CURSOR FOR 
select ''Name''    = name,
   ''Owner''    = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name

 

OPEN   curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN     
if @Owner=@OldOwner 
begin
   set @OwnerName = @OldOwner + ''.'' + rtrim(@Name)
   exec sp_changeobjectowner @OwnerName, @NewOwner
end
-- select @name,@NewOwner,@OldOwner

 

FETCH NEXT FROM curObject INTO @Name, @Owner
END

 

close curObject
deallocate curObject
GO

 

10、SQL SERVER中直接循环写入数据


declare @i int
set @i=1
while @i<30
begin
    insert into test (userid) values(@i)
    set @i=@i+1
end

案例


有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:
Name   scor
Zhangshan 80
Lishi 59
Wangwu 50
Songquan 69
while((select min(score) from tb_table)<60)  

begin

update tb_table set score =score*1.01

where score<60

if  (select min(score) from tb_table)>60

  break

 else

    continue

end


数据开发-经典

 

1.按姓氏笔画排序:


Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多

 

2.数据库加密:


select encrypt(''原始密码'')
select pwdencrypt(''原始密码'')
select pwdcompare(''原始密码'',''加密后密码'') = 1--相同;否则不相同 encrypt(''原始密码'')
select pwdencrypt(''原始密码'')
select pwdcompare(''原始密码'',''加密后密码'') = 1--相同;否则不相同

 

3.取回表中字段:

declare @list varchar(1000),
@sql nvarchar(1000) 
select @list=@list+'',''+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name=''表A''
set @sql=''select ''+right(@list,len(@list)-1)+'' from 表A'' 
exec (@sql)

 

4.查看硬盘分区:

EXEC master..xp_fixeddrives

 

5.比较A,B表是否相等:

if (select checksum_agg(binary_checksum(*)) from A)
     =
    (select checksum_agg(binary_checksum(*)) from B)
print ''相等''
else
print ''不相等''

 

6.杀掉所有的事件探察器进程:

DECLARE hcforeach CURSOR GLOBAL FOR SELECT ''kill ''+RTRIM(spid) FROM master.dbo.sysprocesses
WHERE program_name IN(''SQL profiler'',N''SQL 事件探查器'')
EXEC sp_msforeach_worker ''?''

 

7.记录搜索:


开头到N条记录Select Top N * From 表

-------------------------------
NM条记录(要有主索引ID)
Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID   Desc
----------------------------------
N到结尾记录Select Top N * From 表 Order by ID Desc
案例例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句, 找出表的第31到第40个记录。

 

 select top 10 recid from A where recid not  in(select top 30 recid from A)

 

分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。

 

select top 10 recid from A where……是从索引中查找,而后面的select top 30 recid from A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。

 

解决方案

 

1,用order by select top 30 recid from A order by ricid 如果该字段不是自增长,就会出现问题

 

2,在那个子查询中也加条件:select top 30 recid from A where recid>-1

 

例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。
set @s = ''select top 1 * from T   where pid not in (select top '' + str(@count-1) + '' pid  from  T)''

 

print @s      exec  sp_executesql  @s

 

9:获取当前数据库中的所有用户表


select Name from sysobjects where xtype=''u'' and status>=0

 

10:获取某一个表的所有字段


select name from syscolumns where id=object_id(''表名'')

 

select name from syscolumns where id in (select id from sysobjects where type = ''u'' and name = ''表名'')

 

两种方式的效果相同

 

11:查看与某一个表相关的视图、存储过程、函数


select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like ''%表名%''

 

12:查看当前数据库中所有存储过程


select name as 存储过程名称 from sysobjects where xtype=''P''

 

13:查询用户创建的所有数据库


select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name=''sa'')
或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01

 

14:查询某一个表的字段和数据类型


select column_name,data_type from information_schema.columns
where table_name = ''表名''

 

15:不同服务器数据库之间的数据操作


--创建链接服务器

exec sp_addlinkedserver ''ITSV '', '' '', ''SQLOLEDB '', ''远程服务器名或ip地址 ''

exec sp_addlinkedsrvlogin ''ITSV '', ''false '',null, ''用户名 '', ''密码 ''

--查询示例

select * from ITSV.数据库名.dbo.表名

--导入示例

select * into 表 from ITSV.数据库名.dbo.表名

--以后不再使用时删除链接服务器

exec sp_dropserver ''ITSV '', ''droplogins ''

--连接远程/局域网数据(openrowset/openquery/opendatasource)

--1、openrowset

--查询示例

select * from openrowset( ''SQLOLEDB '', ''sql服务器名 ''; ''用户名 ''; ''密码 '',数据库名.dbo.表名)

--生成本地表

select * into 表 from openrowset( ''SQLOLEDB '', ''sql服务器名 ''; ''用户名 ''; ''密码 '',数据库名.dbo.表名)

--把本地表导入远程表

insert openrowset( ''SQLOLEDB '', ''sql服务器名 ''; ''用户名 ''; ''密码 '',数据库名.dbo.表名)

select *from 本地表

--更新本地表

update b

set b.列A=a.列A

 from openrowset( ''SQLOLEDB '', ''sql服务器名 ''; ''用户名 ''; ''密码 '',数据库名.dbo.表名)as a inner join 本地表 b

on a.column1=b.column1

--openquery用法需要创建一个连接

--首先创建一个连接创建链接服务器

exec sp_addlinkedserver ''ITSV '', '' '', ''SQLOLEDB '', ''远程服务器名或ip地址 ''

--查询

select * FROM openquery(ITSV, ''SELECT * FROM 数据库.dbo.表名 '')

--把本地表导入远程表

insert openquery(ITSV, ''SELECT * FROM 数据库.dbo.表名 '')

select * from 本地表

--更新本地表

update b set b.列B=a.列B FROM openquery(ITSV, ''SELECT * FROM 数据库.dbo.表名 '') as a inner join 本地表 b on a.列A=b.列A

--3、opendatasource/openrowset

SELECT   * FROM   opendatasource( ''SQLOLEDB '', ''Data Source=ip/ServerName;User ID=登陆名;Password=密码 '' ).test.dbo.roy_ta

--把本地表导入远程表

insert opendatasource( ''SQLOLEDB '', ''Data Source=ip/ServerName;User ID=登陆名;Password=密码 '').数据库.dbo.表名

select * from 本地表

 

SQL Server基本函数

 

SQL Server基本函数

 

1.字符串函数 长度与分析用


1,datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格

2,substring(expression,start,length) 取子串,字符串的下标是从“1”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度

3,right(char_expr,int_expr) 返回字符串右边第int_expr个字符,还用left于之相反

4,isnull( check_expression , replacement_value )如果check_expression為空,則返回replacement_value的值,不為空,就返回check_expression字符操作类

5,Sp_addtype自定義數據類型
例如:
EXEC sp_addtype birthday, datetime, ''NULL''

6,set nocount {on|off}

使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。


SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。
SET NOCOUNT 为 OFF 时,返回计数


常识

 

在SQL查询中:from后最多可以跟多少张表或视图:256

SQL语句中出现 Order by,查询时,先排序,后取

SQL中,一个字段的最大容量是8000,而对于nvarchar(4000),由于nvarchar是Unicode码。 

       

SQLServer2000同步复制技术实现步骤


一、 预备工作


1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户

--管理工具

--计算机管理

--用户和组

--右键用户

--新建用户

--建立一个隶属于administrator组的登陆windows的用户(SynUser)


2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:

我的电脑--D:\ 新建一个目录,名为: PUB

--右键这个新建的目录

--属性--共享

--选择"共享该文件夹"

--通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户(SynUser) 具有对该文件夹的所有权限

--确定


3.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)

开始--程序--管理工具--服务

--右键SQLSERVERAGENT

--属性--登陆--选择"此账户"

--输入或者选择第一步中创建的windows登录用户名(SynUser)

--"密码"中输入该用户的密码


4.设置SQL Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)

企业管理器

--右键SQL实例--属性

--安全性--身份验证

--选择"SQL Server 和 Windows"

--确定


5.在发布服务器和订阅服务器上互相注册

企业管理器

--右键SQL Server组

--新建SQL Server注册...

--下一步--可用的服务器中,输入你要注册的远程服务器名 --添加

--下一步--连接使用,选择第二个"SQL Server身份验证"

--下一步--输入用户名和密码(SynUser)

--下一步--选择SQL Server组,也可以创建一个新组

--下一步--完成


6.对于只能用IP,不能用计算机名的,为其注册服务器别名(此步在实施中没用到)

(在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)

开始--程序--Microsoft SQL Server--客户端网络实用工具

--别名--添加

--网络库选择"tcp/ip"--服务器别名输入SQL服务器名

--连接参数--服务器名称中输入SQL服务器ip地址

--如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号


二、 正式配置


1、配置发布服务器


打开企业管理器,在发布服务器(B、C、D)上执行以下步骤:

(1) 从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导

(2) [下一步] 选择分发服务器 可以选择把发布服务器自己作为分发服务器或者其他sql的服务器(选择自己)

(3) [下一步] 设置快照文件夹

采用默认\\servername\Pub

(4) [下一步] 自定义配置

可以选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置

否,使用下列默认设置(推荐)

(5) [下一步] 设置分发数据库名称和位置 采用默认值

(6) [下一步] 启用发布服务器 选择作为发布的服务器

(7) [下一步] 选择需要发布的数据库和发布类型

(8) [下一步] 选择注册订阅服务器

(9) [下一步] 完成配置


2、创建出版物


发布服务器B、C、D上

(1)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令

(2)选择要创建出版物的数据库,然后单击[创建发布]

(3)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)

(4)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,

SQLSERVER允许在不同的数据库如 orACLE或ACCESS之间进行数据复制。

但是在这里我们选择运行"SQL SERVER 2000"的数据库服务器

(5)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表

注意: 如果前面选择了事务发布 则再这一步中只能选择带有主键的表

(6)选择发布名称和描述

(7)自定义发布属性 向导提供的选择:

是 我将自定义数据筛选,启用匿名订阅和或其他自定义属性

否 根据指定方式创建发布 (建议采用自定义的方式)

(8)[下一步] 选择筛选发布的方式

(9)[下一步] 可以选择是否允许匿名订阅

1)如果选择署名订阅,则需要在发布服务器上添加订阅服务器

方法: [工具]->[复制]->[配置发布、订阅服务器和分发的属性]->[订阅服务器] 中添加

否则在订阅服务器上请求订阅时会出现的提示:改发布不允许匿名订阅

如果仍然需要匿名订阅则用以下解决办法

[企业管理器]->[复制]->[发布内容]->[属性]->[订阅选项] 选择允许匿名请求订阅

2)如果选择匿名订阅,则配置订阅服务器时不会出现以上提示

(10)[下一步] 设置快照 代理程序调度

(11)[下一步] 完成配置

当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库

有数据

srv1.库名..author有字段:id,name,phone,

srv2.库名..author有字段:id,name,telphone,adress

 

要求:

srv1.库名..author增加记录则srv1.库名..author记录增加

srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新

--*/

 

--大致的处理步骤

--1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步

exec sp_addlinkedserver ''srv2'','''',''SQLOLEDB'',''srv2的sql实例名或ip''

exec sp_addlinkedsrvlogin ''srv2'',''false'',null,''用户名'',''密码''

go

--2.在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动

。我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动

go

  

--然后创建一个作业定时调用上面的同步处理存储过程就行了

 

企业管理器

--管理

--SQL Server代理

--右键作业

--新建作业

--"常规"项中输入作业名称

--"步骤"项

--新建

--"步骤名"中输入步骤名

--"类型"中选择"Transact-SQL 脚本(TSQL)"

--"数据库"选择执行命令的数据库

--"命令"中输入要执行的语句: exec p_process

--确定

--"调度"项

--新建调度

--"名称"中输入调度名称

--"调度类型"中选择你的作业执行安排

--如果选择"反复出现"

--点"更改"来设置你的时间安排

 

然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行

 

设置方法:


我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定. 

--3.实现同步处理的方法2,定时同步

  
  
  
-- 在srv1中创建如下的同步处理存储过程
  
  
  
create proc p_process as

--更新修改过的数据

update b set name=i.name,telphone=i.telphone

from srv2.库名.dbo.author b,author i

where b.id=i.id and

(b.name <> i.name or b.telphone <> i.telphone)

--插入新增的数据

insert srv2.库名.dbo.author(id,name,telphone)

select id,name,telphone from author i

where not exists(

select * from srv2.库名.dbo.author where id=i.id)


--删除已经删除的数据(如果需要的话)

delete b

from srv2.库名.dbo.author b

where not exists(select * from author where id=b.id)

go




有热门推荐

贼厉害,手撸的 SpringBoot缓存系统,性能杠杠的!

超赞!这款基于SpringBoot + Dubbo打造的在线IM系统功能丰富(附源码)

最全的MySQL 常用分库分表方案,都在这里!

13 张图解 Java 中的内存模型

头条二面:宕机后,Redis如何实现快速恢复?

干货分享:扫码关注下面的公众号后台回复“99”领取99套实战项目+资料

想充电就关注序员闪充宝

点击阅读原文,获免费JVM+MySQL+设计模式+分布式+微服务完整面试资料

本文分享自微信公众号 - java版web项目(java_project)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

lnmp 环境里安装 mssql 及 mssql 的 php 扩展

lnmp 环境里安装 mssql 及 mssql 的 php 扩展

小活中用到 mssql, 于是在自己 lnmp 环境中安装各 mssql 数据库

步骤如下: 

源码编译安装

(1)下载 freetds-stable-0.91 源码: http://download.csdn.net/download/xhu_eternalcc/7457555(花了 4 积分,没有积分的找我要,微信 zmd1047773569)
          上传到根目录下的 download 文件中
(2)编译安装:
   # cd /download

           # tar zxvf freetds-stable.tgz(解压,)

 

   # cd freetds-0.91

   # 编译

            # ./configure --prefix=/usr/local/freetds --with-tdsver=8.0 --enable-msdblib

            # make

            # make install

            参数解释:

            安装 freetds 到目录 /usr/local/freetds:--prefix=/usr/local/freetds

            支持 MSSQL2000:--with-tdsver=8.0 --enable-msdblib

 

配置 FreeTds 的库文件

将 freetds 的库文件所在路径配置到 LD_LIBRARY_PATH 参数中:

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/localfreetds/lib/:

或者直接把 etc/bashrc 的文件 bashrc 直接填写上  LD_LIBRARY_PATH=/usr/localfreetds/lib:$LD_LIBRARY_PATH

这么作的目的是为了避免加载 FreeTds 库文件加载不上的情况。

 

 

php 里安装 php-mssql 扩展:

cd /download (把php-mssql扩展下载到download目录里)
wget http://cn2.php.net/distributions/php-5.6.30.tar.gz (下载扩展文件,这里要根据你环境中运行的php版本选择对应的扩展版本下载,我这里php是5.6.30的 所以php-mssql扩展下载对应的版本) tar -zxvf php-5.6.30.tar.gz cd /php-5.6.30/ext/mssql
 /usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-mssql=/usr/local/freetds/ 

make
&& make install

编译安装后的结果 如下图

 

同时 mssql.so 也在 php 扩展文件下生成 (如下图)

 

 

 

 把 extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/mssql.so"  添加到 usr/local/php/lib/php.ini 中

 引用扩展后,重启 web 服务,通过 phpinfo 查看扩展 mssql 是否开启成功

重启 php   /usr/local/php/sbin/php-fpm reload  

重启 nginx  进入 nginx 可执行目录 sbin 下,输入命令./nginx -s reload 即可(或者 /application/nginx/sbin/nginx -s reload)

 

 

 

lua 访问 mssql 的驱动(好用的)是哪一个?对 mysql/pgsql 的支持不错,但希望先在 mssql 能用起来

lua 访问 mssql 的驱动(好用的)是哪一个?对 mysql/pgsql 的支持不错,但希望先在 mssql 能用起来

lua 访问 mssql 的驱动(好用的)是哪一个?

lua 对 mysql/pgsql 的支持不错,但对 mssql 的访问,总是不太顺

而目前希望先在 mssql 能用起来

MySQ--语句大全

MySQ--语句大全

MySQl查询语句大全

综合使用 查询 目录:

#----综合使用
书写顺序
select distinct * from ''表名'' where ''限制条件''  group by ''分组依据'' having ''过滤条件'' order by  limit ''展示条数''
执行顺序
from       -- 查询
where      -- 限制条件
group by   -- 分组
having     -- 过滤条件
order by   -- 排序
limit      -- 展示条数
distinct   -- 去重
select     -- 查询的结果
正则:select * from emp where name regexp ''^j.*(n|y)$'';
集合查询:max 、min 、avg 、sum 、count 、group_concat 。
内连接:inner join
左连接:left join
右连接:right join
全连接: 左连接 union 右连接
replace 替换

拼接:concat、concat_ws、group_concat

常规设置操作
1.服务器设置远程访问
grant all privileges on *.* to ''root''@''%'' identified by ''123456'' with grant option;

2.Linux中数据库的基本操作命令
    1.使用service 
    启动:service mysql start
    停止:service mysql stop
    重启:service mysql restart
    2.清屏:clear,reset

3.备份数据库
#mysqldump -uroot -p密码 数据库名 > D:/备份文件名.sql

4.恢复备份的数据库
#首先在mysql里建好数据库名
#mysql -uroot -p密码 数据库名 < D:/备份文件名.sql

5.查询binlog日志是否开启
show variables like ''log_%''; 

基本操作:
1.单表约束

#主键约束:PRIMARY KEY          要求被装饰的字段:唯一和非空
#唯一约束:UNIQUE               要求被装饰的字段:唯一,
#                              联合唯一:在结尾:unique(字段1,字段2)
#非空约束:NOT NULL             要求被装饰的字段:非空
#外键约束:FOREIGN KEY          某主表的外键
#自动增加:AUTO_INCREMENT       自动增加(需要和主键 PRIMARY KEY 同时用)
#设置默认值:DEFAULT             为该属性设置默认值
# 在int、char中:zerofill       不足位数默认填充0

2.常用数据类型

int        #整型,4个字节  一般不需要指定宽度,(8):只是显示为8位,默认有负号设置无负号: unsigned
double     #浮点型,例如double(5,2),标识最多5位,其中2位为小数,即最大为999.99
varchar        #可变长度字符串类型。例如:varchar(10) ''aaa'' 占3位
char       #固定长度字符串类型。例如:char(10) ''aaa'' 占10位
text       #大文本字符串类型。
blob       #字节类型。例如:
datetime   #日期时间类型。例如:datetime(yyyy-MM-dd hh:mm:ss)
date       #日期类型。例如:date(yyyy:MM:dd)
time       #时间类型。例如:time(hh:mm:ss)
timestamp  #时间戳类型。例如:timestamp(yyyy-MM-dd hh:mm:ss)  会自动赋值
enum       #枚举 多选一 enum(''male'',''female''),default为默认值
例如:sex enum(''male'',''female'') not null default ''male''
set            #集合 多选多,可以选一个 set(''read'',''DJ'',''DBJ'',''run'')
注:字符串类型和时间类型都要用单引号括起来,空值为null

3.查看数据列表
show databases; -- 查看所有数据库
show create table 表名; -- 查看表的创建细节
desc 表名; -- 查看表结构

4.进入数据库
#use 数据名
use Python_7

5.创建数据库
#CREATE DATABASE 数据库名
CREATE DATABASE Python_7; 
CREATE DATABASE pyrhon_7 charset utf8

# 修改数据库编码
alter database db1 charset gbk;

6.删除数据库
#drop database 需要删除的数据库名
drop database Python_7;

7.查看表
select database();  # 查看当前所在的库
show tables; -- 查看数据库中所有表
desc 表名; -- 查看表结构
show create table 表名; -- 查看表的创建细节

8.创建表
# 创建新表
# create table 新建数据表名(
#      字段名 类型(长度) [约束(具体见1)],
#      字段名 类型(长度) [约束(具体见1)]
#  );
create table class(
      id INT AUTO_INCREMENT,
  name varchar(32) UNIQUE,
  age varchar(32) NOT NULL
);

#需要注意


#根据已有的表创建新表
create table 新表 like 旧表  -- 使用旧表创建新表
create table 新表 as select 字段1 字段2... from definition only -- 使用自定义值去新建表


9.删除表
#drop table 数据库表名
drop table Python

10.修改表
alter table 表名 add 字段名 类型(长度) [约束]; -- 添加列
alter table 表名 modify 字段名 类型(长度) [约束]; -- 修改列的类型长度及约束
alter table 表名 change 旧字段名 新字段名 类型(长度) [约束]; -- 修改列表名
alter table 表名 drop 字段名; -- 删除列
alter table 表名 character set 字符集; -- 修改表的字符集
rename table 表名 to 新表名; -- 修改表名

11.增加数据
insert into 表(字段名1,字段名2..) values(值1,值2..);-- 向表中插入某些列
insert into 表 values(值1,值2,值3..); -- 向表中插入所有列

12.修改数据
update 表名 set 字段名=值,字段名=值...; -- 这个会修改所有的数据,把一列的值都变了
update 表名 set 字段名=值,字段名=值... where 条件; -- 只改符合where条件的行

13.删除数据
delete from 表名  -- 删除表中所有记录
delete from 表名 where 条件 -- 删除符合 where条件的数据
truncate table 表名; -- 把表直接drop掉,重新建表,auto_increment将置为零。删除的数据不能找回。执行速度比delete快

14.数据的简单查询
select * from 表名; -- 查询所有列
select 字段名1,字段名2,字段名3.. from 表名; -- 查询指定列

15.几个简单的基本的sql语句
select * from 表名 where 范围                           -- 选择查询
insert into 表名(field1,field2) values(value1,value2)   -- 插入
delete from 表名 where 范围                             -- 删除
update 表名 set field1=value1 where 范围                -- 更新
select * from 表名 where field1 like ’%value1%’            -- 查找
select * from 表名 order by field1,field2 [desc]        -- 排序:
select count as 需要统计总数的字段名 from 表名             -- 总数
select sum(field1) as sumvalue from 表名               -- 求和
select avg(field1) as avgvalue from 表名               -- 平均
select max(field1) as maxvalue from 表名               -- 最大
select min(field1) as minvalue from 表名               -- 最小

16.存储引擎
# 查看所有的存储引擎
show engines;

# 查看不同存储引擎存储表结构文件特点
create table t1(id int)engine=innodb; -- MySQL默认的存储引擎,支持事务,支持行锁,支持外键。有且只有一个主键,用来组织数据的依据
create table t2(id int)engine=myisam; -- 不支持事务,不支持外键,支持全文索引,处理速度快。
create table t3(id int)engine=blackhole; -- 黑洞,写入它的任何内容都会消失
create table t4(id int)engine=memory;-- 将表中的数据存储在内存中。表结构以文件存储于磁盘。

insert into t1 values(1);
insert into t2 values(1);
insert into t3 values(1);
insert into t4 values(1);

17.设置严格模式
# 查询
show variables like ''%mode%'';
# 设置
set session -- 设置当前窗口下有效
set global  -- 全局有效,终身受用
set global sql_mode = "STRICT_TRANS_TABLES";
# 设置完成后需要退出客户端,重新登录客户端即可,不需要重启服务端

group by分组涉及到的模式:
设置sql_mode为only_full_group_by,意味着以后但凡分组,只能取到分组的依据,
不应该在去取组里面的单个元素的值,那样的话分组就没有意义了,因为不分组就是对单个元素信息的随意获取
"""
set global sql_mode="strict_trans_tables,only_full_group_by";
# 重新链接客户端

18.like 的用法
A:% 包含零个或多个字符的任意字符串:
1、like''Mc%'' 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
2、like''%inger'' 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。
3、like''%en%'' 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。

B:_(下划线) 任何单个字符:
  like''_heryl'' 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。

C:[ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符: 
  1,like''[CK]ars[eo]n'' 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
  2、like''[M-Z]inger'' 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。

D:[^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符:
  like''M[^c]%'' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。

E:* 它同于DOS命令中的通配符,代表多个字符:
  c*c代表cc,cBc,cbc,cabdfec等多个字符。

F:?同于DOS命令中的?通配符,代表单个字符 :
  b?b代表brb,bFb等

G:# 大致同上,不同的是代只能代表单个数字。k#k代表k1k,k8k,k0k 。

下面我们来举例说明一下:

例1,查询name字段中包含有“明”字的。
select * from table1 where name like ''%明%''

例2,查询name字段中以“李”字开头。
select * from table1 where name like ''李*''

例3,查询name字段中含有数字的。
select * from table1 where name like ''%[0-9]%''

例4,查询name字段中含有小写字母的。
select * from table1 where name like ''%[a-z]%''

例5,查询name字段中不含有数字的。
select * from table1 where name like ''%[!0-9]%''

以上例子能列出什么值来显而易见。但在这里,我们着重要说明的是通配符“*”与“%”的区别。

很多朋友会问,为什么我在以上查询时有个别的表示所有字符的时候用"%"而不用“*”?先看看下面的例子能分别出现什么结果:
select * from table1 where name like ''*明*''
select * from table1 where name like ''%明%''
大家会看到,前一条语句列出来的是所有的记录,而后一条记录列出来的是name字段中含有“明”的记录,所以说,当我们作字符型字段包含一个子串的查询时最好采用“%”而不用“*”,用“*”的时候只在开头或者只在结尾时,而不能两端全由“*”代替任意字符的情况下。


高级查询操作
1、外键表创建
一对多(Foreign Key)
# foreign key(需要关联的本字段) references 需要关联对表的表(需要关联对表的字段)
例如:
创建dep
foreign key(dep_id) references dep(id)
# 同步更新,同步删除
on update cascade #同步更新
on delete cascade #同步删除
2、表复制
复制表
create table t1 select * from test;
只复制表结构
create table t1 select * from test where 1=2;
3、单表查询查询
0.综合使用
#----综合使用
书写顺序
select distinct * from ''表名'' where ''限制条件''  group by ''分组依据'' having ''过滤条件'' order by  limit ''展示条数''
执行顺序
from       -- 查询
where      -- 限制条件
group by   -- 分组
having     -- 过滤条件
order by   -- 排序
limit      -- 展示条数
distinct   -- 去重
select     -- 查询的结果

正则:select * from emp where name regexp ''^j.*(n|y)$'';
集合查询:max 、min 、avg 、sum 、count 、group_concat 。
拼接:concat、concat_ws、group_concat
内连接:inner join
左连接:left join
右连接:right join
全连接: 左连接 union 右连接
1.where 查询
# between 在...之间
select id,name from emp where id >= 3 and id <= 6;
相当于:
select *  from emp where id between 3 and 6;  

# or 或者
select *  from emp where id >= 3 or id <= 6;

# in,后面可以跟多个值
select * from 表名 where 字段名 in (条件1,条件2,条件三); 

# like (见上18)
# char——length()  取字符长度
select * from 表名 where char_length(需要获取长度的字段名) = 4;


not 配合使用
注意:判断空不能用 = ,只能用 is 
2.group by 分组
select 查询字段1,查询字段2,... from 表名
      where 过滤条件
      group by分组依据  # 分组后取出的是每个组的第一条数据
3.聚合查询 :以组为单位统计组内数据>>>聚合查询(聚集到一起合成为一个结果)
# max 最大值
# 每个部门的最高工资
select post,max(salary) from emp group by post;

# min 最小值
# 每个部门的最低工资
select post,min(salary) from emp group by post;

# avg 平均值
# 每个部门的平均工资
select post,avg(salary) from emp group by post;
# 每个部门的工资总和

# sum 求和
select post,sum(salary) from emp group by post;

# count(需要计数字段) 计数
# 每个部门的人数
select post,count(id) from emp group by post;

# group_concat(需要分组后的字段) # 不仅可以用来显示除分组外字段还有拼接字符串的作用
  select post,group_concat(name) from emp group by post; 
  -- post:分组字段,name 需要分组后显示的字段
拼接:
  concat(不分组时用)拼接字符串达到更好的显示效果 as语法使用
  举例:
      select concat("NAME: ",name) as 姓名 from emp;    
  concat_ws: 如果拼接的符号是统一的可以用
  举例:
      select concat_ws('':'',name,age,sex) as info from emp;
  group_concat: 
  举例:
      select post,group_concat(name,''DSB'') from emp group by post;
      
补充:as语法 起别名
select name as 姓名,salary as 薪资 from emp;
4.having 过滤查询
# having的语法格式与where一致,只不过having是在分组之后进行的过滤,即where虽然不能用聚合函数,但是having可以!

# 用法
select 查询字段1,查询字段2,... from 表名
      where 过滤条件1
      group by分组依据
having avg(过滤条件2) > 10000;
5.distinct 去重
# 对有重复的展示数据进行去重操作
select distinct 需取重字段 from 表名;
6.order by 排序
select * from emp order by salary asc; #默认升序排
select * from emp order by salary desc; #降序排

# 多条件排序
#先按照age降序排,在年轻相同的情况下再按照薪资升序排
select * from emp order by age desc,salary asc; 
7.limit 限制展示条数
# 限制展示条数
select * from emp limit 3;
# 查询工资最高的人的详细信息
select * from emp order by salary desc limit 1;

# 分页显示
select * from emp limit 0,5;  # 第一个参数表示起始位置,第二个参数表示的是条数,不是索引位置
select * from emp limit 5,5;
8.正则
select * from emp where name regexp ''^j.*(n|y)$'';
9.replace 替换
replace(str1,old,new) -- str1:需要替换的字段名
update gd_km set mc=replace(mc,''土地'',''房子'')
说明:new替换str1中出现的所有old,返回新的字符串,如果有某个参数为NULL,此函数返回NULL 
该函数可以多次替换,只要str1中还有old存在,最后都被替换成new 
若new为空,则删除old
四、多表查询
1.内连接、左连接、右连接、全连接
1、内连接:只取两张表有对应关系的记录(只拼两个表共有的)
左表 inner join 右表 on 条件
  select * from emp inner join dep on emp.dep_id = dep.id
       where dep.name = "技术";

2、左连接:在内连接的基础上,保留左边的数据,右边没有就为空
左表 inner left 右表 on 条件
3、右连接:在内连接的基础上,保留右边的数据,左边没有就为空
左表 inner right 右表 on 条件
4、全连接:左右连接都有,用union连接
左表 inner left 右表 on 条件 union 左表 inner right 右表 on 条件
select * from emp left join dep on emp.dep_id = dep.id
union
select * from emp right join dep on emp.dep_id = dep.id;
2.子查询
# 就是将一个查询语句的结果用括号括起来当作另外一个查询语句的条件去用
select name from where id in(select dep_id from emp where age>25);


mysql中用命令行复制表结构的方法主要有一下几种: 

1.只复制表结构到新表
1 CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2;

1 CREATE TABLE 新表 LIKE 旧表 ;
注意上面两种方式,前一种方式是不会复制时的主键类型和自增方式是不会复制过去的,而后一种方式是把旧表的所有字段类型都复制到新表。

 
2.复制表结构及数据到新表
1 CREATE TABLE 新表 SELECT * FROM 旧表
 
3.复制旧表的数据到新表(假设两个表结构一样) 
1 INSERT INTO 新表 SELECT * FROM 旧表
 
4.复制旧表的数据到新表(假设两个表结构不一样)
1 INSERT INTO 新表(字段1,字段2,.......) SELECT 字段1,字段2,...... FROM 旧表

关于Mssql,Access 的 sql 经典 SQL 语句大全sql语言access的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于15000 字的 SQL 语句大全、lnmp 环境里安装 mssql 及 mssql 的 php 扩展、lua 访问 mssql 的驱动(好用的)是哪一个?对 mysql/pgsql 的支持不错,但希望先在 mssql 能用起来、MySQ--语句大全等相关内容,可以在本站寻找。

本文标签:

上一篇MSSQL 2005 数据库变成可疑状态(sql2005数据库可疑怎么解决)

下一篇重置 MSSQL 的 Identity 标识列的值