第六章《MySQL查询》

2022-11-21 17:26:41 浏览数 (2)

1.单表查询: 查询的语法: select {*|字段} FROM 表名 [WHERE 条件判断] [GROUP BY 字段] [HAVING expr] [ORDER BY 字段 ASC(升序)/DESC(降序)] [limit 偏移量,行数]

1.WHERE子句: (1)使用where子句来设定查询条件; (2)where子句中可以指定任何条件 (3)你可以使用AND或者OR指定一个或多个条件 (4)where子句也可以运用于SQL的DELETE或者UPDATE命令 (5)where子句常使用运算符来指定条件

代码语言:javascript复制
mysql> use TEST2
Database changed
mysql> CREATE TABLE FRUITS(
    -> F_ID CHAR(10) NOT NULL,
    -> S_ID INT NOT NULL,
    -> F_NAME VARCHAR(255) NOT NULL,
    -> F_PRICE DECIMAL(8,2) NOT NULL,
    -> PRIMARY KEY(F_ID)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> desc FRUITS;
 --------- -------------- ------ ----- --------- ------- 
| Field   | Type         | Null | Key | Default | Extra |
 --------- -------------- ------ ----- --------- ------- 
| F_ID    | char(10)     | NO   | PRI | NULL    |       |
| S_ID    | int(11)      | NO   |     | NULL    |       |
| F_NAME  | varchar(255) | NO   |     | NULL    |       |
| F_PRICE | decimal(8,2) | NO   |     | NULL    |       |
 --------- -------------- ------ ----- --------- ------- 
4 rows in set (0.00 sec)

mysql> INSERT INTO FRUITS VALUES('A',101,'APPLE',5.2),('B1',101,'BLACKBERRY',10.2),('BS1',102,'ORANGE',11.2),('BS2',105,'MELON',8.2),('T1',102,'BANANA',10.3),('T2',102,'GRAPE',5.3),('O2',103,'COCONUT',9.2),('C0',101,'CHERRY',3.2),('A2',103,'APRICOT',2.2),('L2',104,'LEMON',6.4),('B2',104,'BERRY',7.6),('M1',106,'MANGO',15.6),('M2',105,'XBABAY',2.6),('M3',105,'XXTT',11.6),('B5',107,'XXWWW',3.6);
Query OK, 15 rows affected (0.00 sec)
Records: 15  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM FRUITS;
 ------ ------ ------------ --------- 
| F_ID | S_ID | F_NAME     | F_PRICE |
 ------ ------ ------------ --------- 
| A    |  101 | APPLE      |    5.20 |
| A2   |  103 | APRICOT    |    2.20 |
| B1   |  101 | BLACKBERRY |   10.20 |
| B2   |  104 | BERRY      |    7.60 |
| B5   |  107 | XXWWW      |    3.60 |
| BS1  |  102 | ORANGE     |   11.20 |
| BS2  |  105 | MELON      |    8.20 |
| C0   |  101 | CHERRY     |    3.20 |
| L2   |  104 | LEMON      |    6.40 |
| M1   |  106 | MANGO      |   15.60 |
| M2   |  105 | XBABAY     |    2.60 |
| M3   |  105 | XXTT       |   11.60 |
| O2   |  103 | COCONUT    |    9.20 |
| T1   |  102 | BANANA     |   10.30 |
| T2   |  102 | GRAPE      |    5.30 |
 ------ ------ ------------ --------- 
15 rows in set (0.00 sec)

mysql> SELECT F_NAME,F_PRICE FROM FRUITS;
 ------------ --------- 
| F_NAME     | F_PRICE |
 ------------ --------- 
| APPLE      |    5.20 |
| APRICOT    |    2.20 |
| BLACKBERRY |   10.20 |
| BERRY      |    7.60 |
| XXWWW      |    3.60 |
| ORANGE     |   11.20 |
| MELON      |    8.20 |
| CHERRY     |    3.20 |
| LEMON      |    6.40 |
| MANGO      |   15.60 |
| XBABAY     |    2.60 |
| XXTT       |   11.60 |
| COCONUT    |    9.20 |
| BANANA     |   10.30 |
| GRAPE      |    5.30 |
 ------------ --------- 
15 rows in set (0.00 sec)

mysql> SELECT * FROM FRUITS WHERE F_NAME='APPLE';
 ------ ------ -------- --------- 
| F_ID | S_ID | F_NAME | F_PRICE |
 ------ ------ -------- --------- 
| A    |  101 | APPLE  |    5.20 |
 ------ ------ -------- --------- 
1 row in set (0.00 sec)

mysql> SELECT * FROM FRUITS WHERE F_NAME IN ('APPLE','ORANGE');
 ------ ------ -------- --------- 
| F_ID | S_ID | F_NAME | F_PRICE |
 ------ ------ -------- --------- 
| A    |  101 | APPLE  |    5.20 |
| BS1  |  102 | ORANGE |   11.20 |
 ------ ------ -------- --------- 
2 rows in set (0.01 sec)

mysql> SELECT F_PRICE FROM FRUITS WHERE F_NAME IN ('APPLE','ORANGE');
 --------- 
| F_PRICE |
 --------- 
|    5.20 |
|   11.20 |
 --------- 
2 rows in set (0.00 sec)

mysql> SELECT F_ID,F_NAME,F_PRICE FROM FRUITS WHERE F_NAME IN ('APPLE','ORANGE');
 ------ -------- --------- 
| F_ID | F_NAME | F_PRICE |
 ------ -------- --------- 
| A    | APPLE  |    5.20 |
| BS1  | ORANGE |   11.20 |
 ------ -------- --------- 
2 rows in set (0.00 sec)

mysql> SELECT F_ID,F_NAME,F_PRICE FROM FRUITS WHERE F_NAME NOT IN ('APPLE','ORANGE');
 ------ ------------ --------- 
| F_ID | F_NAME     | F_PRICE |
 ------ ------------ --------- 
| A2   | APRICOT    |    2.20 |
| B1   | BLACKBERRY |   10.20 |
| B2   | BERRY      |    7.60 |
| B5   | XXWWW      |    3.60 |
| BS2  | MELON      |    8.20 |
| C0   | CHERRY     |    3.20 |
| L2   | LEMON      |    6.40 |
| M1   | MANGO      |   15.60 |
| M2   | XBABAY     |    2.60 |
| M3   | XXTT       |   11.60 |
| O2   | COCONUT    |    9.20 |
| T1   | BANANA     |   10.30 |
| T2   | GRAPE      |    5.30 |
 ------ ------------ --------- 
13 rows in set (0.00 sec)

mysql> SELECT * FROM FRUITS WHERE F_PRICE BETWEEN 5 AND 15;
 ------ ------ ------------ --------- 
| F_ID | S_ID | F_NAME     | F_PRICE |
 ------ ------ ------------ --------- 
| A    |  101 | APPLE      |    5.20 |
| B1   |  101 | BLACKBERRY |   10.20 |
| B2   |  104 | BERRY      |    7.60 |
| BS1  |  102 | ORANGE     |   11.20 |
| BS2  |  105 | MELON      |    8.20 |
| L2   |  104 | LEMON      |    6.40 |
| M3   |  105 | XXTT       |   11.60 |
| O2   |  103 | COCONUT    |    9.20 |
| T1   |  102 | BANANA     |   10.30 |
| T2   |  102 | GRAPE      |    5.30 |
 ------ ------ ------------ --------- 
10 rows in set (0.00 sec)

mysql> SELECT * FROM FRUITS WHERE F_PRICE=5.2;
 ------ ------ -------- --------- 
| F_ID | S_ID | F_NAME | F_PRICE |
 ------ ------ -------- --------- 
| A    |  101 | APPLE  |    5.20 |
 ------ ------ -------- --------- 
1 row in set (0.00 sec)

mysql> SELECT * FROM FRUITS WHERE F_PRICE LIKE 5.20;
 ------ ------ -------- --------- 
| F_ID | S_ID | F_NAME | F_PRICE |
 ------ ------ -------- --------- 
| A    |  101 | APPLE  |    5.20 |
 ------ ------ -------- --------- 
1 row in set (0.00 sec)

mysql> SELECT * FROM FRUITS WHERE F_NAME LIKE 'A%';
 ------ ------ --------- --------- 
| F_ID | S_ID | F_NAME  | F_PRICE |
 ------ ------ --------- --------- 
| A    |  101 | APPLE   |    5.20 |
| A2   |  103 | APRICOT |    2.20 |
 ------ ------ --------- --------- 
2 rows in set (0.00 sec)

mysql> SELECT * FROM FRUITS WHERE F_NAME LIKE '%N';
 ------ ------ -------- --------- 
| F_ID | S_ID | F_NAME | F_PRICE |
 ------ ------ -------- --------- 
| BS2  |  105 | MELON  |    8.20 |
| L2   |  104 | LEMON  |    6.40 |
 ------ ------ -------- --------- 
2 rows in set (0.00 sec)

mysql> SELECT * FROM FRUITS WHERE F_NAME LIKE 'APPL_';
 ------ ------ -------- --------- 
| F_ID | S_ID | F_NAME | F_PRICE |
 ------ ------ -------- --------- 
| A    |  101 | APPLE  |    5.20 |
 ------ ------ -------- --------- 
1 row in set (0.01 sec)

2.在mysql的表里面,所谓的空值并不是指字符串“ ”或者0,一般表示数据未知或者在以后添加数据,也会是在添加数据后,其字段上默认为NULL,也就是说你在插入数据时该字段不插入任何值就为NULL。

SELECT * FROM 表名 WHERE 字段名 IS NULL; //查询该字段为NULL的数据 SELECT * FROM 表名 WHERE 字段名 IS NOT NULL;//查询该字段不为NULL的数据

代码语言:javascript复制
mysql> SELECT * FROM FRUITS WHERE S_ID=101;
 ------ ------ ------------ --------- 
| F_ID | S_ID | F_NAME     | F_PRICE |
 ------ ------ ------------ --------- 
| A    |  101 | APPLE      |    5.20 |
| B1   |  101 | BLACKBERRY |   10.20 |
| C0   |  101 | CHERRY     |    3.20 |
 ------ ------ ------------ --------- 
3 rows in set (0.00 sec)

mysql> SELECT * FROM FRUITS WHERE S_ID=101 AND F_PRICE>5;
 ------ ------ ------------ --------- 
| F_ID | S_ID | F_NAME     | F_PRICE |
 ------ ------ ------------ --------- 
| A    |  101 | APPLE      |    5.20 |
| B1   |  101 | BLACKBERRY |   10.20 |
 ------ ------ ------------ --------- 
2 rows in set (0.00 sec)

mysql> SELECT * FROM FRUITS WHERE S_ID=101 OR F_PRICE>5;
 ------ ------ ------------ --------- 
| F_ID | S_ID | F_NAME     | F_PRICE |
 ------ ------ ------------ --------- 
| A    |  101 | APPLE      |    5.20 |
| B1   |  101 | BLACKBERRY |   10.20 |
| B2   |  104 | BERRY      |    7.60 |
| BS1  |  102 | ORANGE     |   11.20 |
| BS2  |  105 | MELON      |    8.20 |
| C0   |  101 | CHERRY     |    3.20 |
| L2   |  104 | LEMON      |    6.40 |
| M1   |  106 | MANGO      |   15.60 |
| M3   |  105 | XXTT       |   11.60 |
| O2   |  103 | COCONUT    |    9.20 |
| T1   |  102 | BANANA     |   10.30 |
| T2   |  102 | GRAPE      |    5.30 |
 ------ ------ ------------ --------- 
12 rows in set (0.00 sec)

mysql> SELECT * FROM FRUITS WHERE S_ID=102 OR F_NAME='MELON';
 ------ ------ -------- --------- 
| F_ID | S_ID | F_NAME | F_PRICE |
 ------ ------ -------- --------- 
| BS1  |  102 | ORANGE |   11.20 |
| BS2  |  105 | MELON  |    8.20 |
| T1   |  102 | BANANA |   10.30 |
| T2   |  102 | GRAPE  |    5.30 |
 ------ ------ -------- --------- 
4 rows in set (0.00 sec)

3.关键字DISTINCT(过滤掉重复的结果)

代码语言:javascript复制
mysql> SELECT S_ID FROM FRUITS;
 ------ 
| S_ID |
 ------ 
|  101 |
|  103 |
|  101 |
|  104 |
|  107 |
|  102 |
|  105 |
|  101 |
|  104 |
|  106 |
|  105 |
|  105 |
|  103 |
|  102 |
|  102 |
 ------ 
15 rows in set (0.00 sec)

mysql> SELECT DISTINCT S_ID FROM FRUITS;
 ------ 
| S_ID |
 ------ 
|  101 |
|  103 |
|  104 |
|  107 |
|  102 |
|  105 |
|  106 |
 ------ 
7 rows in set (0.00 sec)

4.关键字order by(给查询的结果进行排序) ORDER BY 字段 ASC(升序)/DESC(降序) order by 可以同时对多个字段进行排序,但是后面的字段要在第一个字段排好的顺序的基础上,再进行排序;

代码语言:javascript复制
mysql> SELECT DISTINCT S_ID FROM FRUITS ORDER BY S_ID ASC;
 ------ 
| S_ID |
 ------ 
|  101 |
|  102 |
|  103 |
|  104 |
|  105 |
|  106 |
|  107 |
 ------ 
7 rows in set (0.00 sec)

mysql> SELECT DISTINCT S_ID FROM FRUITS ORDER BY S_ID DESC;
 ------ 
| S_ID |
 ------ 
|  107 |
|  106 |
|  105 |
|  104 |
|  103 |
|  102 |
|  101 |
 ------ 
7 rows in set (0.00 sec)

mysql> SELECT S_ID,F_NAME,F_PRICE FROM FRUITS ORDER BY S_ID ASC,F_PRICE DESC;
 ------ ------------ --------- 
| S_ID | F_NAME     | F_PRICE |
 ------ ------------ --------- 
|  101 | BLACKBERRY |   10.20 |
|  101 | APPLE      |    5.20 |
|  101 | CHERRY     |    3.20 |
|  102 | ORANGE     |   11.20 |
|  102 | BANANA     |   10.30 |
|  102 | GRAPE      |    5.30 |
|  103 | COCONUT    |    9.20 |
|  103 | APRICOT    |    2.20 |
|  104 | BERRY      |    7.60 |
|  104 | LEMON      |    6.40 |
|  105 | XXTT       |   11.60 |
|  105 | MELON      |    8.20 |
|  105 | XBABAY     |    2.60 |
|  106 | MANGO      |   15.60 |
|  107 | XXWWW      |    3.60 |
 ------ ------------ --------- 
15 rows in set (0.00 sec)

5.分组查询(GROUP BY) GROUP_CONCAT(字段) //把分组里面的该字段显示完整;

代码语言:javascript复制
mysql> SELECT S_ID,F_NAME FROM FRUITS GROUP BY S_ID ORDER BY S_ID;
 ------ --------- 
| S_ID | F_NAME  |
 ------ --------- 
|  101 | APPLE   |
|  102 | ORANGE  |
|  103 | APRICOT |
|  104 | BERRY   |
|  105 | MELON   |
|  106 | MANGO   |
|  107 | XXWWW   |
 ------ --------- 
7 rows in set (0.00 sec)

mysql> SELECT S_ID,GROUP_CONCAT(F_NAME) FROM FRUITS GROUP BY S_ID ORDER BY S_ID;
 ------ ------------------------- 
| S_ID | GROUP_CONCAT(F_NAME)    |
 ------ ------------------------- 
|  101 | APPLE,CHERRY,BLACKBERRY |
|  102 | GRAPE,BANANA,ORANGE     |
|  103 | COCONUT,APRICOT         |
|  104 | BERRY,LEMON             |
|  105 | XBABAY,XXTT,MELON       |
|  106 | MANGO                   |
|  107 | XXWWW                   |
 ------ ------------------------- 
7 rows in set (0.00 sec)

6.常用到的集合函数 COUNT() //计算行数 SUM() //求和 AVG() //求平均数 MAX() //求最大值 MIN() //求最小值

代码语言:javascript复制
mysql> SELECT S_ID,COUNT(F_NAME),GROUP_CONCAT(F_NAME) FROM FRUITS GROUP BY S_ID ORDER BY S_ID;
 ------ --------------- ------------------------- 
| S_ID | COUNT(F_NAME) | GROUP_CONCAT(F_NAME)    |
 ------ --------------- ------------------------- 
|  101 |             3 | APPLE,CHERRY,BLACKBERRY |
|  102 |             3 | GRAPE,BANANA,ORANGE     |
|  103 |             2 | COCONUT,APRICOT         |
|  104 |             2 | BERRY,LEMON             |
|  105 |             3 | XBABAY,XXTT,MELON       |
|  106 |             1 | MANGO                   |
|  107 |             1 | XXWWW                   |
 ------ --------------- ------------------------- 
7 rows in set (0.00 sec)

mysql> SELECT SUM(F_PRICE) FROM FRUITS;
 -------------- 
| SUM(F_PRICE) |
 -------------- 
|       112.40 |
 -------------- 
1 row in set (0.00 sec)

mysql> SELECT MAX(F_PRICE) FROM FRUITS;
 -------------- 
| MAX(F_PRICE) |
 -------------- 
|        15.60 |
 -------------- 
1 row in set (0.00 sec)

mysql> SELECT MIN(F_PRICE) FROM FRUITS;
 -------------- 
| MIN(F_PRICE) |
 -------------- 
|         2.20 |
 -------------- 
1 row in set (0.00 sec)


mysql> SELECT S_ID,COUNT(F_NAME),GROUP_CONCAT(F_NAME),AVG(F_PRICE) FROM FRUITS GROUP BY S_ID ORDER BY S_ID;
 ------ --------------- ------------------------- -------------- 
| S_ID | COUNT(F_NAME) | GROUP_CONCAT(F_NAME)    | AVG(F_PRICE) |
 ------ --------------- ------------------------- -------------- 
|  101 |             3 | APPLE,CHERRY,BLACKBERRY |     6.200000 |
|  102 |             3 | GRAPE,BANANA,ORANGE     |     8.933333 |
|  103 |             2 | COCONUT,APRICOT         |     5.700000 |
|  104 |             2 | BERRY,LEMON             |     7.000000 |
|  105 |             3 | XBABAY,XXTT,MELON       |     7.466667 |
|  106 |             1 | MANGO                   |    15.600000 |
|  107 |             1 | XXWWW                   |     3.600000 |
 ------ --------------- ------------------------- -------------- 
7 rows in set (0.00 sec)

7.limit[位置偏移量],行数 通过limit可以选择显示数据表中的任意行数的数据; 位置偏移量 指定输出数据是从哪一行开始的(默认偏移量是0); 行数:指定要输出内容的行数;

select 语句执行的排序; where–>group–>having–>order by–>limit

代码语言:javascript复制
mysql> select * from FRUITS limit 3,5;
 ------ ------ -------- --------- 
| F_ID | S_ID | F_NAME | F_PRICE |
 ------ ------ -------- --------- 
| B2   |  104 | BERRY  |    7.60 |
| B5   |  107 | XXWWW  |    3.60 |
| BS1  |  102 | ORANGE |   11.20 |
| BS2  |  105 | MELON  |    8.20 |
| C0   |  101 | CHERRY |    3.20 |
 ------ ------ -------- --------- 
5 rows in set (0.00 sec)

1.查看水果表中的F_ID 和 F_NAME 和 F_PRICE信息; 2.查询价格低于10元的水果F_ID,F_NAME和S_ID,并对S_ID进行降序排序; 3.以S_ID分组,查询S_ID,F_NAME和每组里面最贵的水果价格是多少; 4.查询价格不低于10元,并且F_NAME是以x开头的内容

代码语言:javascript复制
mysql> SELECT F_ID,F_NAME FROM FRUITS;
 ------ ------------ 
| F_ID | F_NAME     |
 ------ ------------ 
| A    | APPLE      |
| A2   | APRICOT    |
| B1   | BLACKBERRY |
| B2   | BERRY      |
| B5   | XXWWW      |
| BS1  | ORANGE     |
| BS2  | MELON      |
| C0   | CHERRY     |
| L2   | LEMON      |
| M1   | MANGO      |
| M2   | XBABAY     |
| M3   | XXTT       |
| O2   | COCONUT    |
| T1   | BANANA     |
| T2   | GRAPE      |
 ------ ------------ 
15 rows in set (0.00 sec)

mysql> SELECT F_ID,F_NAME,S_ID FROM FRUITS WHERE F_PRICE<10 order by S_ID DESC;
 ------ --------- ------ 
| F_ID | F_NAME  | S_ID |
 ------ --------- ------ 
| B5   | XXWWW   |  107 |
| BS2  | MELON   |  105 |
| M2   | XBABAY  |  105 |
| B2   | BERRY   |  104 |
| L2   | LEMON   |  104 |
| A2   | APRICOT |  103 |
| O2   | COCONUT |  103 |
| T2   | GRAPE   |  102 |
| C0   | CHERRY  |  101 |
| A    | APPLE   |  101 |
 ------ --------- ------ 
10 rows in set (0.00 sec)

mysql> SELECT S_ID,GROUP_CONCAT(F_NAME),MAX(F_PRICE) FROM FRUITS GROUP BY S_ID;
 ------ ------------------------- -------------- 
| S_ID | GROUP_CONCAT(F_NAME)    | MAX(F_PRICE) |
 ------ ------------------------- -------------- 
|  101 | APPLE,CHERRY,BLACKBERRY |        10.20 |
|  102 | GRAPE,BANANA,ORANGE     |        11.20 |
|  103 | COCONUT,APRICOT         |         9.20 |
|  104 | BERRY,LEMON             |         7.60 |
|  105 | XBABAY,XXTT,MELON       |        11.60 |
|  106 | MANGO                   |        15.60 |
|  107 | XXWWW                   |         3.60 |
 ------ ------------------------- -------------- 
7 rows in set (0.00 sec)

mysql> SELECT * FROM FRUITS WHERE F_PRICE>10 AND F_NAME LIKE 'X%';
 ------ ------ -------- --------- 
| F_ID | S_ID | F_NAME | F_PRICE |
 ------ ------ -------- --------- 
| M3   |  105 | XXTT   |   11.60 |
 ------ ------ -------- --------- 
1 row in set (0.01 sec)

mysql> SELECT * FROM FRUITS WHERE F_PRICE>10 AND F_NAME REGEXP '^B';
 ------ ------ ------------ --------- 
| F_ID | S_ID | F_NAME     | F_PRICE |
 ------ ------ ------------ --------- 
| B1   |  101 | BLACKBERRY |   10.20 |
| T1   |  102 | BANANA     |   10.30 |
 ------ ------ ------------ --------- 
2 rows in set (0.00 sec)

创建suppliers表、插入数据

代码语言:javascript复制
mysql> CREATE TABLE suppliers(
    -> s_id INT NOT NULL PRIMARY KEY,
    -> s_name VARCHAR(50) NOT NULL,
    -> s_city VARCHAR(50) NOT NULL,
    ->  s_call CHAR(5)
    ->  );
Query OK, 0 rows affected (0.03 sec)

mysql> DESC suppliers;
 -------- ------------- ------ ----- --------- ------- 
| Field  | Type        | Null | Key | Default | Extra |
 -------- ------------- ------ ----- --------- ------- 
| s_id   | int(11)     | NO   | PRI | NULL    |       |
| s_name | varchar(50) | NO   |     | NULL    |       |
| s_city | varchar(50) | NO   |     | NULL    |       |
| s_call | char(5)     | YES  |     | NULL    |       |
 -------- ------------- ------ ----- --------- ------- 
4 rows in set (0.01 sec)

mysql> insert into suppliers values(101,'suppliers a','tianjin','18075'),(102,'suppliers b','chongqing','44333'),(103,'suppliers c','shanghai','11223'),(104,'suppliers d','guangzhou','33554'),(105,'suppliers e','yunnan','55235'),(106,'suppliers f','beijing','95235'),(107,'suppliers g','yiwu','12378');

mysql> select * from suppliers;
 ------ ------------- ----------- -------- 
| s_id | s_name      | s_city    | s_call |
 ------ ------------- ----------- -------- 
|  101 | suppliers a | tianjin   | 18075  |
|  102 | suppliers b | chongqing | 44333  |
|  103 | suppliers c | shanghai  | 11223  |
|  104 | suppliers d | guangzhou | 33554  |
|  105 | suppliers e | yunnan    | 55235  |
|  106 | suppliers f | beijing   | 95235  |
|  107 | suppliers g | yiwu      | 12378  |
 ------ ------------- ----------- -------- 
7 rows in set (0.00 sec)

添加外键:
mysql> alter table FRUITS add foreign key(S_ID) references suppliers(s_id);
Query OK, 15 rows affected (0.02 sec)
Records: 15  Duplicates: 0  Warnings: 0

二.多表查询: 查询问题1:查询水果的批发商编号,批发商名字,水果名字,水果价格

代码语言:javascript复制
mysql> select suppliers.s_id,s_name,F_NAME,F_PRICE FROM FRUITS,suppliers where FRUITS.S_ID=suppliers.s_id;
 ------ ------------- ------------ --------- 
| s_id | s_name      | F_NAME     | F_PRICE |
 ------ ------------- ------------ --------- 
|  101 | suppliers a | APPLE      |    5.20 |
|  103 | suppliers c | APRICOT    |    2.20 |
|  101 | suppliers a | BLACKBERRY |   10.20 |
|  104 | suppliers d | BERRY      |    7.60 |
|  107 | suppliers g | XXWWW      |    3.60 |
|  102 | suppliers b | ORANGE     |   11.20 |
|  105 | suppliers e | MELON      |    8.20 |
|  101 | suppliers a | CHERRY     |    3.20 |
|  104 | suppliers d | LEMON      |    6.40 |
|  106 | suppliers f | MANGO      |   15.60 |
|  105 | suppliers e | XBABAY     |    2.60 |
|  105 | suppliers e | XXTT       |   11.60 |
|  103 | suppliers c | COCONUT    |    9.20 |
|  102 | suppliers b | BANANA     |   10.30 |
|  102 | suppliers b | GRAPE      |    5.30 |
 ------ ------------- ------------ --------- 
15 rows in set (0.00 sec)

小知识: (1)为表可以取别名 格式:AS 别名; 在前面我们为表取上别名,后面的部分都可以用别名 (2)为字段取别名 格式:AS 别名; 为了显示的时候更清楚;

代码语言:javascript复制
mysql> select s.s_id as su_sid,s_name,F_NAME,F_PRICE FROM FRUITS as f,suppliers as s where f.S_ID=s.s_id;
 -------- ------------- ------------ --------- 
| su_sid | s_name      | F_NAME     | F_PRICE |
 -------- ------------- ------------ --------- 
|    101 | suppliers a | APPLE      |    5.20 |
|    103 | suppliers c | APRICOT    |    2.20 |
|    101 | suppliers a | BLACKBERRY |   10.20 |
|    104 | suppliers d | BERRY      |    7.60 |
|    107 | suppliers g | XXWWW      |    3.60 |
|    102 | suppliers b | ORANGE     |   11.20 |
|    105 | suppliers e | MELON      |    8.20 |
|    101 | suppliers a | CHERRY     |    3.20 |
|    104 | suppliers d | LEMON      |    6.40 |
|    106 | suppliers f | MANGO      |   15.60 |
|    105 | suppliers e | XBABAY     |    2.60 |
|    105 | suppliers e | XXTT       |   11.60 |
|    103 | suppliers c | COCONUT    |    9.20 |
|    102 | suppliers b | BANANA     |   10.30 |
|    102 | suppliers b | GRAPE      |    5.30 |
 -------- ------------- ------------ --------- 
15 rows in set (0.00 sec)

内连接查询: 内连接和我们上面的那个例子中用“,”将两个表连接起来的效果一样,只是语法格式不同。 格式;表名1 INNER JOIN 表名1 ON 连接条件;

代码语言:javascript复制
mysql> select suppliers.s_id,s_name,F_NAME,F_PRICE FROM FRUITS inner join suppliers on FRUITS.S_ID=suppliers.s_id;
 ------ ------------- ------------ --------- 
| s_id | s_name      | F_NAME     | F_PRICE |
 ------ ------------- ------------ --------- 
|  101 | suppliers a | APPLE      |    5.20 |
|  103 | suppliers c | APRICOT    |    2.20 |
|  101 | suppliers a | BLACKBERRY |   10.20 |
|  104 | suppliers d | BERRY      |    7.60 |
|  107 | suppliers g | XXWWW      |    3.60 |
|  102 | suppliers b | ORANGE     |   11.20 |
|  105 | suppliers e | MELON      |    8.20 |
|  101 | suppliers a | CHERRY     |    3.20 |
|  104 | suppliers d | LEMON      |    6.40 |
|  106 | suppliers f | MANGO      |   15.60 |
|  105 | suppliers e | XBABAY     |    2.60 |
|  105 | suppliers e | XXTT       |   11.60 |
|  103 | suppliers c | COCONUT    |    9.20 |
|  102 | suppliers b | BANANA     |   10.30 |
|  102 | suppliers b | GRAPE      |    5.30 |
 ------ ------------- ------------ --------- 
15 rows in set (0.00 sec)

特殊的内连接:自连接 涉及到的两张表都是同一张表。 问题:查询供应商f_id='a1’的水果供应商提供的其他水果

代码语言:javascript复制
mysql> select f2.F_ID,f2.F_NAME from FRUITS as f1 inner join FRUITS as f2 on f1.s_id=f2.s_id and f1.F_ID='a';
 ------ ------------ 
| F_ID | F_NAME     |
 ------ ------------ 
| A    | APPLE      |
| B1   | BLACKBERRY |
| C0   | CHERRY     |
 ------ ------------ 
3 rows in set (0.00 sec)

外连接: 外连接分为左连接和右连接,不同的连接方式输出的内容不同; 左连接:格式;表名 LEFT JOIN 表名2 ON 条件; 除了显示相关联的行,还会将左表中所有的记录行都显示出来;

问题一: 我的水果都是来自于哪个供应商,我准备重新选择各种水果的供应商 所有供应商信息和水果的供应商信息

代码语言:javascript复制
mysql> select s.s_id,s.s_name,f.F_ID,f.F_NAME FROM suppliers as s left join FRUITS as f on s.s_id=f.S_ID order by s.s_id;
 ------ ------------- ------ ------------ 
| s_id | s_name      | F_ID | F_NAME     |
 ------ ------------- ------ ------------ 
|  101 | suppliers a | A    | APPLE      |
|  101 | suppliers a | B1   | BLACKBERRY |
|  101 | suppliers a | C0   | CHERRY     |
|  102 | suppliers b | BS1  | ORANGE     |
|  102 | suppliers b | T1   | BANANA     |
|  102 | suppliers b | T2   | GRAPE      |
|  103 | suppliers c | A2   | APRICOT    |
|  103 | suppliers c | O2   | COCONUT    |
|  104 | suppliers d | B2   | BERRY      |
|  104 | suppliers d | L2   | LEMON      |
|  105 | suppliers e | BS2  | MELON      |
|  105 | suppliers e | M2   | XBABAY     |
|  105 | suppliers e | M3   | XXTT       |
|  106 | suppliers f | M1   | MANGO      |
|  107 | suppliers g | B5   | XXWWW      |
|  108 | suppliers t | NULL | NULL       |
|  109 | suppliers y | NULL | NULL       |
 ------ ------------- ------ ------------ 
17 rows in set (0.01 sec)

右连接:格式:表1 RIGHT JOIN 表2 ON 条件

代码语言:javascript复制
mysql> select s.s_id,s.s_name,f.F_ID,f.F_NAME FROM FRUITS as f left join suppliers as s on s.s_id=f.S_ID order by s.s_id;
 ------ ------------- ------ ------------ 
| s_id | s_name      | F_ID | F_NAME     |
 ------ ------------- ------ ------------ 
|  101 | suppliers a | A    | APPLE      |
|  101 | suppliers a | C0   | CHERRY     |
|  101 | suppliers a | B1   | BLACKBERRY |
|  102 | suppliers b | BS1  | ORANGE     |
|  102 | suppliers b | T1   | BANANA     |
|  102 | suppliers b | T2   | GRAPE      |
|  103 | suppliers c | A2   | APRICOT    |
|  103 | suppliers c | O2   | COCONUT    |
|  104 | suppliers d | L2   | LEMON      |
|  104 | suppliers d | B2   | BERRY      |
|  105 | suppliers e | M3   | XXTT       |
|  105 | suppliers e | BS2  | MELON      |
|  105 | suppliers e | M2   | XBABAY     |
|  106 | suppliers f | M1   | MANGO      |
|  107 | suppliers g | B5   | XXWWW      |
 ------ ------------- ------ ------------ 
15 rows in set (0.00 sec)

问题2:在fruits表和suppliers表中使用内连接查询suppliers表中s_id为107的供应商信息;

代码语言:javascript复制
mysql> select s.s_id,s.s_name,f.F_NAME,s.s_city,s.s_call from FRUITS as f inner join suppl
 ------ ------------- -------- -------- -------- 
| s_id | s_name      | F_NAME | s_city | s_call |
 ------ ------------- -------- -------- -------- 
|  107 | suppliers g | XXWWW  | yiwu   | 12378  |
 ------ ------------- -------- -------- -------- 

问题3:查询水果价格不高于8块的水果的供应商信息

代码语言:javascript复制
mysql> select s.s_id,s.s_name,f.F_ID,f.F_NAME,s.s_call,s.s_city FROM FRUITS as f inner join suppliers as s on s.s_id=f.S_ID where f.F_PRICE<8 order by s.s_id;
 ------ ------------- ------ --------- -------- ----------- 
| s_id | s_name      | F_ID | F_NAME  | s_call | s_city    |
 ------ ------------- ------ --------- -------- ----------- 
|  101 | suppliers a | A    | APPLE   | 18075  | tianjin   |
|  101 | suppliers a | C0   | CHERRY  | 18075  | tianjin   |
|  102 | suppliers b | T2   | GRAPE   | 44333  | chongqing |
|  103 | suppliers c | A2   | APRICOT | 11223  | shanghai  |
|  104 | suppliers d | B2   | BERRY   | 33554  | guangzhou |
|  104 | suppliers d | L2   | LEMON   | 33554  | guangzhou |
|  105 | suppliers e | M2   | XBABAY  | 55235  | yunnan    |
|  107 | suppliers g | B5   | XXWWW   | 12378  | yiwu      |
 ------ ------------- ------ --------- -------- ----------- 
8 rows in set (0.00 sec)

问题4:查询所有供应商各自都给我们供应了哪些水果(为了看起来方便,可以给供应商分组)

代码语言:javascript复制
mysql> select s.s_id,s.s_name,group_concat(f.F_NAME),s.s_call,s.s_city FROM FRUITS as f inner join suppliers as s on s.s_id=f.S_ID group BY s.s_id;
 ------ ------------- ------------------------- -------- ----------- 
| s_id | s_name      | group_concat(f.F_NAME)  | s_call | s_city    |
 ------ ------------- ------------------------- -------- ----------- 
|  101 | suppliers a | CHERRY,APPLE,BLACKBERRY | 18075  | tianjin   |
|  102 | suppliers b | GRAPE,ORANGE,BANANA     | 44333  | chongqing |
|  103 | suppliers c | APRICOT,COCONUT         | 11223  | shanghai  |
|  104 | suppliers d | BERRY,LEMON             | 33554  | guangzhou |
|  105 | suppliers e | XBABAY,XXTT,MELON       | 55235  | yunnan    |
|  106 | suppliers f | MANGO                   | 95235  | beijing   |
|  107 | suppliers g | XXWWW                   | 12378  | yiwu      |
 ------ ------------- ------------------------- -------- ----------- 
7 rows in set (0.00 sec)

子查询:将查询一张表得到的结果来充当另一个查询条件,这样嵌套的查询就称为子查询; 演示问题:查询水果价格为15.6水果的供应商信息

代码语言:javascript复制
mysql> select * from suppliers where s_id=(select s_id from FRUITS where  F_PRICE=15.6);
 ------ ------------- --------- -------- 
| s_id | s_name      | s_city  | s_call |
 ------ ------------- --------- -------- 
|  106 | suppliers f | beijing | 95235  |
 ------ ------------- --------- -------- 
1 row in set (0.00 sec)

mysql> select S_ID from FRUITS where F_PRICE=15.6;
 ------ 
| S_ID |
 ------ 
|  106 |
 ------ 
1 row in set (0.00 sec)

带有ANY/SOME、ALL这些关键字的子查询;

代码语言:javascript复制
mysql> CREATE TABLE tb1 (num int not null);
Query OK, 0 rows affected (0.02 sec)

mysql> drop table tb1;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE tb1 (num1 int not null);
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE tb2 (num2 int not null);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into tb1 values(1),(5),(13),(21);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> insert into tb2 values(6),(8),(16),(24);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

问题1:查询tb1中大于任意一个tb2中的值的数据。

代码语言:javascript复制
mysql> select * from tb1 where num1>any(select * from tb2);
 ------ 
| num1 |
 ------ 
|   13 |
|   21 |
 ------ 
2 rows in set (0.00 sec)

问题2:查询tb2中大于tb1中的值的数据

代码语言:javascript复制
mysql> select * from tb2 where num2>all(select * from tb1);
 ------ 
| num2 |
 ------ 
|   24 |
 ------ 
1 row in set (0.00 sec)

带有EXISTS关键词的子查询; EXISTS 关键字后面的参数是任意一个子查询,如果子查询有返回记录行,则为true,外层查询语句将会进行查询,如果子查询没有返回任何记录行,则为FALSE,外层的查询语句将不会进行查询

代码语言:javascript复制
mysql> select * from tb1 where exists(select * from tb2 where num2=3);
Empty set (0.00 sec)

mysql> select * from tb1 where exists(select * from tb2 where num2=6);
 ------ 
| num1 |
 ------ 
|    1 |
|    5 |
|   13 |
|   21 |
 ------ 
4 rows in set (0.00 sec)

带IN关键字的子查询: 当我们外部查询的条件要从子查询中取值的时候,子查询返回的结果多于1个,这时候我们可以IN;

代码语言:javascript复制
mysql> select * from FRUITS where s_id in(select s_id from suppliers where s_city='tianjin');
 ------ ------ ------------ --------- 
| F_ID | S_ID | F_NAME     | F_PRICE |
 ------ ------ ------------ --------- 
| A    |  101 | APPLE      |    5.20 |
| B1   |  101 | BLACKBERRY |   10.20 |
| C0   |  101 | CHERRY     |    3.20 |
 ------ ------ ------------ --------- 
3 rows in set (0.00 sec)

合并结果查询: 利用UNION关键词,可以将查询出的结果合并到一张表中,,也就是通过UNION将SELECT语句连接起来。 注意:这种方式只是增加了表中的记录行数,并不是增加字段,也就是说我们要合并的结果是相同字段的不同记录 语法: SELECT 字段名… FROM 表名 UNION [ALL] SELECT 字段名… FROM 表名; UNION 后面不加ALL,它会过滤掉重复的记录(重复的记录只显示1条),加上ALL不会删除重复的记录

问题1:查询所有价格小于9的水果的信息,查询s_id=101和103的所有水果信息,使用UNION连接查询结果;

代码语言:javascript复制
mysql> select * from FRUITS where f_price<9 union all select * from FRUITS where s_id in(101,103);
 ------ ------ ------------ --------- 
| F_ID | S_ID | F_NAME     | F_PRICE |
 ------ ------ ------------ --------- 
| A    |  101 | APPLE      |    5.20 |
| A2   |  103 | APRICOT    |    2.20 |
| B2   |  104 | BERRY      |    7.60 |
| B5   |  107 | XXWWW      |    3.60 |
| BS2  |  105 | MELON      |    8.20 |
| C0   |  101 | CHERRY     |    3.20 |
| L2   |  104 | LEMON      |    6.40 |
| M2   |  105 | XBABAY     |    2.60 |
| T2   |  102 | GRAPE      |    5.30 |
| A    |  101 | APPLE      |    5.20 |
| A2   |  103 | APRICOT    |    2.20 |
| B1   |  101 | BLACKBERRY |   10.20 |
| C0   |  101 | CHERRY     |    3.20 |
| O2   |  103 | COCONUT    |    9.20 |
 ------ ------ ------------ --------- 
14 rows in set (0.00 sec)


mysql> select * from FRUITS where f_price<9 union select * from FRUITS where s_id in(101,103);
 ------ ------ ------------ --------- 
| F_ID | S_ID | F_NAME     | F_PRICE |
 ------ ------ ------------ --------- 
| A    |  101 | APPLE      |    5.20 |
| A2   |  103 | APRICOT    |    2.20 |
| B2   |  104 | BERRY      |    7.60 |
| B5   |  107 | XXWWW      |    3.60 |
| BS2  |  105 | MELON      |    8.20 |
| C0   |  101 | CHERRY     |    3.20 |
| L2   |  104 | LEMON      |    6.40 |
| M2   |  105 | XBABAY     |    2.60 |
| T2   |  102 | GRAPE      |    5.30 |
| B1   |  101 | BLACKBERRY |   10.20 |
| O2   |  103 | COCONUT    |    9.20 |
 ------ ------ ------------ --------- 
11 rows in set (0.01 sec)

where子句里面的条件它是不区分大小写的,如果要区分在where后面加

代码语言:javascript复制
mysql> select * from FRUITS where f_name='grape';
 ------ ------ -------- --------- 
| F_ID | S_ID | F_NAME | F_PRICE |
 ------ ------ -------- --------- 
| T2   |  102 | GRAPE  |    5.30 |
 ------ ------ -------- --------- 
1 row in set (0.00 sec)

mysql> select * from FRUITS where f_name='GRAPE';
 ------ ------ -------- --------- 
| F_ID | S_ID | F_NAME | F_PRICE |
 ------ ------ -------- --------- 
| T2   |  102 | GRAPE  |    5.30 |
 ------ ------ -------- --------- 
1 row in set (0.00 sec)

0 人点赞