分类目录归档:数据库

mysql连接字符串—远程连接用IP地址 而非只是localhost时

r on ‘192.168.1.101’ (10061)

最新的可解决方法如下:(最重要的步骤–>红色字体标识出了)

解决MYSQL数据库无法使用IP访问本地的方法
MYSQL数据库缺省安装后,其默认用户名ROOT如果只能以<localhost>或<127.0.0.1>方式访问主机,即通过外部IP地址访问返回如下内容:
ERROR 1130 (): #HY000Host ‘XXXXXX’ is not allowed to connect to this MySQL server
可以增加一个用户,给其权限,允许由局域网或互联网进行外部访问,方法如下:
1。在运行中输入CMD,确定,进入文本方式。
2。输入mysql -h localhost -u root -p 回车,使用ROOT用户登录。
3。输入use mysql; 显示Database changed,选择MYSQL系统库。
4。假定我们现在增加一个’goldeye2000’用户,密码为’1234567’,让其能够从外部访问MYSQL。输入
grant all on * to ‘goldeye2000’ identified by ‘1234567’;
ALL代表所有权限。
5。现在看看用户表内容。输入select user,host from user ; 可以看到”goldeye2000″用户已经加进去了,并且其权限为’% ‘,’grande’,’localhost ‘。
6。退出MYSQL,输入QUIT;回车
7。我们现在可以用goldeye2000用户在局域网或互联网中以IP方式访问了。
mysql -h 192.168.0.115 -u goldeye2000 -p

二、bind-address = 127.0.0.1 注释掉即可

C# 执行Mysql数据库脚本 创建数据库和表

开发过程中可能需要将数据库导入到生产库中,我们可以通过MySQL workbench将数据库导出成sql文件,然后在C#代码中直接执行sql脚本,创建相应的数据库和表。

项目中需要添加引用mysql.Data.dll

CS文件中需要应用using MySql.Data.MySqlClient;

[csharp] view plain copy

  1. private void button_connTest_Click(object sender, RoutedEventArgs e)
  2. {
  3.     string connStr = “server=192.168.3.21;user=root;database=;port=3306;password=root;”;
  4.     MySqlConnection conn = new MySqlConnection(connStr);
  5.     try
  6.     {
  7.         textbox_log.Text += “Connecting to MySQL…\r\n”;
  8.         conn.Open();
  9.         FileInfo file = new FileInfo(“D:/endb.sql”);  //filename是sql脚本文件路径。
  10.         string sql = file.OpenText().ReadToEnd();
  11.         MySqlScript script = new MySqlScript(conn);
  12.         script.Query = sql;
  13.         int count = script.Execute();
  14.         textbox_log.Text += “Executed “ + count + ” statement(s)\r\n”;
  15.         textbox_log.Text += “Delimiter: “ + script.Delimiter+“\r\n”;
  16.         //textbox_log.Text += “Query: ” + script.Query + “\r\n”;
  17.     }
  18.     catch (Exception ex)
  19.     {
  20.         textbox_log.Text += ex.ToString();
  21.     }
  22.     conn.Close();
  23.     textbox_log.Text += “Execute Successfully.”;
  24. }


执行完成后,就可以看到新的数据库自动创建成功了。

如果只是简单的执行建表或者其他语句,那么数据库连接字符串将要写对应的数据库名,如:

[csharp] view plain copy

  1. string connStr = “server=192.168.3.21;user=root;database=MyDB;port=3306;password=root;”;
  2. MySqlConnection conn = new MySqlConnection(connStr);

相关知识:通过Mysql WorkBench将数据库导出成sql脚本,选择菜单–>Server–>Data Export

2

MySQL绿色版的安装

由于工作需要最近要开始研究MySQL了(看来学习都是逼出来的),本人对mysql没有研究,可以说一个小白。 下面就从安装开始吧,虽然网上关于这方面的东西很多,还是需要自己把操作过程写下来。

1、数据库下载

  Mysql官方网站:http://www.mysql.com/,数据库下载地址:http://www.mysql.com/downloads/。从官方网站可以找到两种文件包,一种是exe安装程序,另一种是zip压缩包。本人喜欢清爽的方式,所以下载的是ZIP压缩包。最新的5.6.22大概350M,下载还需要oracle帐号,自己注册一个好了。

2、数据库安装

解压出下载的文件mysql-5.6.22-win32.zip(有x86和x64两个版本)到任一目录,防止出现未知问题,最好放在非系统盘的非中文目录下,我的位置C:\Program Files\mysql-5.6.22-win32。打开文件夹复制一份my-default.ini为my.ini的配置文件。

打开my.ini文件,相关配置修改如下

复制代码

1 # For advice on how to change settings please see
 2 # http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
 3 # *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
 4 # *** default location during install, and will be replaced if you
 5 # *** upgrade to a newer version of MySQL.
 6 
 7 [mysqld]
 8 
 9 # Remove leading # and set to the amount of RAM for the most important data
10 # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
11  innodb_buffer_pool_size = 128M
12 
13 # Remove leading # to turn on a very important data integrity option: logging
14 # changes to the binary log between backups.
15 # log_bin
16 
17 # These are commonly set, remove the # and set as required.
18 #mysql根目录
19  basedir ="C:\Program Files\mysql-5.6.22-win32"
20 #数据文件存放目录
21  datadir ="C:\Program Files\mysql-5.6.22-win32\data"
22 # port = .....   端口,默认3306
23 # server_id = .....  服务实例的唯一标识
24 
25 
26 # Remove leading # to set options mainly useful for reporting servers.
27 # The server defaults are faster for transactions and fast SELECTs.
28 # Adjust sizes as needed, experiment to find the optimal values.
29 # join_buffer_size = 128M
30 # sort_buffer_size = 2M
31 # read_rnd_buffer_size = 2M 
32 
33 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
34 #服务端的编码方式
35 character-set-server=utf8
36 [client]
37 #客户端编码方式,最好和服务端保存一致
38 loose-default-character-set = utf8
39 
40 [WinMySQLadmin]  
41 Server = "C:\Program Files\mysql-5.6.22-win32\bin\mysqld.exe"

复制代码

上面设置为了保证服务正常运行,根据自己需要调整参数,修改后要重启服务。

3、注册Mysql服务

开始——运行——cmd,然后cd到mysql安装目录的bin下面,我的目录就是“C:\Program Files\mysql-5.6.22-win32\bin”,然后执行mysqld -install,提示服务安装成功!运行services.msc一看,确实有一个名为MySQL的服务了,启动它。有时启动失败,根据情况调整参数即可。

到这儿mysql安装就算完成了,其实还挺简单的,但如果没有操作过,整个过程估计要花不少时间,也是成长必须的过程。

4、登录维护Mysql

安装成功了,也启动了,怎么登录啊?用户名和密码是什么 ?

MySQL的默认用户名是root,密码为空。

怎么登录?还是开始——运行——cmd,cd到bin目录下,然后执行“mysql -u root -p”,提示输入密码,由于第一次运行,密码为空可以直接回车。

还是给数据库设个密码吧。输入exit退出登录。然后运行运行C:\Program Files\mysql-5.6.22-win32\bin\mysqladmin -uroot -p password <新密码> ,将<新密码>替换为你的自定义密码,然后按回车。这时会提示输入密码,其实是指的原密码,原密码因为是空,所以这里再回车即可完成设置。然后用上面的方法和新密码登入mysql,即可正常工作。

运行”show variables like ‘%version%'” 查看数据库相关信息

至此,整个数据库的安装完成。

虽然mysql客户端能完成所有关于数据库操作,但是黑黑的命令行界面还是让很多人望而却步,学习曲线直线上升,在此给大家推荐一个工具Navicate for mysql,个人感觉非常好用,各种操作一目了然,还有个SQLyog也不错。

 

6、开启远程登录

mysql安装完成后默认只能本机(就是localhost)登录, 我们需要开启远程登录才方便使用. 开启方法有很多,百度一大把, 我说一下测试通过的方法

 

复制代码

x:\>mysql -u root -p 密码   //登录系统
mysql> use mysql;       //切换数据库
mysql> update user set host = '%' where user = 'root';  
//上面这句话有时出现一个错误  ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'

//不过这时你查询一下user表发现已经更新一条记录了,下面这句话
mysql> select host, user from user;

//直接执行这句,其实就是刷新权限
mysql> flush privileges;

复制代码

 

再测试远程连接试试, 已经可以了

SQL Server 迁移数据到MySQL

一、背景

由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据转移到MySQL;由于涉及的表比较多,所以想在MySQL中生成对应表并导入数据;

上网找了些资料,如:将ACCESS和MSSQL导入MYSQL中MySQL Migration 实现 MSSQL 到 MySQL数据迁移,虽然不知道里面的做法是否可以成功转移,但是里面的过程比较复杂,没有去尝试,后来自己找到了方法,最重要就是简单和准确(暂时没发现明显的BUG),这里分享给大家。

 

二、转移数据

我使用了MySQL的Client的工具SQLyog,这个工具的安装很简单。安装完成之后点击需要导入的目标数据库,点击右键【Import】->【Import Extenal Data】;

clip_image002

(Figure1:Import)

选择【Start a new job】,点击【下一步】;

clip_image003

(Figure2:Start a new job)

下面就是DSN的设置界面,如果你的下来列表中没有需要导出SQL Server数据库的DSN,那么需要通过【Create a New DSN】来创建一个新的DSN连接到SQL Sever;

clip_image004

(Figure3:Create a New DSN)

clip_image005

(Figure4:创建新数据源)

clip_image006

(Figure5:选择数据源类型)

把上面的设置保存为一个local.dsn文件;

clip_image007

(Figure6:选择数据源保存路径)

clip_image008

(Figure7:选择SQL Server服务器)

clip_image009

(Figure8:设置SQL Server帐号和密码)

clip_image010

(Figure9:选择SQL Server数据库)

clip_image011

(Figure10:测试数据源)

clip_image012

(Figure11:测试成功)

选中【File DSN】,在浏览中选择我们刚刚创建好的DSN,接着填写登录到SQL Server的帐号和密码;

clip_image013

(Figure12:选择DSN)

下一步,选择目标MySQL服务器,填写IP地址和帐号密码,并且需要选择目标数据库;

clip_image014

(Figure13:设置MySQL帐号和密码目标数据库)

这一步类似SQL Server的导入导出功能,这里可以拷贝一个表或者使用SQL脚本过滤数据;

clip_image015

(Figure14:表拷贝)

上面的全部过程就是为创建SQL Server与MySQL的一个管道,接下来就是最为重要的设置SQL Server表与MySQL表之间的对应关系了;里面包括了SQL Server表字段与MySQL表字段之间的对应关系【Map】,高级选项【Advanced】,过滤【WHERE】。

clip_image016

(Figure15:选择表对应关系)

下图Figure16,数据源【Source】,描述【Destination】,特别注意这里数据类型【Type】,这里的意思是转换目标的数据类型,但是不需要跟目标表的一样,因为这里是做为一个临时存储的数据类型,类似FindOn在SQL Server中是datetime,这里转换为MySQL的timestamp,其实MySQL目标表的数据类型是datetime,这样的设置也是可以转换成功的。

clip_image018

(Figure16:表字段转换)

clip_image019

(Figure17:高级选项)

clip_image020

(Figure18:Error)

clip_image021

(Figure19:Log)

clip_image022

(Figure20:执行信息)

clip_image023

(Figure21:执行结果)

clip_image024

(Figure22:原始SQL Server的数据列表)

clip_image025

(Figure23:转移到MySQL的数据列表)

对比下Figure20与Figure21,发现我们数据已经全部转移成功了;

SQL Server 2008 R2 企业版/开发版/标准版(中英文下载,带序列号)

说明:此激活版仅用于测试,如用于商用生产环境,产生的一切后果自负。

一. 简体中文

1. SQL Server 2008 R2 Developer (x86, x64, ia64) – DVD (Chinese-Simplified)

File Name: cn_sql_server_2008_r2_developer_x86_x64_ia64_dvd_522724.iso
Date Published (UTC): 2010-5-3 9:45:45        ISO/CRC: ADDBE07E
SHA1: AAE0E2D4E41AB7591634D53C7BC76A112F31B617
File Size: 4.34 GB

ed2k://%7Cfile%7Ccn_sql_server_2008_r2_developer_x86_x64_ia64_dvd_522724.iso%7C4662884352%7CE436F05BCB0165FDF7E5E61862AB6BE1%7C/

2. SQL Server 2008 R2 Enterprise (x86, x64, ia64) – DVD (Chinese-Simplified)

File Name: cn_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_522233.iso
Date Published (UTC): 2010-5-3 9:45:05        ISO/CRC: 55AC3C56
SHA1: 0EEFF017B21635DF33F33C47E31E911CB23390F7
File Size: 4.34 GB

ed2k://%7Cfile%7Ccn_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_522233.iso%7C4662884352%7C1DB025218B01B48C6B76D6D88630F541%7C/

3. SQL Server 2008 R2 Standard (x86, x64, ia64) – DVD (Chinese-Simplified)

File Name: cn_sql_server_2008_r2_standard_x86_x64_ia64_dvd_522239.iso
Date Published (UTC): 2010-5-3 9:45:18        ISO/CRC: F6137D11
SHA1: B5A534094780CD915458344BD097F8203FD7C7CC
File Size: 4.34 GB

ed2k://%7Cfile%7Ccn_sql_server_2008_r2_standard_x86_x64_ia64_dvd_522239.iso%7C4662884352%7C18EB3AE3828811617488F2CE8E5B8420%7C/

二. 英文(US)

1. SQL Server 2008 R2 Developer (x86, x64, ia64) – DVD (English)

File Name: en_sql_server_2008_r2_developer_x86_x64_ia64_dvd_522665.iso
Date Published (UTC): 2010-5-3 9:45:43        ISO/CRC: 272D2E95
SHA1: 10B990A86961D84C4D7D5E8C3A4C67F0D0456E63
File Size: 4.08 GB

ed2k://%7Cfile%7Cen_sql_server_2008_r2_developer_x86_x64_ia64_dvd_522665.iso%7C4380329984%7CD50121522B34BBE91564F51D167BAAB5%7C/

2. SQL Server 2008 R2 Enterprise (x86, x64, ia64) – DVD (English)

File Name: en_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_520517.iso
Date Published (UTC): 2010-5-3 9:45:03        ISO/CRC: 1139BB30
SHA1: 18105DB70F0F0B23418F5005A6CE4B25317C6D03
File Size: 4.08 GB

ed2k://%7Cfile%7Cen_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_520517.iso%7C4380329984%7C311E5E62E84E07A1460312674EB158A7%7C/

3. SQL Server 2008 R2 Standard (x86, x64, ia64) – DVD (English)

File Name: en_sql_server_2008_r2_standard_x86_x64_ia64_dvd_521546.iso
Date Published (UTC): 2010-5-3 9:45:17        ISO/CRC: ECDBE122
SHA1: 09CF52A4209CA96FF480537BB86786F79AE0E8A3
File Size: 4.08 GB

ed2k://%7Cfile%7Cen_sql_server_2008_r2_standard_x86_x64_ia64_dvd_521546.iso%7C4380329984%7C9554A2B17DE29ABF4743912535BC4B46%7C/

MS 发布了最新的SQL  Server 2008 R2,似乎早在4.19就提供了下载,不过才到昨天放出下载地址:
这个是试用版的下载,于正式版的区别就只在一个序列号!
MSDN的版本则集成了安装序列号(类似VS2010),如果有大大下载了MSDN SQL 2008 R2,期待放出其中的序列号!

这是官方的下载页面(需要付费订阅):
http://msdn.microsoft.com/zh-cn/subscriptions/downloads/default.aspx

数据中心版:
PTTFM-X467G-P7RH2-3Q6CG-4DMYB(可用,已验证)
DDT3B-8W62X-P9JD6-8MX7M-HWK38(待测)

开发版:
MC46H-JQR3C-2JRHY-XYRKY-QWPVM (可用,已验证)
FTMGC-B2J97-PJ4QG-V84YB-MTXX8(待测)

企业版:
R88PF-GMCFT-KM2KR-4R7GB-43K4B (可用,已验证)
GYF3T-H2V88-GRPPH-HWRJP-QRTYB(待测)

标准版:
B68Q6-KK2R7-89WGB-6Q9KR-QHFDW(待测)
CXTFT-74V4Y-9D48T-2DMFW-TX7CY(待测)

工组版:
XQ4CB-VK9P3-4WYYH-4HQX3-K2R6Q(待测)

WEB版:
FP4P7-YKG22-WGRVK-MKGMX-V9MTM(待测)

希望大家有序列号不吝提供!

至于MSDN版本则含了对应的序列号

SQL Server 2008 R2 Enterprise (x86, x64, ia64) – DVD (Chinese-Simplified)语言:中文(简体)
文件名:cn_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_522233.iso
邮寄日期(UTC):2010-5-3 9:45:05文件大小:4662884352 字节
SHA1:0EEFF017B21635DF33F33C47E31E911CB23390F7

下载地址:cn_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_522233.iso (4.34 GB)

update中加入select最常用的update语法

最常用的update语法是:
UPDATE SET = , SET =

如果我的更新值Value是从一条select语句拿出来,而且有很多列的话,用这种语法就很麻烦
第一,要select出来放在临时变量上,有很多个哦
第二,再将变量进行赋值。
列多起来非常麻烦,能不能像Insert那样,把整个Select语句的结果进行插入呢?就好象下面
insert into table1
(c1, c2, c3)
(select v1, v2, v3 from table2)

答案是可以的,具体的语法如下:
UPDATE
SET (, ) = (
SELECT (, )
FROM WHERE = )
WHERE ;
下面是这样一个例子:
两个表a、b,想使b中的memo字段值等于a表中对应id的name值
表a:id, name
1 王
2 李
3 张
表b:id,ClientName
1
2
3
(MS SQL Server)语句:update b set ClientName = a.name from a,b where a.id = b.id
(Oralce)语句:update b set (ClientName) = (SELECT name FROM a WHERE b.id = a.id)
update set from 语句格式
当where和set都需要关联一个表进行查询时,整个update执行时,就需要对被关联的表进行两次扫描,显然效率比较低。
对于这种情况,Sybase和SQL SERVER的解决办法是使用UPDATE…SET…FROM…WHERE…的语法,实际上就是从源表获取更新数据。
在 SQL 中,表连接(left join、right join、inner join 等)常常用于 select 语句,其实在 SQL 语法中,这些连接也是可以用于 update 和 delete 语句的,在这些语句中使用 join 还常常得到事半功倍的效果。
Update T_OrderForm SET T_OrderForm.SellerID =B.L_TUserID
FROM T_OrderForm A LEFT JOIN T_ProductInfo B ON B.L_ID=A.ProductID
用来同步两个表的数据!
Oralce和DB2都支持的语法:
UPDATE A SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID)

MS SQL Server不支持这样的语法,相对应的写法为:
UPDATE A SETA1 = B1, A2 = B2, A3 = B3 FROMA LEFT JOIN B ON A.ID = B.ID
个人感觉MS SQL Server的Update语法功能更为强大。MS SQL SERVER的写法:
UPDATE A SET A1 = B1, A2 = B2, A3 = B3 FROM A, B WHERE A.ID = B.ID

在Oracle和DB2中的写法就比较麻烦了,如下:
UPDATE A SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID)
WHERE ID IN (SELECT B.ID FROM B WHERE A.ID = B.ID)

mysql查询当天所有数据sql语句

在mysql中查询当天数据我们使用到如year,month,day函数是一种做法,还有一种利用date(regdate) = curdate()函数,当然我们也可以用其它方法,下面我来总结一下。

mysql查询当天的所有信息:

 代码如下 复制代码
select * from test where year(regdate)=year(now()) and month(regdate)=month(now()) and day(regdate)=day(now())

这个有一些繁琐,还有简单的写法:

 代码如下 复制代码
select * from table where date(regdate) = curdate();

另一种写法没测试过

查询当天的记录

 代码如下 复制代码
select * from hb_article_view where TO_DAYS(hb_AddTime) = TO_DAYS(NOW())

date()函数获取日期部分, 扔掉时间部分,然后与当前日期比较即可
补充:本周、上周、本月、上个月份的数据
查询当前这周的数据

 代码如下 复制代码
SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,’%Y-%m-%d’)) = YEARWEEK(now());

查询上周的数据

 代码如下 复制代码
SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,’%Y-%m-%d’)) = YEARWEEK(now())-1;

查询当前月份的数据
select name,submittime from enterprise where date_format(submittime,’%Y-%m’)=date_format(now(),’%Y-%m’)

查询距离当前现在6个月的数据

 代码如下 复制代码
select name,submittime from enterprise where submittime between date_sub(now(),interval 6 month) and now();

查询上个月的数据

 代码如下 复制代码
select name,submittime from enterprise where date_format(submittime,’%Y-%m’)=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),’%Y-%m’)

select * from `user` where DATE_FORMAT(pudate,’%Y%m’) = DATE_FORMAT(CURDATE(),’%Y%m’) ;

select * from user where WEEKOFYEAR(FROM_UNIXTIME(pudate,’%y-%m-%d’)) = WEEKOFYEAR(now())

select *
from user
where MONTH(FROM_UNIXTIME(pudate,’%y-%m-%d’)) = MONTH(now())

select *
from [user]
where YEAR(FROM_UNIXTIME(pudate,’%y-%m-%d’)) = YEAR(now())
and MONTH(FROM_UNIXTIME(pudate,’%y-%m-%d’)) = MONTH(now())

select *
from [user]
where pudate between 上月最后一天
and 下月第一天
mysql查询多少秒内的数据

 

 代码如下 复制代码
SELECT count( * ) AS c, sum( if( logusertype =2, logusertype, 0 ) ) /2 AS a, sum( if( logusertype =3, logusertype, 0 ) ) /3 AS b
FROM testlog WHERE UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP( logendtime )<=30

查询30秒内记录的总数,loguser等于2的记录的总数和,和 loguser等于3的记录的总数.

if( logusertype =2, logusertype, 0 ) 如果logusetype等于2 就在logusertype上累加,否则加0。

sum( if( logusertype =2, logusertype, 0 ) ) 把logusertype都累加起来。

sum( if( logusertype =2, logusertype, 0 ) ) /2 AS a, 除以2是统计个数。

UNIX_TIMESTAMP(NOW())计算当前时间的秒数,

UNIX_TIMESTAMP( logendtime )计算logendtime的秒数

sqlserver查找备注(text,ntext)类型字段为空的方法

在sql语句中,如果查找某个文本字段值为空的,可以用select * from 表 where 字段=” ,但是如果这个字段数据类型是text或者ntext,那上面的sql语句就要出错了。
解决办法有很多:

1 . select * from 表 where datalength(字段)=0

2.  select * from 表 where cast(字段 as varchar(100))=”

3. select * from 表 where 字段 like ”

SQL Server 2005、2008 的 datetime 值范围

SQL Server 2005、2008 的 datetime

最小值是:1753-01-01 00:00:00

最大值是:9999-12-31 23:59:59.997

这与 .NET 中的 DateTime.MinValue、DateTime.MaxValue 不匹配,与 System.Data.SqlTypes.SqlDateTime.MinValue、System.Data.SqlTypes.SqlDateTime.MaxValue 匹配。

其实 .NET 与 SQL Server 字段关系是这样的:

System.Data.SqlTypes.SqlDateTime

  • MinValue.Value:1753-01-01 00:00:00.000
  • MaxValue.Value:9999-12-31 23:59:59.997(注意 997)

System.DateTime

  • MinValue:0001-01-01 00:00:00.0000000
  • MaxValue:9999-12-31 23:59:59.9999999

SQL Server 2005、2008 字段:smalldatetime

  • 最小值:1900-01-01 00:00:00
  • 最大值:2079-06-06 23:59:00(SQL Server 提示是 2079-06-06 23:59:59,其提示是错误的。)

SQL Server 2005、2008 字段:datetime

  • 最小值:1753-01-01 00:00:00.000
  • 最大值:9999-12-31 23:59:59.997(注意 997)

SQL Server 2008 字段:datetime2

  • 最小值:0001-01-01 00:00:00.0000000
  • 最大值:9999-12-31 23:59:59.9999999

Oracle CASE WHEN 用法介绍

1. CASE WHEN 表达式有两种形式

复制代码
--简单Case函数  

CASE sex  
WHEN '1' THEN '男'  
WHEN '2' THEN '女'  
ELSE '其他' END  

--Case搜索函数  

CASE
WHEN sex = '1' THEN '男'  
WHEN sex = '2' THEN '女'  
ELSE '其他' END
复制代码

 

2. CASE WHEN 在语句中不同位置的用法

2.1 SELECT CASE WHEN 用法

复制代码
SELECT   grade, COUNT (CASE WHEN sex = 1 THEN 1      /*sex 1为男生,2位女生*/
                       ELSE NULL
                       END) 男生数,
                COUNT (CASE WHEN sex = 2 THEN 1
                       ELSE NULL
                       END) 女生数
    FROM students GROUP BY grade;
复制代码

 

2.3 WHERE CASE WHEN 用法

复制代码
SELECT T2.*, T1.*
   FROM T1, T2
  WHERE (CASE WHEN T2.COMPARE_TYPE = 'A' AND
                   T1.SOME_TYPE LIKE 'NOTHING%'
                THEN 1
              WHEN T2.COMPARE_TYPE != 'A' AND
                   T1.SOME_TYPE NOT LIKE 'NOTHING%'
                THEN 1
              ELSE 0
           END) = 1
复制代码

 

2.4 GROUP BY CASE WHEN 用法

复制代码
SELECT  
CASE WHEN salary <= 500 THEN '1'  
WHEN salary > 500 AND salary <= 600  THEN '2'  
WHEN salary > 600 AND salary <= 800  THEN '3'  
WHEN salary > 800 AND salary <= 1000 THEN '4'  
ELSE NULL END salary_class, -- 别名命名
COUNT(*)  
FROM    Table_A  
GROUP BY  
CASE WHEN salary <= 500 THEN '1'  
WHEN salary > 500 AND salary <= 600  THEN '2'  
WHEN salary > 600 AND salary <= 800  THEN '3'  
WHEN salary > 800 AND salary <= 1000 THEN '4'  
ELSE NULL END;
复制代码

 

3.关于IF-THEN-ELSE的其他实现

3.1 DECODE() 函数

select decode(sex, 'M', 'Male', 'F', 'Female', 'Unknown')
from   employees;

貌似只有Oracle提供该函数,而且不支持ANSI SQL,语法上也没CASE WHEN清晰,个人不推荐使用。

3.2 在WHERE中特殊实现

SELECT T2.*, T1.*
   FROM T1, T2
  WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%')
         OR
        (T2.COMPARE_TYPE != 'A' AND T1.SOME_TYPE NOT LIKE 'NOTHING%')

这种方法也是在特殊情况下使用,要多注意逻辑,不要弄错。

为SQL Server 2008安装Northwind示例数据库

一、环境:

OS: Windows 7 Professional
SQL Server 2008 R2

二、示例数据库Northwind下载(mdf)

Northwind

三、附加数据库:

  1. 打开Microsoft SQL Server Management Studio
  2. 在“对象资源管理器”的“数据库”上右击,选“附加(A)…”
  3. 在弹出的“附加数据库”对话框内,添加要附加的mdf文件
  4. 点击“确定”

Oops… 好像出错了:附加数据库对于服务器失败

这是因为权限问题导致的

解决方法:

  1. 在mdf文件所在文件夹右击,属性,安全,编辑,选中Users
  2. 在下面的权限列表中队“完全控制”打钩,确定


再附加一次数据库就搞定了!!

四、The Adventure Works示例数据库

SQL Server还提供了The Adventure Works示例数据库,用户可以到Microsoft Sql Server Database Product Samples网站下载。

SQL2005下载及安装图解\SQL Server2005简体中文开发版下载

SQL 2005 分五个版本,如下所列:

  1.Enterprise(企业版)
2.Development(开发版)
3.Workgroup,(工作群版)
4.Standard,(标准版)
5.Express.(简易版)
但这些版本并不都是免费的。而开发版是很不错的一个免费版本,下面就提供此版本下载。

版本下载

软件名称:  SQL Server 2005 简体中文开发版
软件版本:  完整版(含32位及64位)
软件大小:  1.54GB
软件授权:  免费
操作系统:  Win2000 Win2003 Win2008 WinXP WinVista Win7\8
下载地址:  1:https://pan.baidu.com/s/1miaw46O 密码: abf6

2: https://pan.baidu.com/s/1eR6Mgng 密码: f8iu

 

 

Microsoft微软SQL Server 2005最新Service Pack 3简体中文版For x64(2008年12月16日发布)

 

Microsoft微软SQL Server 2005最新Service Pack 3简体中文版For x64(2008年12月16日发布)微软今天发布了SQL Server 2005 SP3的正式版,而这也将是该软件的最后一次升级服务,不过暂时只有英文版本,需要简体中文版的用户请稍等。SQL Server 2005 SP3版本号9.00.4035,作为一个累计升级包集成了此前所有的更新补丁,能全方位提升SQL Server 2005的各种服务等级,适用于企业版、企业评估版、开发者版、标准版、工作组版等所有商业版本

点我下载: SQLServer2005SP3-KB955706-x64-CHS.exe

 

 

SQL Server 2005 Service Pack 3 安全性更新 (KB970894)

 

 

ORACLE批量更新四种方法比较

同时对多条(w)数据做update操作,我用到了下面的两种方法

前言

其实对表数据做更新一个update操作的事情,为啥还要整出下面的两种方法,之前在工作中测试数据,需要批量对数据做更新,都是在plsql中执行update,有一会遇到数据量稍微大点的,基本就“卡死”在update了。所以对数据量大点的操作基本不推荐直接update,根据测试结果我更偏向第二种方式。

1. Bulk Collect

DECLARE
  TYPE rowid_list IS TABLE OF UROWID INDEX BY BINARY_INTEGER;
  rowid_infos rowid_list;
  i NUMBER;
  CURSOR c_rowids IS SELECT ROWID FROM t_target;
BEGIN
  OPEN c_rowids;
  LOOP
    FETCH c_rowids BULK COLLECT INTO rowid_infos LIMIT 2000;
    FORALL i IN 1..rowid_infos.count
           UPDATE t_target SET DEVICE_MODE = to_char(LENGTH(DEVICE_MODE)+1)
           WHERE ROWID = rowid_infos(i) AND 1 = 1;
    EXIT WHEN ROWid_infos.count < 2000;
  END LOOP;
END;

2. insert append

--创建临时表(不产生undo)
CREATE TABLE T_TARGET_TEMP NOLOGGING AS SELECT * FROM T_TARGET WHERE 1=0;
--写入数据的同时做出更新操作(以不产生undo的方式写入数据)
INSERT /*+append*/INTO T_TARGET_TEMP 
SELECT 
       UUID,
       ASSET_NO,
       FACTORY,
       to_char(LENGTH(DEVICE_MODE)+1),/** 做出修改 */
       RUN_STATUS
FROM t_target;
--提交
COMMIT;
--删除原表
DROP TABLE T_TARGET PURGE;
--更名临时表为源表名
RENAME T_TARGET_TEMP TO T_TARGET;
--修改表结构为归档模式,参数undo
ALTER TABLE T_TARGET LOGGING;
--创建索引
create index IDX_COMM_ADDRESS on T_TARGET (COMM_ADDRESS)
  tablespace EDMP
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 4M
    minextents 1
    maxextents unlimited
  );
....

 

软件环境 Windows 2000 + ORACLE9i
硬件环境 CPU 1.8G + RAM 512M

现在我们有2张表 如下:
T1–大表 10000笔 T1_FK_ID
T2–小表 5000笔   T2_PK_ID
T1通过表中字段ID与T2的主键ID关联

模拟数据如下:
–T2有5000笔数据
create table T2
as
select rownum id, a.*
from all_objects a
where 1=0;

— Create/Recreate primary, unique and foreign key constraints
alter table T2
add constraint T2_PK_ID primary key (ID);

insert /*+ APPEND */ into T2
select rownum id, a.*
from all_objects a where rownum<=5000;

–T1有10000笔数据
create table T1
as
select rownum sid, T2.*
from T2
where 1=0;

— Create/Recreate primary, unique and foreign key constraints
alter table T1
add constraint T1_FK_ID foreign key (ID)
references t2 (ID);

insert /*+ APPEND */ into T1
select rownum sid, T2.*
from T2;

insert /*+ APPEND */ into T1
select rownum sid, T2.*
from T2;

–更新Subobject_Name字段,之前为null
update T2 set T2.Subobject_Name=”StevenHuang”

我们希望能把T1的Subobject_Name字段也全部更新成”StevenHuang”,也就是说T1的10000笔数据都会得到更新

方法一
写PL/SQL,开cursor
declare
l_varID varchar2(20);
l_varSubName varchar2(30);
cursor mycur is select T2.Id,T2.Subobject_Name from T2;

begin
open mycur;
loop
fetch mycur into l_varID,l_varSubName;
exit when mycur %notfound;
update T1 set T1.Subobject_Name = l_varSubName where T1.ID = l_varID;
end loop;
close mycur;
end;
—耗时39.716s
显然这是最传统的方法,如果数据量巨大的话(4000万笔),还会报”snapshot too old”错误退出
方法二.
用loop循环,分批操作

declare 
 i number;
 j number;
begin
i := 1;
j := 0;
select count(*) into j from T1;
loop
exit when i > j;
update T1 set T1.Subobject_Name = (select T2.Subobject_Name from T2 where T1.ID = T2.ID)
where T1.ID >= i and T1.ID <= (i + 1000);
i := i + 1000;
end loop;
end;

–耗时0.656s,这里一共循环了10次,如果数据量巨大的话,虽然能够完成任务,但是速度还是不能令人满意。(例如我们将T1–大表增大到100000笔 T2–小表增大到50000笔
) 耗时10.139s

方法三.
–虚拟一张表来进行操作,在数据量大的情况下效率比方法二高很多
update (select T1.Subobject_Name a1,T2.Subobject_Name b1 from T1,T2 where T1.ID=T2.ID)
set a1=b1;
–耗时3.234s (T1–大表增大到100000笔 T2–小表增大到50000笔)

方法四.
–由于UPDATE是比较消耗资源的操作,会有redo和undo操作,在这个例子里面我们可以换用下面的方法,创建一张新表,因为采用insert比update快的多,之后你会有一张旧表和一张新表,然后要怎么做就具体情况具体分析了~~~~~

create table T3 as select * from T1 where rownum<1;
alter table T3 nologging;
insert /*+ APPEND */ into T3
select T1.* from T1,T2 where T1.ID=T2.ID;
--耗时0.398s (T1--大表增大到100000笔 T2--小表增大到50000笔)
 
 
*以上所有操作都已经将分析执行计划所需的时间排除在外