
left join C on a.col2=c.col2
是不是你要的效果、C又是什么join呢,是在搞不清你可以把子查询括号括起来再join你的C表
select * from (
select * from A full join B on a.col1=b.col1
) left join C on a.col2=c.col2
在 Python 语言环境下我们这样连接数据库。
In [1]: from mysql import connector
In [2]: cnx = connector.connect(host="172.16.192.100",port=3306,user="appuser",password="xxxxxx")
但是连接数据库的背后发生了什么呢?
答案
当我们通过驱动程序(mysql-connector-python,pymysql)连接 MySQL 服务端的时候,就是把连接参数传递给驱动程序,驱动程序再根据参数会发起到 MySQL 服务端的 TCP 连接。当 TCP 连接建立之后驱动程序与服务端之间会按特定的格式和次序交换数据包,数据包的格式和发送次序由 MySQL 协议 规定。MySQL 协议:https://dev.mysql.com/doc/internals/en/client-server-protocol.html整个连接的过程中 MySQL 服务端与驱动程序之间,按如下的次序发送了这些包。
MySQL 服务端向客户端发送一个握手包,包里记录了 MySQL-Server 的版本,默认的授权插件,密码盐值(auth-data)。
2. MySQL 客户端发出 ssl 连接请求包(如果有必要的话)。
3. MySQL 客户端发出握手包的响应包,这个包时记录了用户名,密码加密后的串,客户端属性,等等其它信息。
4. MySQL 服务端发出响应包,这个包里记录了登录是否成功,如果没有成功也会给出错误信息。
<?php/*这个基本上就是我使用的数据库类*/
//屏蔽未定义错误
error_reporting(7)
class DB_MySQL {
var $servername="localhost"
var $dbname="DBASE"
var $dbusername = "ROOT"
var $dbpassword = ""
var $conn = 0
var $technicalemail='java@cu165.com'
function geterrdesc() {
$this->error = @mysql_error($this->conn)
return $this->error
}
function geterrno() {
$this->errno = @mysql_errno($this->conn)
return $this->errno
}
function query($query_string) {
// $this->result = mysql_db_query($this->dbname,$query_string)
$this->result = mysql_query($query_string)
if (!$this->result) {
$this->halt("SQL 无效: ".$query_string)
}
return $this->result
}
function num_rows($queryid) {
$this->rows = mysql_num_rows($queryid)
if (empty($queryid)){
$this->halt("Query id 无效:".$queryid)
}
return $this->rows
}
function fetch_array($queryid) {
$this->record = mysql_fetch_array($queryid)
if (empty($queryid)){
$this->halt("Query id 无效:".$queryid)
}
return $this->record
}
function conn(){
$this->conn = mysql_connect($this->servername, $this->dbusername, $this->dbpassword) or die(mysql_error("数据库链接失败"))
return $this->conn
}
function selectdb(){
if(!mysql_select_db($this->dbname)){
$this->halt("数据库链接失败")
}
}
function my_close() {
// mysql_close($this->conn)
mysql_close()
}
function fetch_row($queryid) {
$this->record = mysql_fetch_row($queryid)
if (empty($queryid)){
$this->halt("queryid 无效:".$queryid)
}
return $this->record
}
function fetch_one_num($query) {
$this->result = $this->query($query)
$this->record = $this->num_rows($this->result)
if (empty($query)){
$this->halt("Query id 无效:".$query)
}
return $this->record
}
function fetch_one_array($query) {
$this->result = $this->query($query)
$this->record = $this->fetch_array($this->result)
if (empty($query)){
$this->halt("Query id 无效:".$query)
}
return $this->record
}
function free_result($query){
if (!mysql_free_result($query)){
$this->halt("fail to mysql_free_result")
}
}
function insert_id(){
$this->insertid = mysql_insert_id()
if (!$this->insertid){
$this->halt("fail to get mysql_insert_id")
}
return $this->insertid
}
/*========================================================================*/
// Create an array from a multidimensional array returning formatted
// strings ready to use in an Insert query, saves having to manually format
// the (Insert INTO table) ('field', 'field', 'field') VALUES ('val', 'val')
/*========================================================================*/
function compile_db_insert_string($data) {
$field_names = ""
$field_values = ""
foreach ($data as $k =>$v)
{
$v = preg_replace( "/'/", "\\'", $v )
//$v = preg_replace( "/#/", "\\#", $v )
$field_names .= "$k,"
$field_values .= "'$v',"
}
$field_names = preg_replace( "/,$/" , "" , $field_names )
$field_values = preg_replace( "/,$/" , "" , $field_values )
return array( 'FIELD_NAMES' =>$field_names,
'FIELD_VALUES' =>$field_values,
)
}
/*========================================================================*/
// Create an array from a multidimensional array returning a formatted
// string ready to use in an Update query, saves having to manually format
// the FIELD='val', FIELD='val', FIELD='val'
/*========================================================================*/
function compile_db_update_string($data) {
$return_string = ""
foreach ($data as $k =>$v)
{
$v = preg_replace( "/'/", "\\'", $v )
$return_string .= $k . "='".$v."',"
}
$return_string = preg_replace( "/,$/" , "" , $return_string )
return $return_string
}
function halt($msg){
global $technicalemail,$debug
$message = "<html>\n<head>\n"
$message .= "<meta content=\"text/htmlcharset=gb2312\" http-equiv=\"Content-Type\">\n"
$message .= "<STYLE TYPE=\"text/css\">\n"
$message .= "<!--\n"
$message .= "body,td,p,pre {\n"
$message .= "font-family : Verdana, Arial, Helvetica, sans-seriffont-size : 12px\n"
$message .= "}\n"
$message .= "</STYLE>\n"
$message .= "</head>\n"
$message .= "<body bgcolor=\"#EEEEEE\" text=\"#000000\" link=\"#006699\" vlink=\"#5493B4\">\n"
$message .= "<font size=10><b>系统调试</b></font><font size=6><b>(by 大白菜芯 )</b></font>\n<hr NOSHADE SIZE=1>\n"
$content = "<p>数据库出错:</p><pre><b>".htmlspecialchars($msg)."</b></pre>\n"
$content .= "<b>Mysql error description</b>: ".$this->geterrdesc()."\n<br>"
$content .= "<b>Mysql error number</b>: ".$this->geterrno()."\n<br>"
$content .= "<b>Date</b>: ".date("Y-m-d @ H:i")."\n<br>"
$content .= "<b>Script</b>: http://".$_SERVER[HTTP_HOST].getenv("REQUEST_URI")."\n<br>"
$content .= "<b>Referer</b>: ".getenv("HTTP_REFERER")."\n<br><br>"
$message .= $content
$message .= "<p>请尝试刷新你的浏览器,如果仍然无法正常显示,请联系<a href=\"technicalemail."\'>mailto:".$this->technicalemail."\">管理员</a>.</p>"
$message .= "</body>\n</html>"
echo $message
$headers = "From: nt.cn <$this->technicalemail>\r\n"
$content = strip_tags($content)
@mail($technicalemail,"数据库出错",$content,$headers)
exit
}
}
?>
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)