Skip navigation.

王志军个人空间

工作、生活、健康

Posts tagged with "Database"

PL/SQL issues

when loading procedure/function,

SQL> CREATE OR REPLACE PROCEDURE compute_intensive_program
Warning: Procedure created with compilation errors.
SQL> SHOW ERRORS -- show the details of error message

if Oracle reports ``error PLS-00103'', you should type:
oerr PLS 00103

when error "PLS-00201: identifier 'DBMS_LOCK' must be declared" occurs, you may grant privilege to the specific user/public.
SQL> grant execute on dbms_lock to luser; -- schema who owns procedure
or
SQL> grant execute on dbms_lock to public;

相关链接:
http://w2.syronex.com/jmr/edu/db/introduction-to-plsql/
http://www.oracle.com/technology/oramag/oracle/06-jul/o46plsql.html

http://www.orafaq.com/forum/t/65567/0/

MySQL设置root密码后,PHP网页无法连接数据库。

URL: http://www.openphp.cn/index.php?module=article&id=132

root用户密码为空时,php网页能够打开;设置root密码后,网页无法连接数据库。
此问题仅在Windows操作系统中出现,Linux操作系统正常。

  在更新到 4.1.17 版本的 MySQL 后,发现需要使用 MySQLi 扩展方能正常使用数据库,否则会出现 1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client 的提示,这个很纳闷,我没有研究具体的问题,只是切换到 MySQLi 扩展,其实在给 root 加上密码前还是可以使用 MySQL 扩展的,可是给 root 加上密码后就出现了上述客户端版本太低的提示。

  目前已知解决方法:

先用root登录MYSQL服务器,执行

mysql>set password for user1@"localhost"=old_password('yourPassword');

  原因是因为你使用的mysql服务器版本中使用了新的密码验证机制,这需要客户端的版本要在4.0以上,原来的密码函数被改为 old_password();,这样使用password()生成的密码在旧的版本上的客户端就不好使了,而PHP中的MYSQL客户端都是3.23的 (当然,mysqli的扩展除外),问题就在这了。

MYSQL导入导出常用命令!

几个常用用例:

一、备份数据库:(命令在DOS的mysql\bin目录下执行)
mysqldump --opt school>school.bbb
注释:将数据库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。
1.导出整个数据库
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u root -p aikersql> aiker.sql
2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u aiker -p aikersql users> aiker_users.sql
3.导出一个数据库结构
mysqldump -u root -p -d --add-drop-table aikersql>d:\aiker_db.sql

-d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table

二.导入数据库
常用source 命令
进入mysql数据库控制台,如mysql -u root -p

mysql>use 数据库

然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source d:\aiker_db.sql

也可以用 mysql -uroot -Ddb1 <d:\aiker_db.sql

三、将文本数据转到数据库中
1、文本数据应符合的格式:字段数据之间用tab键隔开,null值用n来代替.
例:
3 rose 深圳二中 1976-10-10
4 mike 深圳一中 1975-12-23
2、数据传入命令 load data local infile "文件名" into table 表名;
注意:你最好将文件复制到mysqlbin目录下,并且要先用use命令打表所在的库。



数据导出
  数据导出主要有以下几种方法:
  使用select into outfile "filename"语句
  使用mysqldump实用程序
使用phpmyadmin导入
例如:mysql> select * from driver into outfile "a.txt";

导入
  同导出相类似,导入也有两种方法:
使用LOAD DATA INFILE "filename"命令
使用mysqlimport实用程序
使用phpmyadmin导入
使用sql文件


From MySQL数据导入与导出

相关链接:
MySQL数据库中mysqldump命令使用详解

MySQL4.1.*和Phpmyadmin乱码问题

参见http://www.phpchina.cn/viewarticle.php?id=1584
http://dev.mysql.com/doc/refman/4.1/en/charset-connection.html
http://my.opera.com/jamesliu/blog/show.dml/192803

3.将以前的mysql3的库文件导入mysql4.1的库
有两种情况:
一是从phpmyadmin上导入,这时候你要注意的是在选择库文件的页面左下脚有个“文件的字符集:”,默认是utf8,要改成gb2312,否则导进去乱码;
二是在linux下导入,这时候你需要先在库文件的头部加一行:
SET NAMES 'gb2312'; 注意最后也是;号,别漏了。
然后执行mysql -u用户名 -p密码 xxx.sql > 库名
导入完成以后再用phpmyadmin打开看,里面的中文字就是正确的。
4.从mysql4.1里导出库文件
一.用phpmyadmin导出
导出倒是问题不大,如果phpmyadmin的浏览页面里显示的中文是正常的,那么导出肯定也是正常的
二.在linux上导出
如果用mysqldump导出出现了乱码也没有关系,可以运行iconv来转换一下
iconv -c -f UTF-8 -t GB2312 库文件名 > 新的gb2312的库文件名

综上所述,你要注意:
1。尽量在需要导入的库文件的开头加入SET NAMES 'gb2312';告诉mysql你要导入的是一个gb2312的文件;
2。可能你需要这个:
SET NAMES 'utf8';
在登陆到mysql后用,把character的一些默认参数改到utf8上,有时可以减少一些困扰,不过也不是必须的。
在mysql上使用:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
用来查看当前的状态。
3.如果出现乱码也不要怕,一是你要注意留存原有的备份,二是用iconv来进行转化。
在正常使用之前注意做导入导出的测试,确保万无一失。



这样可以使phpmyadmin显示字符正常,但从mysql4.1.16导出的是乱码。

SQL

Sql联合查询

UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询。UNION的语法格式为:

select_statement

UNION [ALL] selectstatement

[UNION [ALL] selectstatement][…n]

其中selectstatement为待联合的SELECT查询语句。

ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一行。

联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。

在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。

在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:

查询1 UNION (查询2 UNION 查询3)



Sql连接查询

通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。

连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。

SQL-92标准所定义的FROM子句的连接语法格式为:

FROM join_table join_type join_table

[ON (join_condition)]

其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。

join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。

外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。

无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:

SELECT p1.pub_id,p2.pub_id,p1.pr_info

FROM pub_info AS p1 INNER JOIN pub_info AS p2

ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)


(一)内连接

内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:

1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。

2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。

3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。

例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:

SELECT *

FROM authors AS a INNER JOIN publishers AS p

ON a.city=p.city

又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):

SELECT a.*,p.pub_id,p.pub_name,p.country

FROM authors AS a INNER JOIN publishers AS p

ON a.city=p.city


(二)外连接

内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。

如下面使用左外连接将论坛内容和作者信息连接起来:

SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b

ON a.username=b.username

下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:

SELECT a.*,b.*

FROM city as a FULL OUTER JOIN user as b

ON a.username=b.username


(三)交叉连接

交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等

于6*8=48行。

SELECT type,pub_name

FROM titles CROSS JOIN publishers

ORDER BY type

Redhat Enterprise Linux Advanced Server 4上安装MYSQL+APACHE+PHP+ZEND问题

, ,

周末在家坐了两天,历尽千辛万苦终于把这些东西配好了,再回首,荆棘密布啊!以下是我的安装笔记,
详细的步骤就不写了,网上到处都是教程,我只把遇到的一些困难及解决办法写出来,加深一些印象,
也让和我遇到相同困难的朋友们少走些弯路。


1.安装前先看一下服务器上有没有编译软件,没有的话先装一个gcc,我装的是gcc4.0的rpm包。

2.rpm包可以到http://www.findrpm.com上找,装gc...??方法参考
网上教程。(装包:rpm ivh 包名、删包 rpm -e 包名、查询 rpm -qa|grep 包名、详细信息 rpm -q 包名 i、
文件列表 rpm -q 包名 l)。

3.apache,mysql,php这三个就不要用rpm包了,因为你需要根据自己的情况作具体配置。

4.先装MySQL,这个东西最好不要自己编译,我开始自己编译了很多次都没成功,估计是gcc的版本太高所致,官方
网站上推荐用gcc2.95 2.96 3.2什么的。直接下载二进制包要省事的多,二进制包里面有一个安装说明文件,按照那个
一步一步来就ok了,一般都是装在/usr/local/mysql下。解包 tar zxvf 包名

5.mysql装完以后,可以ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql 做一个连接,以后在任何路径下都可以执行mysql了。

6.mysql装好以后别忘了修改root密码,把user表就留一个root@localhost就行了,其他都删掉,以后需要再慢慢加,一定要给php
连接数据库建一个用户,只分配必要的权限。记得修改mysql授权表后要 flush privileges 刷新权限。
修改密码#mysqladmin -u root -p oldpassword newpasswd
分配权限mysql>GRANT 权限 ON 库名.表名 TO 用户名@主机名 IDENTIFIED BY "密码" [WITH GRANT OPTION]
权限有这些:
ALTER 修改表和索引 / CREATE 创建数据库和表 / DELETE 删除表中已有的记录 / DROP 抛弃(删除)数据库和表
INDEX 创建或抛弃索引 / INSERT 向表中插入新行 / REFERENCE 未用 / SELECT 检索表中的记录 / UPDATE 修改现存表记录
FILE 读或写服务器上的文件 / PROCESS 查看服务器中执行的线程信息或杀死线程
RELOAD 重载授权表或清空日志、主机缓存或表缓存。 / SHUTDOWN 关闭服务器 / ALL 所有;ALL PRIVILEGES同义词
USAGE 特殊的“无权限”权限

7.如果你装的是php4.X,那么要改一下mysql密码的加密算法,用 update user set password=old_password('password') where user='root';
改成老的算法,不然php是连接不上数据库的。如果是php5就不用改了。

8.然后装GD库,这个网上也有不少教程,装GD库之前要装很多东西,有gd-devel,xpm,ZLIB,JPEGSRC,LIBPNG啥的,都有现成
的rpm包,需要什么就装什么,最后再装GD2,我是下载原文件编译的,在这里下http://www.boutell.com/gd/
#tar zxvf gd-2.0.28.tar.gz
#cd gd-2.0.28
#./configure --with-png=/usr/local --with-jpeg=/usr/local --with-freetype=/usr
#make
#make install
编译过程很顺利,直接装rpm估计也可以。

9.然后装apache2,这个强烈推荐自己编译,我开始装了rpm的,很顺利,可后来装php的时候发现不能动态加载模块,造成php不能加载mysql,
万般无奈只好返工。顺便说一句apache从2以后改名叫httpd了,我装的是httpd-2.0.55.tar.gz
#tar zxvf httpd-2.0.50.tar.gz
#cd httpd-2.0.50
#./configure --prefix=/usr/local/apache2 --enable-module=so
#make
#make install
--enable-module=so就是动态加载模块用的,编译基本顺利,如果发现缺少什么软件就从rpm包里面找。
./configure --help可以查看配置参数列表。

10.在每次编译之前,最好先运行 make clean 或者 make distclean 来清除先前的编译环境。

11.apache装好后启动一下试试 /usr/local/httpd/bin/apachectl start,不报错就ok了。可以在浏览器上输入网址,应该可以看到apache的默认页。

12.最关键的就是装php了,我的配置命令:
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/httpd/bin/apxs --with-jpeg-dir=/usr/local --with-png-dir=/usr/local --with-gd=/usr/local --enable-trace-vars --with-zlib-dir=/usr/local --with-mysql=/usr/local/mysql --with-freetype-dir=/usr/lib/ --enable-gd-native-ttf
在configure时的提示信息:
Configuring extensions
checking whether to enable LIBXML support... yes
checking libxml2 install dir... /usr/lib/libxml2.so.2.6.19
configure: error: xml2-config not found. Please check your libxml2 installation.
可是libxml2的rpm包我已经装了,经过反复查找问题,发现libxml2-devel没有装,下载一个rpm包装上ok!还是那句话:缺什么就装什么。
装完php后,重启apache,出现了一个难题,显示:
Syntax error on line 232 of /usr/local/apache/conf/httpd.conf:
Cannot load /usr/local/apache/modules/libphp5.so into server: /usr/local/apache/ modules/libphp5.so: cannot restore segment prot after reloc: Permission denied
上网查找n小时,终于找到答案,原来新版的Linux有一个SELinux保护模式,像个防火墙,是用来提高安全性的,可以让工作进程在一定范围内受限,
如果开启这个模式很多程序运行就会受限,具体情况我还没有深入了解,不过总算找到解决办法了:
执行 chcon libphp5.so -t shlib_t 问题解决,不过chcon的具体作用我还不太了解。
可以用 system-config-securitylevel 暂时关掉SELinux模式,不然apache很可能不能正常运行,等我把SELinux的详细配置规则弄明白再开启吧。
php装好以后需要修改一下/usr/local/httpd/conf/httpd.conf配置文件,增加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
默认的启动页增加一个index.php ,apache详细的配置优化过程请参考相关文档。
重启apache,然后就可以写一个测试页测试一下了 ,如果熟悉的紫色表格出现就基本ok了,仔细看一下该装的模块是否都加载了,GD,mysql什么的,
然后写一个连接数据库的代码:
@$db = mysql_connect("localhost","user","password");
if(!$db)
{
echo 'connect fail:'.mysql_error();
}
else
{
echo 'connect ok!';
}
?>
如果显示connect ok!就ok,否则根据错误信息解决。

13.然后要装的是ZendOptimizer,这个东西可以提高30%-40%的程序执行速度,不过我装这个主要是因为phpwind是用zend-encode加了密的,要用这个解密,
不然页面都是乱码,类似这样:
Zend 2000112002110894895x?? 峐mO???R?$Z夸舃!?_6&獇?um............
ZendOptimizer安装是傻瓜型的,非常简单:
#tar zxvf ZendOptimizer-2.5.10a-linux-glibc21-i386.tar.gz
#cd ZendOptimizer-2.5.10a-linux-glibc21-i386
#./install.sh
根据提示一路ok,重启apache后,如果没问题,phpinfo里应该显示:
This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.0.5, Copyright (c) 1998-2004 Zend Technologies
with Zend Extension Manager v1.0.8, Copyright (c) 2003-2005, by Zend Technologies
with Zend Optimizer v2.5.10, Copyright (c) 1998-2005, by Zend Technologies
可是问题偏偏就来了,我的只显示:
This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.0.5, Copyright (c) 1998-2004 Zend Technologies with Zend Extension Manager v1.0.8, Copyright (c) 2003-2005。
phpwind依然是乱码,说明Zend Optimizer没有加载成功!又经过n小时查找终于发现apache的错误日志里有:
Failed loading /usr/local/Zend/lib/Optimizer-2.5.10/php-5.0.x/ZendOptimizer.so: /usr/local/Zend/lib/Optimizer-2.5.10/php-5.0.x/ZendOptimizer.so: cannot restore segment prot after reloc: Permission denied
原来还是SELinux的问题!
执行 chcon ZendOptimizer.so -t shlib_t 问题解决。

Varchar与char的区别

Varchar 对每个英文(ASCII)字符都占用2个字节,对一个汉字也只占用两个字节
char 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节
Varchar 的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就是"qian"
而char 不一样,比如char(100),它的值是"qian",而实际上它在数据库中是"qian "(qian后共有96个空格,就是把它填满为100个字节)。

由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉!

MySQL初学者使用指南

一、连接MYSQL

  格式: mysql -h主机地址 -u用户名 -p用户密码

  1、例1:连接到本机上的MYSQL。

  首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:mysql>

  2、例2:连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:

  mysql -h110.110.110.110 -uroot -pabcd123

  (注:u与root可以不用加空格,其它也一样)

  3、退出MYSQL命令: exit (回车)

二、修改密码

  格式:mysqladmin -u用户名 -p旧密码 password 新密码

  1、例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令

  mysqladmin -uroot -password ab12

  注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。

  2、例2:再将root的密码改为djg345。

  mysqladmin -uroot -pab12 password djg345


三、增加新用户(注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)

  格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"

  例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL,然后键入以下命令:
  grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";
  但例1增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见例2。

  例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。

  grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";

  如果你不想test2有密码,可以再打一个命令将密码消掉。

  grant select,insert,update,delete on mydb.* to test2@localhost identified by "";


  下面来看看MYSQL中有关数据库方面的操作。注意:必须首先登录到MYSQL中,以下操作都是在MYSQL的提示符下进行的,而且每个命令以分号结束。

四、操作技巧

  1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。

  2、你可以使用光标上下键调出以前的命令。但以前我用过的一个MYSQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win。

五、显示命令

  1、显示数据库列表。
  show databases;
  刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。

  2、显示库中的数据表:
  use mysql; //打开库,学过FOXBASE的一定不会陌生吧
  show tables;

  3、显示数据表的结构:
  describe 表名;

  4、建库:
  create database 库名;

  5、建表:
  use 库名;
  create table 表名 (字段设定列表);

  6、删库和删表:
  drop database 库名;
  drop table 表名;

  7、将表中记录清空:
  delete from 表名;

  8、显示表中的记录:
  select * from 表名;

六、一个建库和建表以及插入数据的实例

drop database if exists school; //如果存在SCHOOL则删除
create database school; //建立库SCHOOL
use school; //打开库SCHOOL
create table teacher //建立表TEACHER
(
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default '深圳',
year date
); //建表结束
//以下为插入字段
insert into teacher values('','glchengang','深圳一中','1976-10-10');
insert into teacher values('','jack','深圳一中','1975-12-23');

 注:在建表中:
  (1)将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key。
  (2)将NAME设为长度为10的字符字段。
  (3)将ADDRESS设为长度50的字符字段,而且缺省值为深圳。varchar和char有什么区别呢,只有等以后的文章再说了。
  (4)将YEAR设为日期字段。

  如果你在mysql提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql,然后复制到c:\下,并在DOS状态进入目录\mysql\bin,然后键入以下命令:
  mysql -uroot -p密码 < c:\school.sql
  如果成功,空出一行无任何显示;如有错误,会有提示。(以上命令已经调试,你只要将//的注释去掉即可使用)。

七、将文本数据转到数据库中

  1、文本数据应符合的格式:字段数据之间用tab键隔开,null值用\n来代替.
  例:
   3 rose 深圳二中 1976-10-10
   4 mike 深圳一中 1975-12-23

  2、数据传入命令 load data local infile "文件名" into table 表名;
  注意:你最好将文件复制到\mysql\bin目录下,并且要先用use命令打表所在的库 。

八、备份数据库:(命令在DOS的\mysql\bin目录下执行)

  mysqldump --opt school>school.bbb
  注释:将数据库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。

  后记:其实MYSQL的对数据库的操作与其它的SQL类数据库大同小异,最好找本将SQL的书看看。在这里只介绍一些基本的。最好的MYSQL教程还是 "晏子"译的"MYSQL中文参考手册"不仅免费,每个相关网站都有下载,而且它是最权威的。(down load here)

Mysql 学习笔记

1、安装环境:
Windows XP
Mysql 4.0.17 从 http://www.mysql.com下载
EMS Mysql Query 1.6.0.1
本机IP:172.5.1.183
2、安装Mysql,采用默认安装即可
目录选择在c:mysql,不要修改默认目录
3、启动Mysql
安装为服务:c:mysqlbinmysqld --install
启动Mysql: net start mysql
停止Mysql: net stop mysql
4、系统创建的数据库有mysql,test
mysql保存系统数据
test数据库用来测试
5、默认登陆方式
在本机
c:mysqlbinmysql -uroot
c:mysqlbinmysql
远程
mysql -h 172.5.1.183 -uroot

这些是在mysql.user表中,系统默认存在4条数据
use mysql
select host,user,password from user;
+-----------+------+----------+
| host | user | password |
+-----------+------+----------+
| localhost | root | |
| % | root | |
| localhost | | |
| % | | |
+-----------+------+----------+

这些数据代表的意义:
用户名为root,密码为空的用户可以从本机和任何远程主机登陆
任何用户名,密码为空的用户可以从本机登陆
用户名为空,密码为空的用户不可以从远程登陆 (user中后面的字段为N,所以无法登陆)
修改root密码
mysql -uroot
use mysql
update user set password=PASSWORD("root";) where user='root' and host='localhost'
下次就需要用mysql -uroot -proot才可以登陆
在远程或本机可以使用 mysql -h 172.5.1.183 -uroot 登陆,这个根据第二行的策略确定
权限修改生效:
1)net stop mysql
net start mysql
2)c:mysqlbinmysqladmin flush-privileges
3)登陆mysql后,用flush privileges语句
6、创建数据库staffer
create database staffer;
7、下面的语句在mysql环境在执行
显示用户拥有权限的数据库 show databases;
切换到staffer数据库 use staffer;
显示当前数据库中有权限的表 show tables;
显示表staffer的结构 desc staffer;
8、创建测试环境
1)创建数据库staffer
mysql> create database staffer
2)创建表staffer,department,position,depart_pos
create table s_position
(
id int not null auto_increment,
name varchar(20) not null default '经理', #设定默认值
description varchar(100),
primary key PK_positon (id) #设定主键
);
create table department
(
id int not null auto_increment,
name varchar(20) not null default '系统部', #设定默认值
description varchar(100),
primary key PK_department (id) #设定主键
);
create table depart_pos
(
department_id int not null,
position_id int not null,
primary key PK_depart_pos (department_id,position_id) #设定复和主键
);
create table staffer
(
id int not null auto_increment primary key, #设定主键
name varchar(20) not null default '无名氏', #设定默认值
department_id int not null,
position_id int not null,
unique (department_id,position_id) #设定唯一值
);
3)删除
mysql>
drop table depart_pos;
drop table department;
drop table s_position;
drop table staffer;
drop database staffer;
9、修改结构
mysql>
#表position增加列test
alter table position add(test char(10));
#表position修改列test
alter table position modify test char(20) not null;
#表position修改列test默认值
alter table position alter test set default 'system';
#表position去掉test默认值
alter table position alter test drop default;
#表position去掉列test
alter table position drop column test;
#表depart_pos删除主键
alter table depart_pos drop primary key;
#表depart_pos增加主键
alter table depart_pos add primary key PK_depart_pos (department_id,position_id);
10、操作数据
#插入表department
insert into department(name,description) values('系统部','系统部');
insert into department(name,description) values('公关部','公关部');
insert into department(name,description) values('客服部','客服部');
insert into department(name,description) values('财务部','财务部');
insert into department(name,description) values('测试部','测试部');
#插入表s_position
insert into s_position(name,description) values('总监','总监');
insert into s_position(name,description) values('经理','经理');
insert into s_position(name,description) values('普通员工','普通员工');
#插入表depart_pos
insert into depart_pos(department_id,position_id)
select a.id department_id,b.id postion_id
from department a,s_position b;
#插入表staffer
insert into staffer(name,department_id,position_id) values('陈达治',1,1);
insert into staffer(name,department_id,position_id) values('李文宾',1,2);
insert into staffer(name,department_id,position_id) values('马佳',1,3);
insert into staffer(name,department_id,position_id) values('亢志强',5,1);
insert into staffer(name,department_id,position_id) values('杨玉茹',4,1);
11、查询及删除操作
#显示系统部的人员和职位
select a.name,b.name department_name,c.name position_name
from staffer a,department b,s_position c
where a.department_id=b.id and a.position_id=c.id and b.name='系统部';
#显示系统部的人数
select count(*) from staffer a,department b
where a.department_id=b.id and b.name='系统部'
#显示各部门的人数
select count(*) cou,b.name
from staffer a,department b
where a.department_id=b.id
group by b.name;
#删除客服部
delete from department where name='客服部';
#将财务部修改为财务一部
update department set name='财务一部' where name='财务部';
12、备份和恢复
备份数据库staffer
c:mysqlbinmysqldump -uroot -proot staffer>e:staffer.sql
得到的staffer.sql是一个sql脚本,不包括建库的语句,所以你需要手工
创建数据库才可以导入
恢复数据库staffer,需要创建一个空库staffer
c:mysqlbinmysql -uroot -proot staffer<staffer.sql
如果不希望后来手工创建staffer,可以
c:mysqlbinmysqldump -uroot -proot --databases staffer>e:staffer.sql
mysql -uroot -proot >e:staffer.sql
但这样的话系统种就不能存在staffer库,且无法导入其他名字的数据库, 当然你可以手工修改staffer.sql文件
13、从文本向数据库导入数据
1)使用工具c:mysqlbinmysqlimport
这个工具的作用是将文件导入到和去掉文件扩展名名字相同的表里,如
staffer.txt,staffer都是导入到staffer表中
常用选项及功能如下
-d or --delete 新数据导入数据表中之前删除数据数据表中的所有信息
-f or --force 不管是否遇到错误,mysqlimport将强制继续插入数据
-i or --ignore mysqlimport跳过或者忽略那些有相同唯一
关键字的行, 导入文件中的数据将被忽略。
-l or -lock-tables 数据被插入之前锁住表,这样就防止了,
你在更新数据库时,用户的查询和更新受到影响。
-r or -replace 这个选项与-i选项的作用相反;此选项将替代表中有相同唯一关键字的记录。
--fields-enclosed- by= char
指定文本文件中数据的记录时以什么括起的, 很多情况下 数据以双引号括起。 默认的情况下数据是没有被字符括起的。
--fields-terminated- by=char
指定各个数据的值之间的分隔符,在句号分隔的文件中, 分隔符是句号。您可以用此选项指定数据之间的分隔符。
默认的分隔符是跳格符(Tab)
--lines-terminated- by=str
此选项指定文本文件中行与行之间数据的分隔字符串或者字符。 默认的情况下mysqlimport以newline为行分隔符。
您可以选择用一个字符串来替代一个单个的字符:
一个新行或者一个回车。
mysqlimport命令常用的选项还有-v 显示版本(version),
-p 提示输入密码(password)等。
这个工具有个问题,无法忽略某些列,这样对我们的数据导入有很大的麻烦,虽然可以手工设置这个字段,但会出现莫名其妙的结果,我们做一个简单的示例
我们定义如下的depart_no.txt,保存在e盘,间隔为制表符t
10 10
11 11
12 24
执行如下命令
c:mysqlbinmysqlimport -uroot -proot staffer e:depart_pos.txt
在这里没有使用列的包围符号,分割采用默认的t,因为采用别的符号会有问题,不知道是不是windows的原因
2)Load Data INFILE file_name into table_name(column1_name,column2_name)
这个命令在mysql>提示符下使用,优点是可以指定列导入,示例如下
c:mysqlbinmysql -uroot -proot staffer
mysql>load data infile "e:/depart_no.txt" into depart_no(department_id,position_id);

这两个工具在Windows下使用都有问题,不知道是Windows的原因还是中文的问题, 而且不指定的列它产生了空值,这显然不是我们想要的,所以谨慎使用这些工具

全面接触SQL语法

SQL语法的分类

  其实SQL命令并不是非常多,可是要把SQL用到出神入化,却也只需要短短几个命令便够,因为SQL命令是针对关系型数据库所建立出来的语法叙述,所以SQL在这类数据库中所发挥的功能非常的强,以下将针对在VB中常用的SQL语法基本命令加以分类介绍。在说明 SQL的命令以及使用语法之前,以下将SQL做了的分类,在致上SQL语法所使用到的类型,可以说都已包含在这些类别当中。

  第一类、属性词(Predicates)
  在SQL命令中用来指明所要选择的记录的方式。如ALL、TOP与DISTINCT等等。
  第二类、声明(Declaration)
  针对SQL Parameter或Parameter Query 的名称与数据类型做声明,如PARAMETERS的声明等等。
  第三类、条件子句(Clause)
  在SQL的查询中,利用一些表达式定义出查询的条件,以缩小寻找的范围,如WHERE。
  第四类、运算符(Operator)与操作数(Operation)
  在SQL的查询中,与Operation共同组成表达式(Expression),如BETWEEN....AND 运算符与INNER JOIN操作数。
  第五类、函数(Function)
  一些SQL常见的函数,像是AVG()是求算数平均数的函数。
  第六类、SQL语句(Statement)
  SQL的语句,可以说是SQL语法的主体,用来对某一个特定的数据库发出指示,并返回相关的数据,而SQL的语法结构,基本上可以利用下面
  的式子来表示:命令+条件子句
  例如:
  SELECT*FROM TAB WHERE TAB.NAME='A'
  其中的“FROM....WHERE”便是一个条件子句,其实SQL的语法并不难,您只需记住这样的一个规则,相信可以很快的了解SQL用法。
  SQL语法与命令  
  SELECT 语句
  SELECT[predicate]{* table.* [table.]field [,[table.]field2[,...]]} [AS alias1 [,alias2[,...]]]
  FROM tableexpression [,...][IN externaldatabase]
  [WHERE...]
  [GROUP BY...]
  [HAVING...]
  [ORDER BY...]
  [WITH OWNERACCESS OPTION]
  SELECT 语句包括下面几个部分
  predicate 
  如前面所述,包括了ALL,DISTINCT,DISTINCTROW,与TOP 我们可以利用这样的语句去限制查询后所得的结果。
  *
  从指定表格中指定所有的字段。
  table
  针对被选择出的记录的字段,所指定表格的名称。
  field1,field2
  想要读取数据的字段名称,如果包含了一个以上的字段,会依照列出的顺序来读取数据。
  alias1,alias2
  用来替代在表格实际字段名称的化名。   
tableexpression
  表格名称或包含我们所想要的数据的表格。
  externaldatabase
  若使用到不是目前的数据库则将其名字定义在externaldatabase当中。  
  ALL,DISTINCT,DISTINCTROW,TOP属性词用法
  SELECT [ALL DISTINCT DISTINCTROW [TOP n[PERCENT]]] FROM table
  ALL
  若是您不指定任何的字段数据,则Microsoft Jet数据库引擎(database engine)将会选择所有的字段,并依据所定的条件查询出需求数据集。
例如下面这两个例子将会具有相同的效果,都会从职员表格中返回所有字段的数据。

  例如:
  若是我们要查询出职员表格中的所有记录,可以通过下面的语句来完成。
  SELECT ALL* FROM 职员表格;

DISTINCT  
  对某个表格所选择的字段数据,略过重复的情况,也就是说,针对某个字段查询出来的记录结果是唯一的。例如有许多存放在职员表格的职员
  数据,也许会具有相同的姓名,所以若是我们用SQL语句中的SELECT DISTINCT,则查询出来的结果将会针对不一样的姓名加以筛选。若是您把
  DISTINCT 加以省略,则这样的查询会显示所有的记录。

  DISTINCTROW
  将整条记录重复的记录忽略掉,而不是只有针对某一个字段的数据。

  table
  指定查询记录所需要的表格。

  例如: 
  SELECT DISTINCTROW 公司名称 
  FROM 顾客表格 INNER JOIN 订单表格
  ON 顾客表格.顾客ID=订单表格.顾客ID  
  ORDER BY 公司名称;  
  如果您忽略 DISTINCTROW 则会对每个公司产生一行以下的订单数据。此外,若是DISTINCTROW只有用在一个表格当中,则会被省略掉。

  TOP
  从第一条或最后一条开始(利用ORDER BY条件子句),返回特定条数的数据。

  例如:
  当您想要知道在2000年,班上前25名的学生姓名数据时,您可以输入这样的语句:

  SELECT TOP 25 学生姓名
  FORM 学生表格  
  WHERE 毕业年份=1994 
  ORDER BY 毕业成绩平均分数 DESC;  

  如果您没有加上ORDER BY 这行条件的话,您所得到的数据,将会随机的数据。此外,在TOP语句之后,除了可以加上数字以外,还可以利用保留  

  字PERCENT来查询。  
  例如:  
  SELECT TOP 10 PERCENT学生姓名  
  FROM学生表格
  WHERE毕业年份=1994  
  ORDER BY毕业成绩平均DESC;   

  PARAMETERS(参数)声明的用法
  对于参数型的查询语法中,对参数的名称以及数据类型作 声明的操作。  
  PARAMETERS name datatype[,name datatype[,...]]   

  name 
  PARAMETERS的名称。您可以把参数名称当作字符串来使用,若是名称中包含了空字符串,可以利用中括号来处理,例如:“VBeden”。

  datatype 
  输入参数的数据类型。  
  例如: 
  若是您在查询时,需要机动的输入姓名 ,可以利用下列的方式完成:  
  PARAMETERS “输入姓名” Text;  
  SELECT*
  FROM 职员表格
  WHERE姓名=“输入姓名:”;

ORDER BY条件语句
  此条件子句,通常与SELECT语句合并使用目的是将查询的结果,依照指定字段加以排序。  

  SELECT fieldlist  
  FROM table
  WHERE selectcriteria 
  ORDER BY field[ASC DESC][,field2[ASC DESC][,...]]   

  fieldlist
  欲查询的字段名称。其中可以与ALL,DISTINCT,DISINCTROW,或TOP一起来使用。  
  table  
  欲查询的表格名称。  
  selectcriteria 
  查询的标准设置。 
  field1
  指定要依照那个字段作为排序的依据,若是你没有加上ORDER BY查询出的数据集将不会作排序的操作。
  ASC
  递增顺序类别。(默认值) 
  DESC
  递减顺序类别。

  例如:
  或是我们要将输出数据依据出生的先后次序排列,可以利用下面的命令。  
  SELECT 姓名,生日
  FROM 职员表格  
  ORDER BY 生日
  SELECT LastName,FirstName
  FROM Employees
  ORDER BY LastName ASC;

  IN 条件子句
  指定要速胜哪一个外部数据库的表格。(必须是Microsoft Jet数据库引擎所可以连接的数据库,如dBase,Paradox等等)  
  SELECT INSERT]INTO destination IN
  {path ["path" "type"] [""[type;DATABASE=path]]}
  FROM tableexpression IN
  {path ["path" "type"] [""[type;DATABASE=path]]}

  destination  
  欲插入数据的外部表格名称。
  tableexpression
  表格名称或是被读取数据的表格名称。这个参数可以是一个单一的表格名称,或是一段已经被存储的SQL查询等。
  path
  包含该表格的完整路径名称。
  type
  数据库的类型名称, 通常是当数据库部属于Jet database时才会使用。(例如:dBASE III,dBASE IV,Paradox 3.x,Paradox 4.x,或 Btrieve)

  例如:下面这两段的意义相同 
  PartA....FROM Table
  IN ""[dBASE IV;DATABASE=C:DBASEDATASALES;];  
  PartB....FROM Table
  IN "C:DBASEDATASALES" "dBASE IV;" 

  例如:Microsoft Jet database  
  SELECT 顾客编号
  FROM 顾客表格
  IN CUSTOMER.MDB
  WHERE 顾客编号 Like "A*";
  其中CUSTOMER.MDBO 为Jet database 的数据库名称,其中包含了顾客表格。 

  例如:dBASE III or IV
  SELECT 顾客编号
  FROM 顾客表格
  IN "C:DBASEDATASALES" "dBASE IV;"
  WHERE 顾客编号 Like "A*";
  所以当我们使用不同于ACCESS 的数据库时,必须指明该数据库的类型名称。