mysql从4.11开始支持子查询(转帖)

  我用的mysql4.0.14,试验可以在插入语句中使用子查询,如:

insert into learndiary_login.user

  (SELECT userID,userName,psd,email

  FROM websitedb.user

  where userid<30)

  但是其它的子查询不行:

select * from

  (select userID*2 AS u1,userName as u2,

    psd as u3,email as u4) as t

where u1>50 

下面的文章说mysql从4.11开始支持子查询,正文如下:

关于MySQL嵌套查询的技巧   [ 2005-10-11 14:57:12 | 5iuu ]

许多人都觉得MySQL不支持嵌套查询,其实MySQl从4.11版后已经完全支持嵌套查询了,那么下面我举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual):

1. SELECT语句的子查询:

语法: SELECT ... FROM (subquery) AS name ...

先创建一个表:

CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT);

INSERT INTO t1 VALUES (1,'1',1.0);

INSERT INTO t1 VALUES (2,'2',2.0);

我们就可以进行以下的嵌套查询了:

SELECT sb1,sb2,sb3

FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb

WHERE sb1 > 1;

结果是: 2, '2', 4.0.

我们知道下面语句是不会得到正确结果的,因为对经过Group by排序的集合进行求均值是不能得到正确答案的:

SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1

所以我们可以通过下面的嵌套查询实现同样的效果:

SELECT AVG(sum_column1)

FROM (SELECT SUM(column1) AS sum_column1

FROM t1 GROUP BY column1) AS t1;

2.行的子查询(Row Subquery):

看下面的例子:

SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);

这个查询是返回column1等于column2的结果行。Row函数中的1和2相当于构造参数。想必Blogjava上的同志对这些应该比较清楚,也不去详细介绍了。

3.使用Exist和Not Exist参数

这里的Exist和Not Exist用途及用法和在其他没有什么大的区别,我就简单举几个范例好了:

范例一: SELECT DISTINCT store_type FROM Stores

WHERE EXISTS (SELECT * FROM Cities_Stores

WHERE Cities_Stores.store_type = Stores.store_type);

范例二: SELECT DISTINCT store_type FROM Stores

WHERE NOT EXISTS (SELECT * FROM Cities_Stores

WHERE Cities_Stores.store_type = Stores.store_type);

范例三: 这个例子中嵌套使用了Not Exist语法,稍微注意一下:

SELECT DISTINCT store_type FROM Stores S1

WHERE NOT EXISTS (

SELECT * FROM Cities WHERE NOT EXISTS (

SELECT * FROM Cities_Stores

WHERE Cities_Stores.city = Cities.city

AND Cities_Stores.store_type = Stores.store_type));

4.条件关联关系查询:

解释起来麻烦,直接看例子吧:

SELECT column1 FROM t1 AS x

WHERE x.column1 = (SELECT column1 FROM t2 AS x

WHERE x.column1 = (SELECT column1 FROM t3

WHERE x.column2 = t3.column1));

跟其他数据库做法是一样的。

5.其他使用方法和注意:

除了上面这些还有很多很多,不过就不去细讲了,因为这些跟别的数据库差不多,只是为了给大家一个参考,提提就够了。

SELECT (SELECT s1 FROM t2) FROM t1;

SELECT (SELECT s2 FROM t1);

支持子查询的语法有:SELECT,INSERT,UPDATE,DELETE,SET和DO。

子查询可以使用任何普通查询中使用的关键词:如DINSTINCT,GROUP BY,LIMIT,ORDER BY,UNION,ALL,UNION ALL等。可以使用<,>, <=, >=, =, <>运算符进行比较,也可以使用ANY ,IN和SOME进行集合的匹配。

Tags:MySQL相关日志: JSP连接mysql数据库攻略    [2005-10-21 PM | 日积月累]

 

引用通告地址 (0):[本站声明:此文章来源于网络,如果未属名,可能此文被转摘多次,原作者不详,如果您认为侵权,请联系我。我将在第一时间按要求做出处理,并消除影响。][字体大小:大 中 小] [ 收藏此页到 365KEY | 博采 | 人人网摘 ]

http://www.GuoBlog.com/trackback.asp?tbID=694

http://www.GuoBlog.com/trackback.asp?tbID=694&CP=GBK

mysql数据库的导出和导入

  用图形工具是比较方便的,比如我用的:SQLyog。

  在命令行中的方式为:

  1、把整个数据库导出为一个sql文件:用:mysqldump dbname > c:\mydb.sql

  2、把sql文件导入数据库:用mysql命令进入mysql,在mysql>提示符下输入:

  1)创建数据库:create database newdb;

  2)使用当前数据库:use newdb;

  3)导入sql文件中的数据:source c:\mydb.sql(无分号)

  这样,就把mydb.sql中的数据导入到新的数据库newdb了。

(转帖)默认安装的mysql服务不安全因素涉及的内容

转自:http://blog.iyi.cn/start/2004/12/mysql_1.html

默认安装的mysql服务不安全因素涉及的内容

默认安装的mysql服务不安全因素涉及的内容有:

一.mysql默认的授权表

二.缺乏日志能力

三.my.ini文件泄露口令

四.服务默认被绑定全部的网络接口上

五.默认安装路径下的mysql目录权限

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一.mysql默认的授权表

由于mysql对身份验证是基于mysql这个数据库的,也叫授权表。所有的权限设置都在这里了。

我们只讨论最为重要的一个表 user表。它控制的是接受或拒绝连接。

先看一下

select host,user,password,Delete_priv from user;

+-----------+------+------------------+-------------+

| host | user | password | Delete_priv |

+-----------+------+------------------+-------------+

| localhost | root | 67457e226a1a15bd | Y |

| % | root | | Y |

| localhost | | | Y |

| % | | | N |

+-----------+------+------------------+-------------+

现在新的版本,安装完毕都会出现一个快速设置窗口,用于设置口令。

以上,就是user表里的内容(略了点)看看有什么问题?

我们知道mysql的验证方式是比较特殊的,它基于两个2个信息来进行的

1.从那里连接

2.用户名

第一条没什么问题,当然口令必须是安全的。

第二条从任何主机,以用户root,不需要口令都可以连接,权限为所有的权限。(注:这里的权限是全局权限)

第三条从本地主机,任何用户名(注:user为空白,不表示不需要用户名),不需要口令,都可以连接,所有的权限

第四条从任何主机,任何用户名,不需要口令,都可以连接,无任何权限。

可以看出,2\\3\\4都是不安全的,如何攻击这里就不说了,请参看资料文库。

如果你mysql只允许本地连接,删除host的%和user中的nul(表示空)

delete from user where host=‘%‘;

delete from host where user=‘‘;

最后的user表,看起来因该是这个样子

+-----------+------+------------------+-------------+

| host | user | password | Delete_priv |

+-----------+------+------------------+-------------+

| localhost | root | 67457e226a1a15bd | Y |

+-----------+------+------------------+-------------+

最后需要刷新授权表,使其立刻生效

flush privileges;

如果你的mysql需要被远程使用,需要为%段中的root帐号,加上一个安全的密码

update user set password=password(‘youpass‘) where host=‘%‘;

其中youpass,就是口令

mysql> select host,user,password,Delete_priv from user;

+-----------+------+------------------+-------------+

| host | user | password | Delete_priv |

+-----------+------+------------------+-------------+

| localhost | root | 67457e226a1a15bd | Y |

| % | root | 77c590fa148bc9fb | Y |

+-----------+------+------------------+-------------+

更好的做法是,对远程主机的连接,指定为特定的

修改host中的%为允许连接的主机,比如:

192.168.0.% 允许一个特定的子网

www.sandflee.net 允许一个特定的主机

帐号默认的名字也是担心的问题。有可能导致被暴力破解

update user set user=‘localadmin‘ where host=‘localhost‘;

update user set user=‘remoteadmin‘ where host=‘%‘;

最后的user表看起来像是这个样子

mysql> select host,user,password,Delete_priv from user;

+-----------+-------------+------------------+-------------+

| host | user | password | Delete_priv |

+-----------+-------------+------------------+-------------+

| localhost | localadmin | 67457e226a1a15bd | Y |

| % | remoteadmin | 77c590fa148bc9fb | Y |

+-----------+-------------+------------------+-------------+

更为详细的资料,请去参考晏子的《MySQL中文参考手册》。随便那都有下

二.缺乏日志能力

mysql安装完成以后,会在%SystemRoot%目录下产生my.ini的设置文件

默认的内容如下:

——————————————————————————————

basedir=C:/mysql

#bind-address=192.168.0.1

datadir=C:/mysql/data

#language=C:/mysql/share/your language directory

#slow query log#=

#tmpdir#=

#port=3306

#set-variable=key_buffer=16M

[WinMySQLadmin]

Server=C:/mysql/bin/mysqld-nt.exe

user=root

password=root

注意log#=这个

它没有被定义,且被注销掉了。

更改为一个适合的路径,比如:

log=c:/mysql/logs/mysql.log

三.my.ini文件泄露口令

我们看到my.ini最后,有这两句

user=root

password=root

如果,你安装完成时,使用了mysql所提供的快速设置功能,(较新的版本)你的帐号和口令将被写到my.ini文件中。

这也是mysql写到启动组里的winmysqladmin.exe工具,运行时需要读取的。它提供的mysql服务

的一些监视功能。这样winmysqladmin.exe才能获得mysql服务的状态信息。

其实,这个也不算漏洞,我们看看my.ini默认的权限,它可以被user组用户读取。

从而导致口令被泄露

解决方法:

从新设定my.ini文件的权限.

从新设定帐号及口令

不使用快速设置

四.服务默认被绑定全部的网络接口上

服务被绑定到了所有的网络接口上,比如,你只需要一个运行在内网的mysql服务,但是你的机器有

外网的接口,mysql也会被绑定上,从而带来一些不必要的麻烦和威胁。

在my.ini里的这句

#bind-address=192.168.0.1

它默认被注销掉了

应该打开它

如果,只是本地使用,更改为

bind-address=127.0.0.1

如果是其它情况,应该选者一个合适的网络接口

五.默认安装路径下的mysql目录权限

mysql默认的安装路径为c:\\mysql,基本上都难得改,要改的话也是麻烦,还要去改my.ini。

但,这样就有个问题

通常c:\\的权限是everyone组-所有的权限。这是默认的,由于继承性,导致mysql下的data目录

也是everyone组-所有的权限。导致被随意访问、读取、删除,可能泄露和破坏数据。

更改mysql目录到一个合适,安全的访问权限。

over...

CONCAT,LENGTH函数

CONCAT(str1,str2)--连接str1和str2;

LENGTH(str)--str的长度(一个汉字的长度是2,一个字符的长度是1)

update article set articlename=CONCAT('cs:',articlename) where LENGTH(articleName)<5 AND userName='xxxxx';

我会设置mysql的默认字符集了

    java-cn.com的站长回答:“  回复:站长,mysql的技术小问题,字符集怎么改啊?

你安装完Mysql后,会在 WINNT 目录下生成一个 my.ini 的配置文件,在 [mysqld] 下面加上一行:

default-character-set=gb2312

然后重新启动一下Mysql进程就可以了。

 



    真简单啊,可我开始就是不知道。忘了问这个知识可以从哪里得到,再厚起脸皮问一下吧

mysql的字段检索问题,SELECT 'dau'='新u'结果是1

在我本地的机器上,无论是mysql4.0.14还是mysql4.0.21,执行“SELECT * FROM table1 WHERE field1='dau'”会检索出field1='新u'的记录,执行“SELECT 'dau'='新u'”结果会是1,而在java-cn.com的mysql服务器上执行则还会出现这个问题,显然,这是我本地的数据库设置有问题,而且估计是字符集方面的设置。但是我看了mysql的说明书,5.8.1 The haracter Set Used for Data and Sorting,我不知道怎么样改变数据库的默认字符集。去下载一个中文的说明书看看。在网上看到一种解决此类问题的不彻底的方法:摘录如下:

......解决方法,使用 BINARY 属性进行检索,如:

select id,title,name from achech_com.news where binary title like '-0x1.ebea4bfbebe84p-4%'

返回的结果较之前正确,但英文字母区分大小写,故有时在检索如“Achech”

及“achech”的结果是不一样的。

知道了使用 BINARY 属性可以解决前面这个问题,再看看 MySQL 支持的

UCASE 及 CONCAT 函数,其中 UCASE 是将英文全部转成大写,而 CONCAT 函

数的作用是对字符进行连接,以下是我们完全解决后的 SQL 语句:

select id,title,name from achech_com.news where binary ucase(title) like concat('%',ucase('a'),'%')

检索的步骤是先将属性指定为 BINARY ,以精确检索结果,而被 like 的 title

内容存在大小写字母的可能,故先使用 ucase 函数将字段内容全部转换成大

写字母,然后再进行 like 操作,而 like 的操作使用模糊方法,使用 concat

的好处是传进来的可以是直接的关键字,不需要带“%”万用符,将“'a'”直接

换成你的变量,在任何语言下都万事无忧了。

当然你也可以这么写:

select id,title,name from achech_com.news where binary ucase(title) like ucase('0x0.00020bfbebe08p-1022%')

检索的结果还算满意吧,不过速度可能会因此而慢N毫秒喔。

......