Submitted by 淡水河边 on 2008, April 3, 9:48 AM
SQL代码
- SELECT * FROM
- (
- SELECT TOP [每页记录] * FROM
- (
- SELECT TOP [每页记录*当前页数] [字段1, 字段2, ...]
- FROM [数据表]
- ORDER BY [排序字段] DESC
- )
- [表别名1]
- ORDER BY [排序字段]
- )
- [表别名2]
- ORDER BY [排序字段] DESC
EX. 从 table 表中获取记录,每页5条记录,结果按照 id 倒序排列。读取到第二页时的sql如下
SQL代码
- SELECT * FROM
- (
- SELECT TOP 5 * FROM
- (
- SELECT TOP 10 *
- FROM table
- ORDER BY id DESC
- ) t1
- ORDER BY id
- ) t2
- ORDER BY id DESC
支持MSSQL,mysql还是用limit,而且mysql不支持top语法。还有这样只是一种偷懒的做法,效率肯定不高。想想看,如果是有几十万条记录,那到最后几页时,那就要先取出几十万的记录再去读取每页的几条,太恐怖了
Tags: limit
网站|数据库类 | 评论:0
| Trackbacks:0
| 阅读:546
Submitted by 淡水河边 on 2008, January 27, 9:52 PM
数据库存储中的数据类型与大小各异。有些地方只存储数字类型,有些只存储文本类型,有些二者而兼之。而很多数据库支持各种专用类型:日期和时间类型,二进制字符类型以及布尔类型。
选择数据类型与数据相匹配是数据库设计中最为重要的部分,因为这种类型将会影响到RDBMS的效率与性能。所以,对RDBMS的数据类型选择应给予足够的重视。
这就是编写本文的主要目的。表A将列举了MySQL支持的绝大部分重要的数据类型,而MySQL是当前最为流行的免费RDBMS。文中还描述了何时与如何使用这些数据类型。这将有助于建立一个数据库的合理设计。
表 A
|
数据类型
|
描述
|
字节
|
推荐使用
|
|
SMALLINT
|
整数,从-32000到 +32000范围
|
2
|
存储相对比较小的整数。
比如: 年纪,数量
|
|
INT
|
整数,从-2000000000 到 +2000000000 范围
|
4
|
存储中等整数
例如: 距离
|
|
BIGINT
|
不能用SMALLINT 或 INT描述的超大整数。
|
8
|
存储超大的整数
例如: 科学/数学数据
|
|
FLOAT
|
单精度浮点型数据
|
4
|
存储小数数据
例如:测量,温度
|
|
DOUBLE
|
双精度浮点型数据
|
8
|
需要双精度存储的小数数据
例如:科学数据
|
|
DECIMAL
|
用户自定义精度的浮点型数据
|
变量;取决于精度与长度
|
以特别高的精度存储小数数据。
例如:货币数额,科学数据
|
|
CHAR
|
固定长度的字符串
|
特定字符串长度(高达255字符)
|
存储通常包含预定义字符串的变量
例如: 定期航线,国家或邮编
|
|
VARCHAR
|
具有最大限制的可变长度的字符串
|
变量; 1 + 实际字符串长度 (高达 255 字符)
|
存储不同长度的字符串值(高达一个特定的最大限度).
例如:名字,密码,短文标签
|
|
TEXT
|
没有最大长度限制的可变长度的字符串
|
Variable; 2 +聽 actual string length
|
存储大型文本数据
例如: 新闻故事,产品描述
|
|
BLOB
|
二进制字符串
|
变量;2 + 实际字符串长度
|
存储二进制数据
例如:图片,附件,二进制文档
|
|
DATE
|
以 yyyy-mm-dd格式的日期
|
3
|
存储日期
例如:生日,产品满期
|
|
TIME
|
以 hh:mm:ss格式的时间
|
3
|
存储时间或时间间隔
例如:报警声,两时间之间的间隔,任务开始/结束时间
|
|
DATETIME
|
以yyyy-mm-ddhh:mm:ss格式结合日期和时间
|
8
|
存储包含日期和时间的数据
例如:提醒的人,事件
|
|
TIMESTAMP
|
以yyyy-mm-ddhh:mm:ss格式结合日期和时间
|
4
|
记录即时时间
例如:事件提醒器,“最后进入”的时间标记
|
|
YEAR
|
以 yyyy格式的年份
|
1
|
存储年份
例如:毕业年,出生年
|
|
ENUM
|
一组数据,用户可从中选择其中一个
|
1或 2个字节
|
存储字符属性,只能从中选择之一
例如:布尔量选择,如性别
|
|
SET
|
一组数据,用户可从中选择其中0,1或更多。
|
从1到8字节;取决于设置的大小
|
存储字符属性,可从中选择多个字符的联合。
例如:多选项选择,比如业余爱好和兴趣。
|
对于一个完整的列表和详细描述,可以查看MySQL manual。你也可以阅读文章Choosing the Right Type for a Column。
from:http://www.aslibra.com/blog/read.php?370
Tags: 数据类型
网站|数据库类 | 评论:0
| Trackbacks:0
| 阅读:580
Submitted by 淡水河边 on 2008, January 27, 9:50 PM
FAQ中文版
- 如何创建自增字段?
- SQLite 支持哪些数据类型?
- 为什么能向 SQLite 数据库的整型字段中插入字符串?
- 为什么 SQLite 认为表达式 '0'=='00' 为真?
- 为什么 SQLite 不允许在同一张表里使用 '0' 和 '0.0' 作为两个不同的行的主键?
- 为什么不能在 Linux box 中读取在 SparcStation 中创建的 SQLite 数据库?
- 多个应用程序或者同一个应用程序的多个例程能同时存取同一个数据库文件吗?
- SQLite是线程安全的吗?
- 如何列出一个 SQLite 数据库中的所有的表/索引?
- SQLite数据库是否有已知的大小限制?
- 在 SQLite 中 VARCHAR 的最大长度是多少?
- SQLite 是否支持 BLOB 类型?
- 如何从一个已存在的 SQLite 数据表中添加/删除字段?
- 我删除了很多数据但是数据库文件并没有减小,是不是 Bug?
- 是否能将 SQLite 用于商业用途而不用交版权费用?
- 我如何使用含有单引号(')的字符串?
- SQLITE_SCHEMA 错误代表什么?
- 为什么ROUND(9.95,1) 返回 9.9 而不是 10.0? 难道9.95 不该向上进位么?
» 阅读全文
Tags: sqlite
网站|数据库类 | 评论:0
| Trackbacks:0
| 阅读:1037
Submitted by 淡水河边 on 2007, October 23, 7:32 PM
mysql数据库一旦大了,进行导入操作时都容易产生超时,从而失败。而BigDump就是用来解决这个问题的。
» 阅读全文
Tags: mysql, 导入, 数据导入
网站|数据库类 | 评论:0
| Trackbacks:0
| 阅读:999
Submitted by 淡水河边 on 2007, September 5, 12:44 PM
导入导出大型MYSQL数据库或者恢复大的SQL数据,可以使用SQLyog。淡水河边还没试过。记下备用。
» 阅读全文
Tags: 导入, 导出, 乱码
网站|数据库类 | 评论:0
| Trackbacks:0
| 阅读:1458
Submitted by on 2007, July 11, 1:29 AM
建立和使用索引有哪些注意事项:
1、索引要建立在经常进行select操作的字段上。这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
2、索引要建立在值比较唯一的字段上。这样做才是发挥索引的最大效果。,比如主键的id字段,唯一的名字name字段等等。如果索引建立在唯一值比较少的字段,比如性别gender字段,寥寥无几的类别字段等,刚索引几乎没有任何意义。
3、对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少。
4、当修改性能远远大于检索性能时,不应该创建索引。修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
5、在Where和JOIN中出现的列需要建立索引。
6、在以通配符 % 和 _ 开头作查询时,MySQL索引是无效的。但是这样索引是有效的:select * from tbl1 where name like "xxx%",所以谨慎的写你的SQL是很重要的。
用一个例子详细说明单列索引与组合索引的区别及索引使用中的一些细节
建一个表:
| 代码: |
Create TABLE myIndex (
i_testID INT NOT NULL AUTO_INCREMENT,
vc_Name VARCHAR(50) NOT NULL,
vc_City VARCHAR(50) NOT NULL,
i_Age INT NOT NULL,
i_SchoolID INT NOT NULL,
PRIMARY KEY (i_testID)
); |
在这10000条记录里面7上8下地分布了5条vc_Name="erquan"的记录,只不过city,age,school的组合各不相同。来看这条T-SQL:
| 代码: |
| Select i_testID FROM myIndex Where vc_Name="erquan" AND vc_City="郑州" AND i_Age=25; |
首先考虑建单列索引:
在vc_Name列上建立了索引。执行T-SQL时,MYSQL很快将目标锁定在了vc_Name=erquan的5条记录上,取出来放到一中间 结果集。在这个结果集里,先排除掉vc_City不等于"郑州"的记录,再排除i_Age不等于25的记录,最后筛选出唯一的符合条件的记录。
虽然在vc_Name上建立了索引,查询时MYSQL不用扫描整张表,效率有所提高,但离我们的要求还有一定的距离。同样的,在vc_City和i_Age分别建立的单列索引的效率相似。
为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将vc_Name,vc_City,i_Age建到一个索引里:
| 代码: |
| Alter TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age); |
注意了,建表时,vc_Name长度为50,这里为什么用10呢?因为一般情况下名字的长 度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高Insert的更新速度。
执行T-SQL时,MySQL无须扫描任何记录就到找到唯一的记录!!
肯定有人要问了,如果分别在vc_Name,vc_City,i_Age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率一样 吧?嘿嘿,大不一样,远远低于我们的组合索引~~虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。
建立这样的组合索引,其实是相当于分别建立了
| 代码: |
vc_Name,vc_City,i_Age
vc_Name,vc_City
vc_Name |
这样的三个组合索引!为什么没有vc_City,i_Age等这样的组合索引呢?这是因为mysql组合索引"最左前缀"的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个T-SQL会用到:
| 代码: |
Select * FROM myIndex WHREE vc_Name="erquan" AND vc_City="郑州"
Select * FROM myIndex WHREE vc_Name="erquan" |
而下面几个则不会用到:
| 代码: |
Select * FROM myIndex WHREE i_Age=20 AND vc_City="郑州"
Select * FROM myIndex WHREE vc_City="郑州" |
Tags: 索引
网站|数据库类 | 评论:0
| Trackbacks:0
| 阅读:1188
Submitted by on 2006, November 22, 8:27 PM
引用
找了很久,終於找到,金碟用的是ACCESS庫,怪不得........經常沒反應!!!
方法一:安装的是Office97/2000
第一步:建立数据库联结:运行office安装目录下的MS Access Workgroup
Administrator 文件,存取工作组管理员→ 联结→ 浏览→ 在左列的“文件类型”中,
选择“加载项文件*.mda”→ 在右列的“文件夹”中选择“金蝶软件安装路径”→ 在左列
的“文件类型”下会出现“system.mda”→ 选择“system.mda”→ 确定后退出。
第二步:打开帐套文件:打开access,文件→ 打开,选择“金蝶软件安装路径”,
在文件类型中选择“所有文件”,在列出的文件中选择“*.ais”→ 在出现的对话框中
输入access用户名:morningstar,口令ypbwkfyjhyhgzj→ 确定。
7.3以前版本的数据库都是Office97,KIS7.4是Office2000的.
方法二:安装的是OfficeXP或者Office2003
第一步:建立数据库联结打开ACCESS2003,选择"工具->安全->工作组管理员",
打开一个对话框,点击"加入-浏览",在“文件类型”中,选择“所有文件”→ 在“文件夹”
中选择“金蝶软件安装路径”→ 在列出的文件中选择“system.mda”→ 确定后退出。
第二步:打开帐套文件打开access,文件→ 打开,选择金蝶帐套所在文件夹,
在文件类型中选择“所有文件”,在列出的文件中选择“*.ais”→ 在出现的对话框中
输入access用户名:morningstar,口令:ypbwkfyjhyhgzj→ 确定。打开过程中有
安全警告,不管他.OK
KIS7.5版本数据库都是Office2003的.
淡水河边这厮在考虑,这样是不是就可以结合起来写OA方便了.可以偿试使用WEB访问了.
Tags: 金蝶
网站|数据库类 | 评论:3
| Trackbacks:0
| 阅读:2377
Submitted by on 2006, July 26, 10:10 PM
PHP+MySQL+Linux目前已逐渐成为小型web服务器的一种经典组合。在indows环境下构筑和调试MySQL数据库是许多网站开发者的一种首选。本人在Windows98环境下初学MySQL,现将学习过程与经验总结出来供大家参考。
1、下载mysql-3.23.35-win.zip并解压;
2、运行setup.exe;选择d:\mysql,"tyical install"
3、启动mysql,有如下方法:
方法一:使用winmysqladmin
1)、进入d::\mysql\bin目录,运行winmysqladmin.exe,在屏幕右下角的任务栏内会有一个带红色的图符
2)、鼠标左键点击该图符,选择“show me”,出现“WinMySQLAdmin”操作界面;首次运行时会中间会出现一个对话框要求输入并设置你的用户名和口令
3)、选择“My.INI setup”
4)、在“mysqld file”中选择“mysqld-opt”(win9x)或“mysqld-nt”(winNT)
5)、选择“Pick-up or Edit my.ini values”可以在右边窗口内对你的my.ini文件进行编辑
6)、选择“Save Modification”保存你的my.ini文件
7)、如果你想快速使用winmysqladmin(开机时自动运行),选择“Create ShortCut on Start Menu”
8)、测试:
进入DOS界面;
在d:\mysql\bin目录下运行mysql,进入mysql交互操作界面
输入show databases并回车,屏幕显示出当前已有的两个数据库mysql和test
方法二:不使用winmysqladmin
1)、在DOS窗口下,进入d:/mysql/bin目录
2)、win9X下)运行:
mysqld
在NT下运行:
mysqld-nt --standalone
3)、此后,mysql在后台运行
4)、测试mysql:(在d:/mysql/bin目录下)
a)、mysqlshow
正常时显示已有的两个数据库mysql和test
b)、mysqlshow -u root mysql
正常时显示数据库mysql里的五个表:
columns_priv
db
host
tables_priv
user
c)、mysqladmin version status proc
显示版本号、状态、进程信息等
d)、mysql test
进入mysql操作界面,当前数据库为test
5)、mysql关闭方法:
mysqladmin -u root shutdown
4、至此,MySQL已成功安装,接着可以熟悉MySQL的常用命令并创建自己的数据库了。
网站|数据库类 | 评论:0
| Trackbacks:0
| 阅读:1422
Submitted by on 2006, July 26, 10:10 PM
上篇讲了如何安装并测试MySQL,环境建好后就可以继续我们的学习了。本篇主要熟悉一写常用命令。
1、启动MySQL服务器
实际上上篇已讲到如何启动MySQL。两种方法:
一是用winmysqladmin,如果机器启动时已自动运行,则可直接进入下一步操作。
二是在DOS方式下运行
d:mysqlbinmysqld
2、进入mysql交互操作界面
在DOS方式下,运行:
d:mysqlbinmysql
出现:
mysql
的提示符,此时已进入mysql的交互操作方式。
如果出现 "ERROR 2003: Can"t connect to MySQL server on "localhost" (10061)“,
说明你的MySQL还没有启动。
3、退出MySQL操作界面
在mysql>提示符下输入quit可以随时退出交互操作界面:
mysql> quit
Bye
你也可以用control-D退出。
4、第一条命令
mysql> select version(),current_date();
+----------------+-----------------+
| version() | current_date() |
+----------------+-----------------+
| 3.23.25a-debug | 2001-05-17 |
+----------------+-----------------+
1 row in set (0.01 sec)
mysql>
此命令要求mysql服务器告诉你它的版本号和当前日期。尝试用不同大小写操作上述命令,看结果如何。
结果说明mysql命令的大小写结果是一致的。
练习如下操作:
mysql>Select (20+5)*4;
mysql>Select (20+5)*4,sin(pi()/3);
mysql>Select (20+5)*4 AS Result,sin(pi()/3); (AS: 指定假名为Result)
5、多行语句
一条命令可以分成多行输入,直到出现分号“;”为止:
mysql> select
-> USER()
-> ,
-> now()
->;
+--------------------+---------------------+
| USER() | now() |
+--------------------+---------------------+
| ODBC@localhost | 2001-05-17 22:59:15 |
+--------------------+---------------------+
1 row in set (0.06 sec)
mysql>
注意中间的逗号和最后的分号的使用方法。
6、一行多命令
输入如下命令:
mysql> Select USER(); Select NOW();
+------------------+
| USER() |
+------------------+
| ODBC@localhost |
+------------------+
1 row in set (0.00 sec)
+---------------------+
| NOW() |
+---------------------+
| 2001-05-17 23:06:15 |
+---------------------+
1 row in set (0.00 sec)
mysql>
注意中间的分号,命令之间用分号隔开。
7、显示当前存在的数据库
mysql> show databases;
+----------+
| Database |
+----------+
| mysql|
| test |
+----------+
2 row in set (0.06 sec)
mysql>
8、选择数据库并显示当前选择的数据库
mysql> USE mysql
Database changed
mysql>
(USE 和 QUIT 命令不需要分号结束。)
mysql> select database();
+---------------+
| database()|
+---------------+
| mysql |
+---------------+
1 row in set (0.00 sec)
9、显示当前数据库中存在的表
mysql> SHOW TABLES;
10、显示表(db)的内容
mysql>select * from db;
11、命令的取消
当命令输入错误而又无法改变(多行语句情形)时,只要在分号出现前就可以用 c来取消该条命令
mysql> select
-> user()
-> c
mysql>
这是一些最常用的最基本的操作命令,通过多次练习就可以牢牢掌捂了。
网站|数据库类 | 评论:0
| Trackbacks:0
| 阅读:1331
Submitted by on 2006, July 26, 10:09 PM
了解了一些最基本的操作命令后,我们再来学习如何创建一个数据库和数据库表。
1、使用SHOW语句找出在服务器上当前存在什么数据库:
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql|
| test |
+----------+
3 rows in set (0.00 sec)
2、创建一个数据库abccs
mysql> Create DATABASE abccs;
注意不同操作系统对大小写的敏感。
3、选择你所创建的数据库
mysql> USE abccs
Database changed
此时你已经进入你刚才所建立的数据库abccs.
4、 创建一个数据库表
首先看现在你的数据库中存在什么表:
mysql> SHOW TABLES;
Empty set (0.00 sec)
说明刚才建立的数据库中还没有数据库表。下面来创建一个数据库表mytable:
我们要建立一个你公司员工的生日表,表的内容包含员工姓名、性别、出生日期、出生城市。
mysql> Create TABLE mytable (name VARCHAR(20), sex CHAR(1),
-> birth DATE, birthaddr VARCHAR(20));
Query OK, 0 rows affected (0.00 sec)
由于name、birthadd的列值是变化的,因此选择VARCHAR,其长度不一定是20。可以选择从
1到255的任何长度,如果以后需要改变它的字长,可以使用Alter TABLE语句。);
性别只需一个字符就可以表示:"m"或"f",因此选用CHAR(1);
birth列则使用DATE数据类型。
创建了一个表后,我们可以看看刚才做的结果,用SHOW TABLES显示数据库中有哪些表:
mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| mytables|
+---------------------+
5、显示表的结构:
mysql> DESCRIBE mytable;
+-------------+-------------+------+-----+---------+-------+
| Field | Type| Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| name| varchar(20) | YES | | NULL| |
| sex | char(1) | YES | | NULL| |
| birth | date| YES | | NULL| |
| deathaddr | varchar(20) | YES | | NULL| |
+-------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
6、 往表中加入记录
我们先用Select命令来查看表中的数据:
mysql> select * from mytable;
Empty set (0.00 sec)
这说明刚才创建的表还没有记录。
加入一条新记录:
mysql> insert into mytable
-> values ("abccs","f","1977-07-07","china");
Query OK, 1 row affected (0.05 sec)
再用上面的Select命令看看发生了什么变化。
我们可以按此方法一条一条地将所有员工的记录加入到表中。
7、用文本方式将数据装入一个数据库表
如果一条一条地输入,很麻烦。我们可以用文本文件的方式将所有记录加入你的数据库表中。
创建一个文本文件“mysql.txt”,每行包含一个记录,用定位符(tab)把值分开,并且以在
Create TABLE语句中列出的列次序给出,例如:
abccs f 1977-07-07 china
mary f 1978-12-12 usa
tom m 1970-09-02 usa
使用下面命令将文本文件“mytable.txt”装载到mytable表中:
mysql> LOAD DATA LOCAL INFILE "mytable.txt" INTO TABLE pet;
再使用如下命令看看是否已将数据输入到数据库表中:
mysql> select * from mytable;
网站|数据库类 | 评论:0
| Trackbacks:0
| 阅读:1343