MySQL数据库——查询数据案例(2)

为了演示的需要,首先创建数据表suppliers,SQL语句如下:

CREATE TABLE suppliers
(
  s_id      int      NOT NULL AUTO_INCREMENT,
  s_name    char(50) NOT NULL,
  s_city    char(50) NULL,
  s_zip     char(10) NULL,
  s_call    CHAR(50) NOT NULL,
  PRIMARY KEY (s_id)
) ;

插入需要演示的数据,SQL语句如下:

INSERT INTO suppliers(s_id, s_name,s_city,  s_zip, s_call)
VALUES(101,'FastFruit Inc.','Tianjin','300000','48075'),
(102,'LT Supplies','Chongqing','400000','44333'),
(103,'ACME','Shanghai','200000','90046'),
(104,'FNK Inc.','Zhongshan','528437','11111'),
(105,'Good Set','Taiyuang','030000', '22222'),
(106,'Just Eat Ours','Beijing','010', '45678'),
(107,'DK Inc.','Zhengzhou','450000', '33332');

【例46】在fruits表和suppliers表之间使用内连接查询。
查询之前,查看两个表的结构:

 DESC fruits;

 DESC suppliers;

由结果可以看到,fruits表和suppliers表中都有相同数据类型的字段s_id,两个表通过s_id字段建立联系。接下来从fruits表中查询f_name、f_price字段,从suppliers表中查询s_id、s_name,SQL语句如下:

 SELECT suppliers.s_id, s_name,f_name, f_price
     FROM fruits ,suppliers
     WHERE fruits.s_id = suppliers.s_id;

【例47】在fruits表和suppliers表之间,使用INNER JOIN语法进行内连接查询,SQL语句如下:

 SELECT suppliers.s_id, s_name,f_name, f_price
     FROM fruits INNER JOIN suppliers
     ON fruits.s_id = suppliers.s_id;

【例48】查询供应f_id= ‘a1’的水果供应商提供的其他水果种类,SQL语句如下:

SELECT f1.f_id, f1.f_name
      FROM fruits AS f1, fruits AS f2
      WHERE f1.s_id = f2.s_id AND f2.f_id = 'a1';

1.LEFT JOIN左连接
左连接的结果包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果行中,右表的所有选择列表列均为空值。
首先创建表orders,SQL语句如下:

CREATE TABLE orders
(
  o_num  int      NOT NULL AUTO_INCREMENT,
  o_date datetime NOT NULL,
  c_id   int      NOT NULL,
  PRIMARY KEY (o_num)
) ;

插入需要演示的数据,SQL语句如下:

INSERT INTO orders(o_num, o_date, c_id)
VALUES(30001, '2008-09-01', 10001),
(30002, '2008-09-12', 10003),
(30003, '2008-09-30', 10004),
(30004, '2008-10-03', 10005),
(30005, '2008-10-08', 10001);

【例49】在customers表和orders表中,查询所有客户,包括没有订单的客户,SQL语句如下:

 SELECT customers.c_id, orders.o_num
     FROM customers LEFT OUTER JOIN orders
     ON customers.c_id = orders.c_id;

2.RIGHT JOIN右连接
右连接是左连接的反向连接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,左表将返回空值。
【例50】在customers表和orders表中,查询所有订单,包括没有客户的订单,SQL语句如下:

 SELECT customers.c_id, orders.o_num
     FROM customers RIGHT OUTER JOIN orders
     ON customers.c_id = orders.c_id;

【例51】在customers表和orders表中,使用INNER JOIN语法查询customers表中ID为10001的客户的订单信息,SQL语句如下:

 SELECT customers.c_id, orders.o_num
     FROM customers INNER JOIN orders
     ON customers.c_id = orders.c_id AND customers.c_id = 10001;

【例52】在fruits表和suppliers表之间,使用INNER JOIN语法进行内连接查询,并对查询结果排序,SQL语句如下:

 SELECT suppliers.s_id, s_name,f_name, f_price
     FROM fruits INNER JOIN suppliers
     ON fruits.s_id = suppliers.s_id
     ORDER BY fruits.s_id;

带ANY、SOME关键字的子查询
ANY和SOME关键字是同义词,表示满足其中任一条件,它们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。
下面定义两个表tb1和tb2:

CREATE table tbl1 ( num1 INT NOT NULL);
CREATE table tbl2 ( num2 INT NOT NULL);

分别向两个表中插入数据:

INSERT INTO tbl1 values(1), (5), (13), (27);
INSERT INTO tbl2 values(6), (14), (11), (20);

ANY关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为TRUE,则返回TRUE。

【例53】返回tbl2表的所有num2列,然后将tbl1中的num1的值与之进行比较,只要大于num2的任何1个值,即为符合查询条件的结果。

 SELECT num1 FROM tbl1 
 WHERE num1 > ANY (SELECT num2 FROM tbl2);

【例54】返回tbl1表中比tbl2表num2 列所有值都大的值,SQL语句如下:

 SELECT num1 FROM tbl1 
 WHERE num1 > ALL (SELECT num2 FROM tbl2);

【例55】查询suppliers表中是否存在s_id=107的供应商,如果存在,则查询fruits表中的记录,SQL语句如下:

 SELECT * FROM fruits
     WHERE EXISTS
     (SELECT s_name FROM suppliers WHERE s_id = 107);

【例56】查询suppliers表中是否存在s_id=107的供应商,如果存在,则查询fruits表中的f_price大于10.20的记录,SQL语句如下:

 SELECT * FROM fruits
     WHERE f_price>10.20 AND EXISTS
     (SELECT s_name FROM suppliers WHERE s_id = 107);

【例57】查询suppliers表中是否存在s_id=107的供应商,如果不存在则查询fruits表中的记录,SQL语句如下:

 SELECT * FROM fruits
     WHERE NOT EXISTS
     (SELECT s_name FROM suppliers WHERE s_id = 107);

【例58】在orderitems表中查询f_id为c0的订单号,并根据订单号查询具有订单号的客户c_id,SQL语句如下:

 SELECT c_id FROM orders WHERE o_num IN
     (SELECT o_num  FROM orderitems WHERE f_id = 'c0');
 SELECT o_num  FROM orderitems WHERE f_id = 'c0';

可以看到,符合条件的o_num列的值有两个:30003和30005,然后执行外层查询,在orders表中查询订单号等于30003或30005的客户c_id。嵌套子查询语句还可以写为如下形式,实现相同的效果:

 SELECT c_id FROM orders WHERE o_num IN (30003, 30005);

【例59】与前一个例子类似,但是在SELECT语句中使用NOT IN关键字,SQL语句如下:

 SELECT c_id FROM orders WHERE o_num NOT IN
     (SELECT o_num  FROM orderitems WHERE f_id = 'c0');

 SELECT * FROM orders;

【例60】在suppliers表中查询s_city等于“Tianjin”的供应商s_id,然后在fruits表中查询所有该供应商提供的水果的种类,SQL语句如下:

SELECT s_id, f_name FROM fruits
WHERE s_id =
(SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city = 'Tianjin');

【例61】在suppliers表中查询s_city等于“Tianjin”的供应商s_id,然后在fruits表中查询所有非该供应商提供的水果的种类,SQL语句如下:

 SELECT s_id, f_name FROM fruits
     WHERE s_id <>
     (SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city = 'Tianjin');

【例62】查询所有价格小于9的水果的信息,查询s_id等于101和103所有的水果的信息,使用UNION连接查询结果,SQL语句如下:

SELECT s_id, f_name, f_price 
FROM fruits
WHERE f_price < 9.0
UNION ALL
SELECT s_id, f_name, f_price 
FROM fruits
WHERE s_id IN(101,103);

如前所述,UNION将多个SELECT语句的结果组合成一个结果集合。可以分开查看每个SELECT语句的结果:

 SELECT s_id, f_name, f_price
     FROM fruits
     WHERE f_price < 9.0;
+------+-----------+---------+
| s_id | f_name  | f_price |
+------+-----------+---------+
|  101 | apple   |    5.20 |
|  103 | apricot  |    2.20 |
|  104 | berry   |    7.60 |
|  107 | xxxx    |    3.60 |
|  105 | melon   |    8.20 |
|  101 | cherry   |    3.20 |
|  104 | lemon   |    6.40 |
|  105 | xbabay  |    2.60 |
|  102 | grape   |    5.30 |
|  107 | xbababa |    3.60 |
+------+-----------+---------+
10 rows in set (0.00 sec)
 SELECT s_id, f_name, f_price
     FROM fruits
     WHERE s_id IN(101,103);
+------+------------+---------+
| s_id | f_name   | f_price |
+------+------------+---------+
|  101 | apple   |    5.20 |
|  103 | apricot  |    2.20 |
|  101 | blackberry|   10.20 |
|  101 | cherry   |    3.20 |
|  103 | coconut |    9.20 |
+------+------------+---------+

【例63】查询所有价格小于9的水果的信息,查询s_id等于101和103的所有水果的信息,使用UNION ALL连接查询结果,SQL语句如下:

SELECT s_id, f_name, f_price 
FROM fruits
WHERE f_price < 9.0
UNION ALL
SELECT s_id, f_name, f_price 
FROM fruits
WHERE s_id IN(101,103);

【例64】为orders表取别名o,查询30001订单的下单日期,SQL语句如下:

SELECT * FROM orders AS o 
WHERE o.o_num = 30001;

在这里orders AS o代码表示为orders表取别名为o,指定过滤条件时直接使用o代替orders,查询结果如下:

+-------+---------------------+-------+
| o_num | o_date        | c_id  |
+-------+---------------------+-------+
| 30001 | 2008-09-01 00:00:00 | 10001 |
+-------+---------------------+-------+

【例65】为customers和orders表分别取别名,并进行连接查询,SQL语句如下:

 SELECT c.c_id, o.o_num
     FROM customers AS c LEFT OUTER JOIN orders AS o
     ON c.c_id = o.c_id;
     
+-------+-------+
| c_id  | o_num |
+-------+-------+
| 10001 | 30001 |
| 10001 | 30005 |
| 10002 | NULL |
| 10003 | 30002 |
| 10004 | 30003 |
+-------+-------+

由结果看到,MySQL可以同时为多个表取别名,而且表别名可以放在不同的位置,如WHERE子句、SELECT列表、ON子句以及ORDER BY子句等。
在前面介绍内连接查询时指出自连接是一种特殊的内连接,在连接查询中的两个表都是同一个表,其查询语句如下:

 SELECT f1.f_id, f1.f_name
      FROM fruits AS f1, fruits AS f2
      WHERE f1.s_id = f2.s_id AND f2.f_id = 'a1';
      
+------+------------+
| f_id | f_name   |
+------+------------+
| a1   | apple    |
| b1   | blackberry |
| c0   | cherry   |
+------+------------+

【例66】查询fruits表,为f_name取别名fruit_name,f_price取别名fruit_price,为fruits表取别名f1,查询表中f_price < 8的水果的名称,SQL语句如下:

 SELECT f1.f_name AS fruit_name, f1.f_price AS fruit_price
     FROM fruits AS f1
     WHERE f1.f_price < 8;

【例67】查询suppliers表中字段s_name和s_city,使用CONCAT函数连接这两个字段值,并取列别名为suppliers_title。
如果没有对连接后的值取别名,其显示列名称将会不够直观,SQL语句如下:

 SELECT CONCAT(TRIM(s_name) , ' (',  TRIM(s_city), ')')
      FROM suppliers
      ORDER BY s_name;
      
+--------------------------------------------------------------+
| CONCAT(TRIM(s_name) , ' (',  TRIM(s_city), ')') |
+--------------------------------------------------------------+
| ACME (Shanghai)                          |
| DK Inc. (Qingdao)                           |
| FastFruit Inc. (Tianjin)                        |
| FNK Inc. (Zhongshan)                        |
| Good Set (Taiyuan)                          |
| Just Eat Ours (Beijing)                        |
| LT Supplies (Chongqing)                      |
+---------------------------------------------------------------+

由结果可以看到,显示结果的列名称为SELECT子句后面的计算字段,实际上计算之后的列是没有名字的,这样的结果让人很不容易理解,如果为字段取一个别名,将会使结果清晰,SQL语句如下,

 SELECT CONCAT(TRIM(s_name) , ' (', TRIM(s_city), ')')
     AS suppliers_title
     FROM suppliers
     ORDER BY s_name;
+------------------------------+
| suppliers_title         |
+------------------------------+
| ACME (Shanghai)     |
| DK Inc. (Qingdao)     |
| FastFruit Inc. (Tianjin)  |
| FNK Inc. (Zhongshan)  |
| Good Set (Taiyuan)     |
| Just Eat Ours (Beijing)  |
| LT Supplies (Chongqing)|
+------------------------------+

【例68】在fruits表中,查询f_name字段以字母’b’开头的记录,SQL语句如下:

 SELECT * FROM fruits WHERE f_name REGEXP '^b';
+------+------+-----------------+------------+
| f_id | s_id | f_name      |  f_price  |
+------+------+-----------------+-------------+
| b1   |  101  | blackberry |   10.20  |
| b2   |  104  | berry     |    7.60  |
| t1   |  102  | banana    |   10.30  |
+------+----------+---------------+-----------+

fruits表中有3条记录的f_name字段值是以字母b开头,返回结果有3条记录。

【例69】在fruits表中,查询f_name字段以“be”开头的记录,SQL语句如下:

 SELECT * FROM fruits WHERE f_name REGEXP '^be';
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| b2  |  104 | berry |   7.60  |
+------+------+--------+---------+

只有berry是以“be”开头,所以查询结果中只有1条记录。


超全面的测试IT技术课程,0元立即加入学习!有需要的朋友戳:


腾讯课堂测试技术学习地址

欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我将为您介绍如何进行MySQL数据库数据查询操作实验。 首先,我们需要连接到MySQL数据库。在终端中输入以下命令: ``` mysql -u username -p ``` 其中,username是您的MySQL用户名。按回车键后,系统会提示您输入密码。输入密码后,按回车键即可连接到MySQL数据库。 在连接成功后,我们需要选择要查询数据库。输入以下命令: ``` use database_name; ``` 其中,database_name是您要查询数据库名称。 接着,我们可以使用SELECT语句来查询数据。以下是一个基本的SELECT语句: ``` SELECT * FROM table_name; ``` 其中,table_name是您要查询格名称。这个语句将会查询格中的所有数据。 如果您只想查询特定的列,可以将列名称替换为*。例如: ``` SELECT column1, column2, column3 FROM table_name; ``` 这个语句将会查询格中的column1、column2和column3列的数据。 如果您只想查询满足特定条件的数据,可以使用WHERE子句。例如,以下语句将会查询格中age大于等于18岁的数据: ``` SELECT * FROM table_name WHERE age >= 18; ``` 除了WHERE子句,您还可以使用ORDER BY子句来按照特定列的值对数据进行排序。例如,以下语句将会按照age列的值从小到大对数据进行排序: ``` SELECT * FROM table_name ORDER BY age ASC; ``` 最后,查询结束后,您可以使用exit命令来退出MySQL数据库: ``` exit; ``` 希望这些信息能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值