请看这条SQL语句 你说的可能是对的,可是我有几条含子查询的SQL语句执行成功了呀? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果这么简单的SQL语句都不支持,MYSQL有点让人失望!! 你写的SQL可能MYSQL支持,但是要考察MYSQL的版本。下面是从资料中摘录的东西,自从我看到这份材料后,就彻底放弃了MYSQL和LINUXMYSQL不支持的东西太多了,建议在NT下用SQL SERVER,在UNIX下用ORACLE。抱歉,有些跑题啦。---------------------------------------------------------------------5.4 MySQL缺乏的功能下列功能在当前的MySQL版本是没有的。对于一张优先级表指出何时新扩展可以加入MySQL, 你应该咨询在线MySQL TODO 表。这是本手册最新的TODO表版本。见F 我们想要在未来加入到MySQL的事情列表(TODO)。 5.4.1 子选择在MySQL中下列语句还不能工作: SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);然而,在很多情况下,你可以重写查询,而不用子选择: SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL对于更复杂的子查询,通常你可以创建临时的表保存子查询。然而在一些情况下,这种选择将行不通。最经常遇到的情形是DELETE语句,对于它标准SQL不支持联结(join)(除了在子选择)。对于这种情况,有2个可用选择,直到子选择被MySQL支持。 第一个选择是使用一种过程化的程序语言(例如Perl或PHP)来提交一个SELECT查询获得要被删除记录主键,并然后使用这些值构造DELETE语句(DELETE FROM ... WHERE ... IN (key1, key2, ...))。 第二个选择是使用交互式SQL自动构造一套DELETE语句,使用MySQL扩展CONCAT()(代替标准||操作符)。例如: SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', tab1.pkid, ';') FROM tab1, tab2 WHERE tab1.col1 = tab2.col2;你可以把这个查询放在一个脚本文件并且从它重定向输入到mysql命令行解释器,将其输出作为管道返回给解释器的第2个实例: prompt> mysql --skip-column-names mydb < myscript.sql | mysql mydbMySQL仅支持INSERT ... SELECT ...和REPLACE ... SELECT ...,独立的子选择将可能在3.24.0得到,然而,在其他环境下,你现在可以使用函数IN()。 5.4.2 SELECT INTO TABLEMySQL还不支持Oracle SQL的扩展:SELECT ... INTO TABLE ....,相反MySQL支持ANSI SQL句法INSERT INTO ... SELECT ...,基本上他们是一样的。另外,你可使用SELECT INTO OUTFILE...或CREATE TABLE ... SELECT解决你的问题。 5.4.3 事务处理不支持事务处理。MySQL将在短时间内支持原子(atomic)操作,它象没有回卷的事务。用原子操作,你能执行一组INSERT/SELECT/whatever 命令并且保证没有其他线程介入。在本文中,你通常不会需要回卷。目前,你可通过使用LOCK TABLES和UNLOCK TABLES命令阻止其他线程的干扰。见7.24 LOCK TABLES/UNLOCK TABLES句法。 5.4.4 存储过程和触发器一个存储过程是能在服务器中编译并存储的一套SQL命令。一旦这样做了,顾客不需要一直重新发出全部查询,而可以参考存储过程。因为查询仅需一次词法分析并且较少的信息需要在服务器和客户之间传送,因此这提供了更好的性能。你与可以通过拥有在服务器中的函数库提升概念上的层次。 一个触发器是当一个特别的事件发生时,被调用的一个存储过程。例如,你可以安装一个存储过程,它在每次从一个交易表删除一条记录时触发,并且当它所有交易被删除时,自动地从一个客户表中删除相应的客户。 计划修改的语言将能处理存储过程,但是没有触发器。触发器通常使每件事情变慢,即使对他们不需要的查询。 为了俩解什么时候MySQL可能得到存储过程,见F 我们想在未来加入到MySQL的事情列表(TODO)。5.4.5 外键注意,在SQL中外键不用于联结表,而主要用于检查参考完整性(RI)。如果你想要得到用一个SELECT语句从多个表得到结果, 你通过联结表做! SELECT * from table1,table2 where table1.id = table2.id; 见7.13 JOIN句法。见8.3.5 使用外键。 在MySQL里存在FOREIGN KEY句法仅仅为了与其他SQL供应商的CREATE TABLE命令相兼容;它不做任何事情。没有ON DELETE ...的FOREIGN KEY句法主要用于文档目的。一些ODBC应用程序可以使用它自动生成WHERE子句,但是这通常很容易的覆盖。 FOREIGN KEY有时用作一个约束检查,但是如果行以正确的顺序被插入表,该检查实际上是不必要的。MySQL仅仅支持这些子句(不考虑是否他们工作!),因为一些应用程序要求他们存在。 在MySQL中,你可以解决ON DELETE ...没被实现的问题,,在你从一个用外键的表删除记录时,通过为一个应用程序增加适当的DELETE语句即可。实际上,这很快(在一些情况下更快)并且比使用外键更比便于移植。 在不久的将来我们将扩充FOREIGN KEY实现,以便至少信息将在表说明文件中保存并且可以由mysqldump和ODBC检索。 5.4.5.1 不使用外键的理由有很多与FOREIGN KEY有关的问题我们不知道从哪儿开始: 外键使生活更复杂,因为外键的定义必须存储在一个数据库中并且实现他们将破坏使用能被移动、拷贝和删除文件的全部“好方法”。 速度影响对INSERT和UPDATE语句是可怕的,并且在这种情况下几乎所有的FOREIGN KEY检查都是无用的,因为不管怎样你通常以正确的顺序在正确的表中插入记录。 当更新一张表时,也有在许多表上保存锁的需求,因为副作用可以串联通过全部数据库。首先从一张表中删除记录并且随后从其他表中删除他们,这更快。 你再也不可以通过做一个全面的表删除并随后恢复所有的记录的方法来恢复一张表(从新来源或从一个备份)。 如果你有外键,你不能倾倒和恢复表,除非你以一个非常特定的做这些。 很容易做一个“允许的”的循环定义使得不可能用一个单个create语句重建每一个表,就算定义可行又可用。 FOREIGN KEY唯一好的方面是它给ODBC和一些其他客户程序检查一张表如何被连接的能力,并且使用它们显示出连接图表并帮助构造应用。 MySQL不久将存储FOREIGN KEY定义以便一个客户能询问并收到原来的连接如何进行的一个答案。当前的“.frm 文件格式没有它应有的地位。 5.4.6 视图MySQL不支持视图,但是它在TODO上。 to w102272: 谢谢!这分应该是你的啦? 不过我好泄气,你能放弃,我却不能! 我到这家公司不久,公司的开发平台是LINUX+APACHE+MYSQL insert into ... values select ... from ... ~~~~~~values 不能有的!去掉試試!:) To LTS: 不好意思,没有解决你的问题!不敢拿分。 我比你运气的地方,是能够自己决定采用什么开发方案。 还是劝劝你们的BOSS吧, 今天85%的网站是采用ASP开发的,以后采用ASP+和COM+以后,功能还要更强。 LINUX不过是一个省钱的Scheme, 对于商业应用来说,软件稳定性,功能,开发效率,开发环境等等更重要。 把商业系统建构在一个自由软件的基础上是危险的。 选择ASP,ORACLE 8i, SYBASE,那个方案都比这个LINUX强。 不要为了眼前开发省钱,毁了以后的维护和扩展。 想想今天LINUX上有PHP和MYSQL已经不错了,以前只有可怜的CGI。 可以以后呢? XML?COM?COM+?中间件? 今天发展最前沿的东西有那些是在LINUX上有强大支持和良好开发工具的? 别告诉我以后你的应用全用CGI和PHP+MYSQL写, 就象今天有人告诉我用ASM写WINDOWS程序一样。 跪求PHP给邮箱发送EMAIL的程序,多谢 下面程序有没有问题 关于SQL的求和问题,加入SUM之后,无法循环字段值 来来来,给php挑毛病 大二学生想找工作。疑问求解! 请问有什么方法可以知道当前有什么人在访问我的网站并正进行操作中? php 中的global疑惑! 关于调取数据的问题 php循环问题? 各位朋友,使用header()有什么要注意的啊? 为什么PHP 4 (RC1)安装后不能用? 实在想...想不出来,请大家指点!关于PHP!
下面是从资料中摘录的东西,自从我看到这份材料后,就彻底放弃了MYSQL和LINUX
MYSQL不支持的东西太多了,建议在NT下用SQL SERVER,在UNIX下用ORACLE。
抱歉,有些跑题啦。---------------------------------------------------------------------
5.4 MySQL缺乏的功能
下列功能在当前的MySQL版本是没有的。对于一张优先级表指出何时新扩展可以加入MySQL, 你应该咨询在线MySQL TODO 表。这是本手册最新的TODO表版本。见F 我们想要在未来加入到MySQL的事情列表(TODO)。 5.4.1 子选择
在MySQL中下列语句还不能工作: SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);然而,在很多情况下,你可以重写查询,而不用子选择: SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL对于更复杂的子查询,通常你可以创建临时的表保存子查询。然而在一些情况下,这种选择将行不通。最经常遇到的情形是DELETE语句,对于它标准SQL不支持联结(join)(除了在子选择)。对于这种情况,有2个可用选择,直到子选择被MySQL支持。 第一个选择是使用一种过程化的程序语言(例如Perl或PHP)来提交一个SELECT查询获得要被删除记录主键,并然后使用这些值构造DELETE语句(DELETE FROM ... WHERE ... IN (key1, key2, ...))。 第二个选择是使用交互式SQL自动构造一套DELETE语句,使用MySQL扩展CONCAT()(代替标准||操作符)。例如: SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', tab1.pkid, ';')
FROM tab1, tab2
WHERE tab1.col1 = tab2.col2;你可以把这个查询放在一个脚本文件并且从它重定向输入到mysql命令行解释器,将其输出作为管道返回给解释器的第2个实例: prompt> mysql --skip-column-names mydb < myscript.sql | mysql mydbMySQL仅支持INSERT ... SELECT ...和REPLACE ... SELECT ...,独立的子选择将可能在3.24.0得到,然而,在其他环境下,你现在可以使用函数IN()。 5.4.2 SELECT INTO TABLE
MySQL还不支持Oracle SQL的扩展:SELECT ... INTO TABLE ....,相反MySQL支持ANSI SQL句法INSERT INTO ... SELECT ...,基本上他们是一样的。另外,你可使用SELECT INTO OUTFILE...或CREATE TABLE ... SELECT解决你的问题。 5.4.3 事务处理
不支持事务处理。MySQL将在短时间内支持原子(atomic)操作,它象没有回卷的事务。用原子操作,你能执行一组INSERT/SELECT/whatever 命令并且保证没有其他线程介入。在本文中,你通常不会需要回卷。目前,你可通过使用LOCK TABLES和UNLOCK TABLES命令阻止其他线程的干扰。见7.24 LOCK TABLES/UNLOCK TABLES句法。 5.4.4 存储过程和触发器
一个存储过程是能在服务器中编译并存储的一套SQL命令。一旦这样做了,顾客不需要一直重新发出全部查询,而可以参考存储过程。因为查询仅需一次词法分析并且较少的信息需要在服务器和客户之间传送,因此这提供了更好的性能。你与可以通过拥有在服务器中的函数库提升概念上的层次。 一个触发器是当一个特别的事件发生时,被调用的一个存储过程。例如,你可以安装一个存储过程,它在每次从一个交易表删除一条记录时触发,并且当它所有交易被删除时,自动地从一个客户表中删除相应的客户。 计划修改的语言将能处理存储过程,但是没有触发器。触发器通常使每件事情变慢,即使对他们不需要的查询。 为了俩解什么时候MySQL可能得到存储过程,见F 我们想在未来加入到MySQL的事情列表(TODO)。5.4.5 外键
注意,在SQL中外键不用于联结表,而主要用于检查参考完整性(RI)。如果你想要得到用一个SELECT语句从多个表得到结果, 你通过联结表做! SELECT * from table1,table2 where table1.id = table2.id; 见7.13 JOIN句法。见8.3.5 使用外键。 在MySQL里存在FOREIGN KEY句法仅仅为了与其他SQL供应商的CREATE TABLE命令相兼容;它不做任何事情。没有ON DELETE ...的FOREIGN KEY句法主要用于文档目的。一些ODBC应用程序可以使用它自动生成WHERE子句,但是这通常很容易的覆盖。 FOREIGN KEY有时用作一个约束检查,但是如果行以正确的顺序被插入表,该检查实际上是不必要的。MySQL仅仅支持这些子句(不考虑是否他们工作!),因为一些应用程序要求他们存在。 在MySQL中,你可以解决ON DELETE ...没被实现的问题,,在你从一个用外键的表删除记录时,通过为一个应用程序增加适当的DELETE语句即可。实际上,这很快(在一些情况下更快)并且比使用外键更比便于移植。 在不久的将来我们将扩充FOREIGN KEY实现,以便至少信息将在表说明文件中保存并且可以由mysqldump和ODBC检索。 5.4.5.1 不使用外键的理由
有很多与FOREIGN KEY有关的问题我们不知道从哪儿开始: 外键使生活更复杂,因为外键的定义必须存储在一个数据库中并且实现他们将破坏使用能被移动、拷贝和删除文件的全部“好方法”。
速度影响对INSERT和UPDATE语句是可怕的,并且在这种情况下几乎所有的FOREIGN KEY检查都是无用的,因为不管怎样你通常以正确的顺序在正确的表中插入记录。
当更新一张表时,也有在许多表上保存锁的需求,因为副作用可以串联通过全部数据库。首先从一张表中删除记录并且随后从其他表中删除他们,这更快。
你再也不可以通过做一个全面的表删除并随后恢复所有的记录的方法来恢复一张表(从新来源或从一个备份)。
如果你有外键,你不能倾倒和恢复表,除非你以一个非常特定的做这些。
很容易做一个“允许的”的循环定义使得不可能用一个单个create语句重建每一个表,就算定义可行又可用。
FOREIGN KEY唯一好的方面是它给ODBC和一些其他客户程序检查一张表如何被连接的能力,并且使用它们显示出连接图表并帮助构造应用。 MySQL不久将存储FOREIGN KEY定义以便一个客户能询问并收到原来的连接如何进行的一个答案。当前的“.frm 文件格式没有它应有的地位。 5.4.6 视图
MySQL不支持视图,但是它在TODO上。
谢谢!这分应该是你的啦?
不过我好泄气,你能放弃,我却不能!
我到这家公司不久,公司的开发平台是LINUX+APACHE+MYSQL
~~~~~~
values 不能有的!去掉試試!:)
不好意思,没有解决你的问题!不敢拿分。
我比你运气的地方,是能够自己决定采用什么开发方案。
还是劝劝你们的BOSS吧,
今天85%的网站是采用ASP开发的,以后采用ASP+和COM+以后,功能还要更强。
LINUX不过是一个省钱的Scheme,
对于商业应用来说,软件稳定性,功能,开发效率,开发环境等等更重要。
把商业系统建构在一个自由软件的基础上是危险的。
选择ASP,ORACLE 8i, SYBASE,那个方案都比这个LINUX强。
不要为了眼前开发省钱,毁了以后的维护和扩展。
想想今天LINUX上有PHP和MYSQL已经不错了,以前只有可怜的CGI。
可以以后呢? XML?COM?COM+?中间件?
今天发展最前沿的东西有那些是在LINUX上有强大支持和良好开发工具的?
别告诉我以后你的应用全用CGI和PHP+MYSQL写,
就象今天有人告诉我用ASM写WINDOWS程序一样。