iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL连接方式有哪些
  • 675
分享到

MySQL连接方式有哪些

2024-04-02 19:04:59 675人浏览 独家记忆
摘要

这篇文章主要介绍“Mysql连接方式有哪些”,在日常操作中,相信很多人在mysql连接方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mysql连接方式有哪些”的疑惑

这篇文章主要介绍“Mysql连接方式有哪些”,在日常操作中,相信很多人在mysql连接方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mysql连接方式有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、连接

   使用如下两表来进行测试
mysql> desc users1;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| uid   | tinyint(3) unsigned | YES  |     | NULL    |       |
| uname | varchar(255)        | YES  |     | NULL    |       |
| gid   | tinyint(3) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
3 rows in set (0.06 sec)

mysql> desc groups1;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| gid   | tinyint(3) unsigned | YES  |     | NULL    |       |
| gname | varchar(255)        | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
2 rows in set (0.06 sec)

[@more@]mysql> select * from users1;
+------+----------+------+
| uid  | uname    | gid  |
+------+----------+------+
|    0 | root     |    0 |
|  201 | yuegao   |  101 |
|  202 | fengsong |  102 |
|  201 | yuegao   |  200 |
+------+----------+------+
4 rows in set (0.00 sec)

mysql> select * from groups1;
+------+-------+
| gid  | gname |
+------+-------+
|    0 | root  |
|  101 | dba   |
|  200 | guest |
+------+-------+
3 rows in set (0.00 sec)

 1.交叉连接

mysql> select * from users1 cross join groups1;
+------+----------+------+------+-------+
| uid  | uname    | gid  | gid  | gname |
+------+----------+------+------+-------+
|    0 | root     |    0 |    0 | root  |
|    0 | root     |    0 |  101 | dba   |
|    0 | root     |    0 |  200 | guest |
|  201 | yuegao   |  101 |    0 | root  |
|  201 | yuegao   |  101 |  101 | dba   |
|  201 | yuegao   |  101 |  200 | guest |
|  202 | fengsong |  102 |    0 | root  |
|  202 | fengsong |  102 |  101 | dba   |
|  202 | fengsong |  102 |  200 | guest |
|  201 | yuegao   |  200 |    0 | root  |
|  201 | yuegao   |  200 |  101 | dba   |
|  201 | yuegao   |  200 |  200 | guest |
+------+----------+------+------+-------+
12 rows in set (0.00 sec)

   或

mysql> select * from users1, groups1;
+------+----------+------+------+-------+
| uid  | uname    | gid  | gid  | gname |
+------+----------+------+------+-------+
|    0 | root     |    0 |    0 | root  |
|    0 | root     |    0 |  101 | dba   |
|    0 | root     |    0 |  200 | guest |
|  201 | yuegao   |  101 |    0 | root  |
|  201 | yuegao   |  101 |  101 | dba   |
|  201 | yuegao   |  101 |  200 | guest |
|  202 | fengsong |  102 |    0 | root  |
|  202 | fengsong |  102 |  101 | dba   |
|  202 | fengsong |  102 |  200 | guest |
|  201 | yuegao   |  200 |    0 | root  |
|  201 | yuegao   |  200 |  101 | dba   |
|  201 | yuegao   |  200 |  200 | guest |
+------+----------+------+------+-------+
12 rows in set (0.00 sec)

 2.内连接

mysql> select * from users1 inner join groups1 on users1.gid = groups1.gid;
+------+--------+------+------+-------+
| uid  | uname  | gid  | gid  | gname |
+------+--------+------+------+-------+
|    0 | root   |    0 |    0 | root  |
|  201 | yuegao |  101 |  101 | dba   |
|  201 | yuegao |  200 |  200 | guest |
+------+--------+------+------+-------+
3 rows in set (0.00 sec)

   如果连接列名称相同,可以使用如下形式:

mysql> select * from users1 inner join groups1 using(gid);
+------+------+--------+-------+
| gid  | uid  | uname  | gname |
+------+------+--------+-------+
|    0 |    0 | root   | root  |
|  101 |  201 | yuegao | dba   |
|  200 |  201 | yuegao | guest |
+------+------+--------+-------+
3 rows in set (0.00 sec)

   这样两个表的连接列只会显示一个。而最常用的形式:

mysql> select * from users1, groups1 where users1.gid = groups1.gid;
+------+--------+------+------+-------+
| uid  | uname  | gid  | gid  | gname |
+------+--------+------+------+-------+
|    0 | root   |    0 |    0 | root  |
|  201 | yuegao |  101 |  101 | dba   |
|  201 | yuegao |  200 |  200 | guest |
+------+--------+------+------+-------+
3 rows in set (0.00 sec)

 3.外连接

   左外连接:

mysql> select * from users1 left join groups1 on users1.gid = groups1.gid;
+------+----------+------+------+-------+
| uid  | uname    | gid  | gid  | gname |
+------+----------+------+------+-------+
|    0 | root     |    0 |    0 | root  |
|  201 | yuegao   |  101 |  101 | dba   |
|  202 | fengsong |  102 | NULL | NULL  |
|  201 | yuegao   |  200 |  200 | guest |
+------+----------+------+------+-------+
4 rows in set (0.00 sec)

   如果连接列名称相同,可以使用如下形式:

mysql> select * from users1 left join groups1 using(gid);
+------+------+----------+-------+
| gid  | uid  | uname    | gname |
+------+------+----------+-------+
|    0 |    0 | root     | root  |
|  101 |  201 | yuegao   | dba   |
|  102 |  202 | fengsong | NULL  |
|  200 |  201 | yuegao   | guest |
+------+------+----------+-------+
4 rows in set (0.00 sec)

   这样只会显示左侧表的连接列。

   右外连接:

mysql> select * from users1 right join groups1 on users1.gid = groups1.gid;
+------+--------+------+------+-------+
| uid  | uname  | gid  | gid  | gname |
+------+--------+------+------+-------+
|    0 | root   |    0 |    0 | root  |
|  201 | yuegao |  101 |  101 | dba   |
|  201 | yuegao |  200 |  200 | guest |
+------+--------+------+------+-------+
3 rows in set (0.00 sec)

   如果连接列名称相同,可以使用如下形式:

mysql> select * from users1 right join groups1 using(gid);
+------+-------+------+--------+
| gid  | gname | uid  | uname  |
+------+-------+------+--------+
|    0 | root  |    0 | root   |
|  101 | dba   |  201 | yuegao |
|  200 | guest |  201 | yuegao |
+------+-------+------+--------+
3 rows in set (0.00 sec)

   这样只会显示右侧表的连接列。

   外连接与分组结合使用,列出每个成员所属的组和每个组包含的成员:

mysql> select u.uname, group_concat(g.gname separator ',') from users1 as u left join groups1 as g u
sing(gid) group by u.uid;
+----------+-------------------------------------+
| uname    | group_concat(g.gname separator ',') |
+----------+-------------------------------------+
| root     | root                                |
| yuegao   | dba,guest                           |
| fengsong | NULL                                |
+----------+-------------------------------------+
3 rows in set (0.00 sec)

mysql> select g.gname, group_concat(u.uname separator ',') from users1 as u right join groups1 as g
using(gid) group by g.gid;
+-------+-------------------------------------+
| gname | group_concat(u.uname separator ',') |
+-------+-------------------------------------+
| root  | root                                |
| dba   | yuegao                              |
| guest | yuegao                              |
+-------+-------------------------------------+
3 rows in set (0.00 sec)

 4.自连接

mysql> select * from processes1;
+------+------------------+------+
| pid  | pname            | ppid |
+------+------------------+------+
|    1 | init             |    0 |
| 2915 | crond            |    1 |
| 3020 | hald             |    1 |
| 3021 | hald-runner      | 3020 |
| 4707 | gnome-terminal   |    1 |
| 4709 | gnome-pty-helper | 4707 |
| 4710 | bash             | 4707 |
+------+------------------+------+
7 rows in set (0.00 sec)

   对上表进行自连接查询,返回进程名和其父进程名:

mysql> select a.pname as pname, b.pname as ppname from processes1 as a, processes1 as b where a.ppid
= b.pid;
+------------------+----------------+
| pname            | ppname         |
+------------------+----------------+
| crond            | init           |
| hald             | init           |
| gnome-terminal   | init           |
| hald-runner      | hald           |
| gnome-pty-helper | gnome-terminal |
| bash             | gnome-terminal |
+------------------+----------------+
6 rows in set (0.00 sec)

mysql> select a.pname as pname, b.pname as ppname from processes1 as a left join processes1 as b on
a.ppid = b.pid;
+------------------+----------------+
| pname            | ppname         |
+------------------+----------------+
| init             | NULL           |
| crond            | init           |
| hald             | init           |
| hald-runner      | hald           |
| gnome-terminal   | init           |
| gnome-pty-helper | gnome-terminal |
| bash             | gnome-terminal |
+------------------+----------------+
7 rows in set (0.00 sec)


二、联合

mysql> select * from groups1;
+------+-------+
| gid  | gname |
+------+-------+
|    0 | root  |
|  101 | dba   |
|  200 | guest |
+------+-------+
3 rows in set (0.02 sec)

mysql> create table groups2 as select * from groups1 where 0 = 1;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into groups2 values (102, 'vip');
Query OK, 1 row affected (0.00 sec)

   对groups1和groups2进行联合查询:

mysql> select * from groups1 uNIOn select * from groups2;
+------+-------+
| gid  | gname |
+------+-------+
|    0 | root  |
|  101 | dba   |
|  200 | guest |
|  102 | vip   |
+------+-------+
4 rows in set (0.00 sec)

mysql> select * from groups1 where gid <> 0 union select * from groups2;
+------+-------+
| gid  | gname |
+------+-------+
|  101 | dba   |
|  200 | guest |
|  102 | vip   |
+------+-------+
3 rows in set (0.00 sec)

   进行联合必须满足两个基本条件:

1>  每个查询返回的字段的数量必须相同。
2>  每个查询返回的字段的数据类型必须相互符合。

   UNION运算符会自动消除联合中的重复记录,包括同一个表中的重复记录:

mysql> insert into groups1 values (0, 'root');
Query OK, 1 row affected (0.00 sec)

mysql> insert into groups2 values (0, 'root');
Query OK, 1 row affected (0.00 sec)

mysql> select * from groups1 union select * from groups2;
+------+-------+
| gid  | gname |
+------+-------+
|    0 | root  |
|  101 | dba   |
|  200 | guest |
|  102 | vip   |
+------+-------+
4 rows in set (0.00 sec)

   要返回联合中的所有记录,可以使用UNION ALL:

mysql> select * from groups1 union all select * from groups2;
+------+-------+
| gid  | gname |
+------+-------+
|    0 | root  |
|  101 | dba   |
|  200 | guest |
|    0 | root  |
|  102 | vip   |
|    0 | root  |
+------+-------+
6 rows in set (0.00 sec)


三、子查询

   子查询有不同的使用方法:

1>  在一个WHERE或者HAVING子句中使用。
2>  与比较和逻辑操作符一起使用。
3>  与IN成员测试仪器使用。
4>  与EXISTS布尔测试一起使用。
5>  在一个FROM子句中使用。
6>  与连接一起使用。
7>  与UPDATE和DELETE查询一起使用。

   MySQL不允许在使用子查询读数据的同时删除或者更新相同的表数据:

mysql> update users1 set gid = 200 where gid in (select users1.gid from users1 left join groups1 usi
ng(gid) where groups1.gname is null);
ERROR 1093 (HY000): You can't specify target table 'users1' for update in FROM clause

   子查询的主要优点:

1>  使查询结构化,将语句的各部分隔离。
2>  提供另一种方法来执行那些需要复杂的连接和联合的操作。
3>  在很多人的观念中,子查询比连接或联合更具有可读性。

   但是,子查询可能导致RDBMS负荷过大,大幅地降低性能,特别是外部参照的情况(),应谨慎使用。
   大多数情况下,子查询可以转换成连接,如下例(用的是oracle中查看表空间使用率的语句,只是为了说明问题):

select
a.tablespace_name tsname,
round(a.bytes,2)                Total_Mb,
round(a.MAXsize,2)              MAXSIZE_Gb,
round(b.bytes,2)                Free_Mb,
(1 - (b.bytes/a.bytes))*100     Pct_used
from
(
select tablespace_name,sum(MAXBYTES/1024/1024/1024) MAXsize,sum(bytes)/1024/1024 bytes
from dba_data_files
group by tablespace_name
) a,
(
select tablespace_name,sum(bytes)/1024/1024 bytes
from dba_free_space
group by tablespace_name
) b
where a.tablespace_name = b.tablespace_name
order by Pct_used;

   可以转换为:

select
a.tablespace_name tsname,
round(sum(a.bytes)/1024/1024,2)                Total_Mb,
round(sum(a.maxbytes/1024/1024/1024),2)              MAXSIZE_Gb,
round(sum(b.bytes)/1024/1024,2)                Free_Mb,
(1 - (sum(b.bytes)/sum(a.bytes)))*100          Pct_used
from dba_data_files a, dba_free_space b where a.tablespace_name = b.tablespace_name
group by a.tablespace_name order by Pct_used;


四、事务

 1.事务相关语句

   START TRANSACTION语句用于初始化一个事务,也可以使用BEGIN或BEGIN WORK语句。
   使用COMMIT语句确认所有的变化,或使用ROLLBACK语句撤销所有的变化。
   MySQL使用一个平面事务模型:嵌套的事务时不允许的,开始新的事务会自动提交之前的事务。其它的一些语句也会隐藏执行一个COMMIT命令:

1>  DROP DATABASE/DROP TABLE
2>  CREATE INDEX/DROP INDEX
3>  ALTER TABLE/RENAME TABLE
4>  LOCK TABLES/UNLOCK TABLES
5>  SET AUTOCOMMIT=1

  另外,MySQL也支持savepoints,这里不再赘述。

 2.控制事务行为

   AUTOCOMMIT变量指定是否开启自动提交模式。默认值为1,MySQL把每个语句作为一个单语句事务来处理。

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.03 sec)

   TRANSACTION ISOLATION LEVEL变量指定事务的隔离等级。默认值为REPEATABLE READ。

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

   可以设置的四个不同级别依照严格程度由高到低依次为:

1>  SERIALIZABLE(序列化)
2>  REPEATABLE READ(可重复读)
3>  READ COMMITTED(提交的读)
4>  READ UNCOMMITTED(未提交的读)

   设置该变量的方法如下:

mysql> set transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.05 sec)

mysql> select @@tx_isolation;
+------------------+
| @@tx_isolation   |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set (0.00 sec)

   也可以直接修改tx_isolation变量的值:

mysql> set tx_isolation='REPEATABLE-READ';
Query OK, 0 rows affected (0.00 sec)

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

 3.事务和性能

   在使用事务表类型时,需要通过一些方法减小对数据库性能的影响。

 1)使用小事务

   KISS原则-Keep It Simple, Stupid!

   使事务尽可能地小,且快速地变化和退出,这样其它队列中的事务就不会被过度地延迟:

1>  在发出START TRANSACTION命令之前,确保要求的用户输入都已完成。
   也就是说,不要在事务开始后因为等待用户输入而造成不必要的延迟。

2>  尝试把大的事务分成小的事务然后分别执行。

 2)选择合适的隔离等级

   隔离等级越高(严格),性能受到的影响越大。选择哪个隔离等级是基于对应用程序容错能力以及潜在数据错误的影响的判断,默认的REPEATABLE READ对于大多数情况都是适用的。

 3)避免死

   InnoDB表处理程序具有检查死锁情况的内建智能,当发现死锁时会撤销其中的一个事务(或释放锁定)来解决死锁。
   开发者在应用程序层面可以做很多事情来避免死锁:在会话初期获得需要的所有锁定;一直以相同的顺序处理表;如果RDBMS在解决死锁时撤销了事务,要使用内建的恢复程序来重新执行事务。

到此,关于“MySQL连接方式有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL连接方式有哪些

本文链接: https://www.lsjlt.com/news/69409.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL连接方式有哪些
    这篇文章主要介绍“MySQL连接方式有哪些”,在日常操作中,相信很多人在MySQL连接方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL连接方式有哪些”的疑惑...
    99+
    2024-04-02
  • JDBC连接Mysql的方式有哪些
    本篇内容主要讲解“JDBC连接Mysql的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JDBC连接Mysql的方式有哪些”吧!测试环境说明mysql数据库:jdbc:mysql://...
    99+
    2023-07-05
  • mysql表连接的方式有哪些
    MySQL表连接的方式有以下几种:1. 内连接(INNER JOIN):返回两个表中匹配的行。只有在连接条件为真的情况下,才返回行。...
    99+
    2023-08-11
    mysql
  • MySQL连接数据库的方式有哪些
    MySQL连接数据库的方式有以下几种:1. 使用命令行连接:在命令行窗口中使用mysql命令连接数据库,例如:mysql -h 主机...
    99+
    2023-09-09
    MySQL 数据库
  • MySQL数据库连接方式及工具有哪些
    这篇“MySQL数据库连接方式及工具有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“M...
    99+
    2023-03-31
    mysql
  • php连接mysql的方式之间有哪些区别
    这篇文章主要介绍“php连接mysql的方式之间有哪些区别”,在日常操作中,相信很多人在php连接mysql的方式之间有哪些区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php连接mysql的方式之间有哪...
    99+
    2023-06-30
  • 亚马逊连接方式有哪些
    亚马逊连接方式主要有以下几种: 搜索链接:通过在亚马逊网站上搜索商品,然后将搜索结果页面的链接复制到自己的网站或博客中,让读者点击链接进入亚马逊购买商品。 产品链接:在亚马逊网站上找到自己想要推广的商品,然后复制该商品的链接,将其放置在...
    99+
    2023-10-27
    亚马逊 方式 有哪些
  • oracle表连接的方式有哪些
    在Oracle数据库中,表连接的方式主要有以下几种: 内连接(INNER JOIN):内连接是最常用的连接方式,它只返回两个表之...
    99+
    2024-05-08
    Oracle
  • 数据库连接方式有哪些
    小编给大家分享一下数据库连接方式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在建立Oracle数据库的时候,应该会在数据...
    99+
    2024-04-02
  • java连接redis集群方式有哪些
    Java连接Redis集群的方式有以下几种:1. 使用Jedis Cluster:Jedis是Redis官方推荐的Java客户端之一...
    99+
    2023-09-16
    redis java
  • 数据库中表连接方式有哪些
    这篇文章将为大家详细讲解有关数据库中表连接方式有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 1 nested loop join 循...
    99+
    2024-04-02
  • MySQL中的连接方式有哪些它们之间有何区别
    MySQL中的连接方式主要有三种:内连接(INNER JOIN)、外连接(OUTER JOIN)、交叉连接(CROSS JOIN)。...
    99+
    2024-03-06
    MySQL
  • 常见数据库连接方式有哪些
    这篇文章给大家分享的是有关常见数据库连接方式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。1.Access数据库的DSN-less连接方法:set adocon=Serve...
    99+
    2024-04-02
  • JavaScript中有哪些字符串连接方式
    今天就跟大家聊聊有关JavaScript中有哪些字符串连接方式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JavaScript是什么JS是JavaScript的简称,它是一种直译式...
    99+
    2023-06-14
  • java连接oracle数据库的方式有哪些
    使用JDBC连接:可以通过JDBC(Java Database Connectivity)来连接Oracle数据库。首先需要下载...
    99+
    2024-04-09
    java oracle
  • mysql外连接类型有哪些
    本篇内容主要讲解“mysql外连接类型有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql外连接类型有哪些”吧!1、左外连接将左表中要丢弃的记录保留在结果集中,右表中对应的部分用nul...
    99+
    2023-06-20
  • mysql内连接和外连接有哪些区别
    这篇文章主要介绍“mysql内连接和外连接有哪些区别”,在日常操作中,相信很多人在mysql内连接和外连接有哪些区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql内...
    99+
    2024-04-02
  • python连接clickhouse数据库的方式有哪些
    这篇文章主要介绍“python连接clickhouse数据库的方式有哪些”,在日常操作中,相信很多人在python连接clickhouse数据库的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”pyt...
    99+
    2023-06-30
  • PHP中有哪些连接数据库的方式
    本篇文章给大家分享的是有关PHP中有哪些连接数据库的方式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。PHP连接数据库之PHP连接MYSQL数据库代码< php...
    99+
    2023-06-17
  • PHP连接MYSQL数据库的方法有哪些
    使用mysqli扩展:通过mysqli_connect()函数连接数据库并执行查询。 使用PDO扩展:使用PDO连接数据库并...
    99+
    2024-04-09
    PHP MYSQL
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作