MySQL怎么创建多个表的更新与删除

61次阅读
没有评论

共计 7818 个字符,预计需要花费 20 分钟才能阅读完成。

本篇内容主要讲解“MySQL 怎么创建多个表的更新与删除”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“MySQL 怎么创建多个表的更新与删除”吧!

1. 涉及多个表的更新与删除
    创建测试用表:

mysql create table users1
   – (
   – uid tinyint unsigned,
   – uname varchar(255),
   – gid tinyint unsigned
   –
Query OK, 0 rows affected (0.06 sec)

mysql create table groups1
   – (
   – gid tinyint unsigned,
   – gname varchar(255)
   –
Query OK, 0 rows affected (0.02 sec)

[@more@]mysql insert into users1 values (0, root , 0);
Query OK, 1 row affected (0.00 sec)

mysql insert into users1 values (201, ggyy , 101);
Query OK, 1 row affected (0.00 sec)

mysql insert into users1 values (202, ssff , 101);
Query OK, 1 row affected (0.00 sec)

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

mysql insert into groups1 values (101, guest
Query OK, 1 row affected (0.00 sec)

mysql select * from users1;
+——+——-+——+
| uid  | uname | gid  |
+——+——-+——+
|    0 | root  |    0 |
|  201 | ggyy  |  101 |
|  202 | ssff  |  101 |
+——+——-+——+
3 rows in set (0.00 sec)

mysql select * from groups1;
+——+——-+
| gid  | gname |
+——+——-+
|    0 | root  |
|  101 | guest |
+——+——-+
2 rows in set (0.00 sec)

    下面的语句将 users1 表中属于 guest 组的用户的 uid 加 10:

mysql update users1, groups1 set users1.uid = users1.uid + 10 where users1.gid = groups1.gid and gr
oups1.gname = guest
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql select * from users1;
+——+——-+——+
| uid  | uname | gid  |
+——+——-+——+
|    0 | root  |    0 |
|  211 | ggyy  |  101 |
|  212 | ssff  |  101 |
+——+——-+——+
3 rows in set (0.00 sec)

    下面的语句将两个表中 guest 组的 gid 变为 102:

mysql update users1, groups1 set users1.gid = 102, groups1.gid = 102 where users1.gid = groups1.gid
and groups1.gid = 101;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql select * from users1;
+——+——-+——+
| uid  | uname | gid  |
+——+——-+——+
|    0 | root  |    0 |
|  211 | ggyy  |  102 |
|  212 | ssff  |  102 |
+——+——-+——+
3 rows in set (0.00 sec)

mysql select * from groups1;
+——+——-+
| gid  | gname |
+——+——-+
|    0 | root  |
|  102 | guest |
+——+——-+
2 rows in set (0.00 sec)

    但是,这样的语句就会产生错误的结果:

mysql update users1, groups1 set users1.gid = 102, groups1.gid = 102 where users1.gid = groups1.gid
and groups1.gname = guest
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql select * from users1;
+——+——-+——+
| uid  | uname | gid  |
+——+——-+——+
|    0 | root  |    0 |
|  211 | ggyy  |  102 |
|  212 | ssff  |  101 |
+——+——-+——+
3 rows in set (0.00 sec)

mysql select * from groups1;
+——+——-+
| gid  | gname |
+——+——-+
|    0 | root  |
|  102 | guest |
+——+——-+
2 rows in set (0.00 sec)

   ssff 用户的 gid 没有更新,想不太明白原因。

    下面的语句删除 users1 表中属于 root 组的用户的记录:

mysql delete from users1 using users1, groups1 where users1.gid = groups1.gid and groups1.gname =
root
Query OK, 1 row affected (0.00 sec)

mysql select * from users1;
+——+——-+——+
| uid  | uname | gid  |
+——+——-+——+
|  211 | ggyy  |  102 |
|  212 | ssff  |  102 |
+——+——-+——+
2 rows in set (0.02 sec)

mysql select * from groups1;
+——+——-+
| gid  | gname |
+——+——-+
|    0 | root  |
|  102 | guest |
+——+——-+
2 rows in set (0.00 sec)

    该删除语句可以写成这样的形式:“delete users1 from users1, groups1 where users1.gid = groups1.gid and groups1.gname = root”。注意,from 前面的是要删除记录的表,后面的是删除操作涉及的几个表(本例中是内连接,可以为其它连接类型)。

    下面的语句删除 users1 表中属于 guest 组的用户的记录以及 groups1 表中 guest 组的记录。

mysql delete from users1, groups1 using users1, groups1 where users1.gid = groups1.gid and groups1.
gname = guest
Query OK, 3 rows affected (0.00 sec)

mysql select * from users1;
Empty set (0.02 sec)

mysql select * from groups1;
+——+——-+
| gid  | gname |
+——+——-+
|    0 | root  |
+——+——-+
1 row in set (0.00 sec)

    同样,该删除语句可以写成这样的形式:“delete users1, groups1 from users1, groups1 where users1.gid = groups1.gid and groups1.gname = guest”。

2. 随机选择记录

    将 ORDER BY 子句和 RAND() 函数结合使用,可以达到随机选择表中记录的效果:

mysql select * from oraleng;
+————————–+————————–+
| ask                      | answer                   |
+————————–+————————–+
| How do you do?           | How do you do?           |
| How are you?             | Fine.Thank you.          |
| What s your name?        | My name is Jack Sparrow. |
| Where are you from?      | I m from maldives.       |
| What s the weather like? | It s fine.               |
| What time is it now?     | It s seven o clock.      |
| What day is it today?    | It s Wednesday.          |
+————————–+————————–+
7 rows in set (0.00 sec)

mysql select * from oraleng order by rand() limit 1;
+————–+—————–+
| ask          | answer          |
+————–+—————–+
| How are you? | Fine.Thank you. |
+————–+—————–+
1 row in set (0.02 sec)

mysql select * from oraleng order by rand() limit 1;
+———————–+—————–+
| ask                   | answer          |
+———————–+—————–+
| What day is it today? | It s Wednesday. |
+———————–+—————–+
1 row in set (0.02 sec)

mysql select * from oraleng order by rand() limit 1;
+——————-+————————–+
| ask               | answer                   |
+——————-+————————–+
| What s your name? | My name is Jack Sparrow. |
+——————-+————————–+
1 row in set (0.02 sec)

mysql select * from oraleng order by rand() limit 2;
+———————-+———————+
| ask                  | answer              |
+———————-+———————+
| What time is it now? | It s seven o clock. |
| Where are you from?  | I m from maldives.  |
+———————-+———————+
2 rows in set (0.02 sec)

3. 控制 SELECT 行为

    下面是一些能够改变 SELECT 语句行为的关键字:

   DISTINCT:删除结果集中的包含重复值记录。
   SQL_CALC_FOUND_ROWS:计算符合查询的总行数。不受 LIMIT 影响,通过调用 FOUND_ROWS 函数可以得到结果。
   SQL_CACHE 和 SQL_NO_CACHE:指定查询结果是否需要高速缓存。
   SQL_BUFFER_RESULT:强制将查询结果存储到一个临时表。这种缓冲消除了对查询的表的锁定。
   SQL_BIG_RESULT 和 SQL_SMALL_RESULT:指定结果集的期望大小。这样可帮助找到对返回的记录进行排序和存储的最佳方法(基于磁盘或者内存中的临时表)。
   SQL_HIGH_PRIORITY:提升与 UPDATE, INSERT 和 DELETE 语句相竞争的查询的优先级。可以在繁忙的数据库服务器上快速地执行查询。

4. 从文件导入和向文件导出

    可以使用 LOAD DATA INFILE 语句将文件中的数据导入到表中,也可以使用 SELECT…INTO OUTFILE 语句将表中的记录导出到文件中。

 1) 分隔符

    在上述语句中,使用一些子句和关键字指定文件中的数据格式。

   LINES TERMINATED BY 子句:指定记录的结束符。(默认情况下,n 表示新的一行。)
   FIELDS 子句:指定字段的分割符。FIELDS 后面跟着 TERMINATED BY, ESCAPED BY, ENCLOSED BY 等关键字中的一个或多个。
               TERMINATED BY 指定字段的结束符(默认为 t);ESCAPED BY 用于跳过特殊的字符(默认为反斜线);ENCLOSED BY 指定包围字段的符号(默认无)。

 2) 从文件中导入数据

   E:downloadcontact.txt 是一个包含着一组联系人信息的文本文件,其内容如下:

河北联通石家庄分公司, 张少兰,0311-87052200
河北联通沧州分公司, 王建荣,0317-3520079
河北联通保定分公司, 孙凤睿,0312-3075574
河北联通廊坊分公司, 庞海静,0316-2684535
河北联通秦皇岛分公司, 代艳丽,0335-3050172
……

    现在创建一个用于存储这些联系人信息的表:

mysql create table contact
   – (
   – name varchar(20),
   – sex enum(男 , 女),
   – tel bigint,
   – email varchar(50),
   – company varchar(50)
   –
Query OK, 0 rows affected (0.13 sec)

    使用 Load DATA INFILE 语句向其中导入数据:

mysql load data infile E:downloadcontact.txt into table contact
   – fields terminated by , escaped by – lines terminated by rn
   – (company, name, tel);
Query OK, 46 rows affected (0.02 sec)
Records: 46  Deleted: 0  Skipped: 0  Warnings: 0

mysql select * from contact limit 7;
+——–+——+————-+——-+———————-+
| name   | sex  | tel         | email | company              |
+——–+——+————-+——-+———————-+
| 张少兰 | NULL | 31187052200 | NULL  | 河北联通石家庄分公司 |
| 王建荣 | NULL |  3173520079 | NULL  | 河北联通沧州分公司   |
| 孙凤睿 | NULL |  3123075574 | NULL  | 河北联通保定分公司   |
| 庞海静 | NULL |  3162684535 | NULL  | 河北联通廊坊分公司   |
| 代艳丽 | NULL |  3353050172 | NULL  | 河北联通秦皇岛分公司 |
| 齐卫花 | NULL |  3132018225 | NULL  | 河北联通张家口分公司 |
| 刘守政 | NULL |  3182698169 | NULL  | 河北联通衡水分公司   |
+——–+——+————-+——-+———————-+
7 rows in set (0.00 sec)

    几点说明:

 a. 进行导入的用户必须具有 FILE 权限。
 b. 文件路径中的“”符号要用“”来代替。
 c. 当文件中各部分内容与表中的字段数量或顺序不符时,可以在 LOAD DATA INFILE 语句的最后指定一个字段名的列表,来将文件中的各部分内容映射到正确的字段中。

    介绍 LOAD DATA INFILE 语句中的一些关键字:

   LOCAL:指定 INFILE 是在客户机的文件系统上。默认情况下,认为在服务器上。
   LOW_PRIORITY:延迟 LOAD DATA 语句的执行,直到没有其它的客户端从表中读取为止。
   IGNORE, REPLACE:当插入的新记录的一个键与已存在的记录的重复时,跳过该条新记录或用新记录替换已存在的记录。

 3) 向文件中导出记录

    使用 SELECT INTO…OUTFILE 语句向文本文件 contact2.txt 中导出记录:

mysql select name, tel, company from contact where name like 张 %
   – into outfile E:downloadcontact2.txt
   – fields enclosed by lines terminated by rn
Query OK, 4 rows affected (0.06 sec)

    查看一下该文件的内容:

张少兰     31187052200     河北联通石家庄分公司
张雷     3125902030     河北电信保定分公司
张东旺     3155960019     迁安市星宇商贸有限公司
张蕾     3123100913     保定企盟信息网络有限公司

    几点说明:

 a. 进行导出的用户必须具有 FILE 权限。
 b. 导出文件事先不能存在。否则会发生错误:

ERROR 1086 (HY000): File E:downloadcontact2.txt already exists

 c. 对于二进制数据,如 BLOB 类型,可以使用 INTO DUMPFILE 子句代替 INTO OUTFILE 子句。这样 MySQL 将以一个单独行的格式向文件写入数据(没有字段或记录结束符),从而避免破坏二进制数据。

到此,相信大家对“MySQL 怎么创建多个表的更新与删除”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-18发表,共计7818字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)