MySq常用l查询语句

首先定义数据表,输入语句如下:
CREATE TABLE fruits
(
f_id    char(10)         NOT NULL,
s_id    INT            NOT NULL,
f_name  char(255)      NOT NULL,
f_price decimal(8,2)      NOT NULL,
PRIMARY KEY(f_id) 
);
为了演示如何使用SELECT语句,需要插入如下数据:
 INSERT INTO fruits (f_id, s_id, f_name, f_price)
     VALUES('a1', 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),
     ('t4',107,'xbababa', 3.6),
     ('m3',105,'xxtt', 11.6),
     ('b5',107,'xxxx', 3.6);
使用SELECT语句查询f_id字段的数据。
 SELECT f_id, f_name FROM fruits;
【例7.1】从fruits表中检索所有字段的数据,SQL语句如下:
 SELECT * FROM fruits;

【例7.2】查询fruits表中f_name列所有水果名称,SQL语句如下:
SELECT f_name FROM fruits;
该语句使用SELECT声明从fruits表中获取名称为f_name字段下的所有水果名称,指定字段的名称紧跟在SELECT关键字之后,查询结果如下:
 SELECT f_name FROM fruits;

【例7.3】例如,从fruits表中获取f_name和f_price两列,SQL语句如下:
SELECT f_name, f_price FROM fruits;
该语句使用SELECT声明从fruits表中获取名称为f_name和f_price两个字段下的所有水果名称和价格,两个字段之间用逗号分隔开,查询结果如下:
 SELECT f_name, f_price FROM fruits;

【例7.4】查询价格为10.2元的水果的名称,SQL语句如下:
SELECT f_name, f_price
FROM fruits
WHERE f_price = 10.2;

【例7.5】查找名称为“apple”的水果的价格,SQL语句如下:
SELECT f_name, f_price
FROM fruits
WHERE f_name = 'apple';
【例7.6】查询价格小于10的水果的名称,SQL语句如下:
SELECT f_name, f_price
FROM fruits
WHERE f_price < 10;

【例7.7】s_id为101和102的记录,SQL语句如下:
SELECT s_id,f_name, f_price 
FROM fruits 
WHERE s_id IN (101,102) 
ORDER BY f_name;

【例7.8】查询所有s_id不等于101也不等于102的记录,SQL语句如下:
SELECT s_id,f_name, f_price
FROM fruits
WHERE s_id NOT IN (101,102)
ORDER BY f_name;

【例7.9】查询价格在2.00元到10.20元之间的水果名称和价格,SQL语句如下:
SELECT f_name, f_price FROM fruits WHERE f_price BETWEEN 2.00 AND 10.20;
查询结果如下:
 SELECT f_name, f_price
     FROM fruits
     WHERE f_price BETWEEN 2.00 AND 10.20;
【例7.10】查询价格在2.00元到10.20元之外的水果名称和价格,SQL语句如下:
SELECT f_name, f_price
FROM fruits 
WHERE f_price NOT BETWEEN 2.00 AND 10.20;

【例7.11】查找所有以’b’字母开头的水果,SQL语句如下:
SELECT f_id, f_name
FROM fruits
WHERE f_name LIKE 'b%';
【例7.12】在fruits表中,查询f_name中包含字母’g’的记录,SQL语句如下:
SELECT f_id, f_name
FROM fruits
WHERE f_name LIKE '%g%';
【例7.13】查询以’b’开头,并以’y’结尾的水果的名称,SQL语句如下:
SELECT f_name
FROM fruits
WHERE f_name LIKE 'b%y';

【例7.14】在fruits表中,查询以字母’y’结尾,且’y’前面只有4个字母的记录,SQL语句如下:
SELECT f_id, f_name FROM fruits WHERE f_name LIKE '----y';

下面,在数据库中创建数据表customers,该表中包含了本章中需要用到的数据。
CREATE TABLE customers
(
  c_id      int       NOT NULL AUTO_INCREMENT,
  c_name    char(50)  NOT NULL,
  c_address char(50)  NULL,
  c_city    char(50)  NULL,
  c_zip     char(10)  NULL,
  c_contact char(50)  NULL,
  c_email   char(255) NULL,
  PRIMARY KEY (c_id)
);
为了演示需要插入数据,请读者插入执行以下语句。
INSERT INTO customers(c_id, c_name, c_address, c_city, 
c_zip,  c_contact, c_email) 
VALUES(10001, 'RedHook', '200 Street ', 'Tianjin', 
 '300000',  'LiMing', 'LMing@163.com'),
(10002, 'Stars', '333 Fromage Lane',
 'Dalian', '116000',  'Zhangbo','Jerry@hotmail.com'),
(10003, 'Netbhood', '1 Sunny Place', 'Qingdao',  '266000',
 'LuoCong', NULL),
(10004, 'JOTO', '829 Riverside Drive', 'Haikou', 
 '570000',  'YangShan', 'sam@hotmail.com');
 SELECT COUNT(*) AS cust_num  FROM customers;
【例7.15】查询customers表中c_email为空的记录的c_id、c_name和c_email字段值,SQL语句如下:
SELECT c_id, c_name,c_email FROM customers WHERE c_email IS NULL;
查询结果如下:
 SELECT c_id, c_name,c_email FROM customers WHERE c_email IS NULL;

【例7.16】查询customers表中c_email不为空的记录的c_id、c_name和c_email字段值,SQL语句如下:
SELECT c_id, c_name,c_email FROM customers WHERE c_email IS NOT NULL;
【例7.17】在fruits表中查询s_id = 101,并且f_price大于等于5的水果价格和名称,SQL语句如下:
SELECT f_id, f_price, f_name FROM fruits WHERE s_id = '101' AND f_price >=5;

【例7.18】在fruits表中查询s_id = 101或者102,且f_price大于5,并且f_name=‘apple’的水果价格和名称,SQL语句如下:
SELECT f_id, f_price, f_name FROM fruits 
WHERE s_id IN('101', '102') AND f_price >= 5 AND f_name = 'apple';

【例7.19】查询s_id=101或者s_id=102的水果供应商的f_price和f_name,SQL语句如下:
SELECT s_id,f_name, f_price FROM fruits WHERE s_id = 101 OR s_id = 102;
查询结果如下:
 SELECT s_id,f_name, f_price
     FROM fruits
     WHERE s_id = 101 OR s_id = 102;
【例7.20】查询s_id=101或者s_id=102的水果供应商的f_price和f_name,SQL语句如下:
SELECT s_id,f_name, f_price FROM fruits WHERE s_id IN(101,102);
查询结果如下:
 SELECT s_id,f_name, f_price
     FROM fruits
     WHERE s_id IN(101,102);

【例7.21】查询fruits表中s_id字段的值,返回s_id字段值且不得重复,SQL语句如下:
SELECT DISTINCT s_id FROM fruits;
【例7.22】查询fruits表的f_name字段值,并对其进行排序,SQL语句如下:
 SELECT f_name FROM fruits ORDER BY f_name;

【例7.23】查询fruits表中的f_name和f_price字段,先按f_name排序,再按f_price排序,SQL语句如下:
SELECT f_name, f_price FROM fruits ORDER BY f_name, f_price;

【例7.24】查询fruits表中的f_name和f_price字段,对结果按f_price降序方式排序,SQL语句如下:
SELECT f_name, f_price FROM fruits ORDER BY f_price DESC;
【例7.25】查询fruits表,先按f_price降序排序,再按f_name字段升序排序,SQL语句如下:
SELECT f_price, f_name FROM fruits ORDER BY f_price DESC, f_name;

【例7.26】根据s_id对fruits表中的数据进行分组,SQL语句如下:
SELECT s_id, COUNT(*) AS Total FROM fruits GROUP BY s_id;
【例7.27】根据s_id对fruits表中的数据进行分组,将每个供应商的水果名称显示出来,SQL语句如下:
SELECT s_id, GROUP_CONCAT(f_name) AS Names FROM fruits GROUP BY s_id;
【例7.28】根据s_id对fruits表中的数据进行分组,并显示水果种类大于1的分组信息,SQL语句如下:
SELECT s_id, GROUP_CONCAT(f_name) AS Names 
FROM fruits 
GROUP BY s_id HAVING COUNT(f_name) > 1;

【例7.29】根据s_id对fruits表中的数据进行分组,并显示记录数量,SQL语句如下:
SELECT s_id, COUNT(*) AS Total 
FROM fruits 
GROUP BY s_id WITH ROLLUP;

【例7.30】根据s_id和f_name字段对fruits表中的数据进行分组, SQL语句如下,
 SELECT * FROM fruits group by s_id,f_name;

为了演示效果,首先创建数据表,SQL语句如下:
CREATE TABLE orderitems
(
  o_num      int          NOT NULL,
  o_item     int          NOT NULL,
  f_id       char(10)     NOT NULL,
  quantity   int          NOT NULL,
  item_price decimal(8,2) NOT NULL,
  PRIMARY KEY (o_num,o_item)
) ;
然后插入演示数据。SQL语句如下:
INSERT INTO orderitems(o_num, o_item, f_id, quantity, item_price)
VALUES(30001, 1, 'a1', 10, 5.2),
(30001, 2, 'b2', 3, 7.6),
(30001, 3, 'bs1', 5, 11.2),
(30001, 4, 'bs2', 15, 9.2),
(30002, 1, 'b3', 2, 20.0),
(30003, 1, 'c0', 100, 10),
(30004, 1, 'o2', 50, 2.50),
(30005, 1, 'c0', 5, 10),
(30005, 2, 'b1', 10, 8.99),
(30005, 3, 'a2', 10, 2.2),
(30005, 4, 'm1', 5, 14.99);
【例7.31】查询订单价格大于100的订单号和总订单价格,SQL语句如下:
SELECT o_num,  SUM(quantity * item_price) AS orderTotal
FROM orderitems
GROUP BY o_num
HAVING SUM(quantity*item_price) >= 100;
可以看到,返回的结果中orderTotal列的总订单价格并没有按照一定顺序显示,接下来,使用ORDER BY关键字按总订单价格排序显示结果,SQL语句如下:
SELECT o_num,  SUM(quantity * item_price) AS orderTotal
FROM orderitems
GROUP BY o_num
HAVING SUM(quantity*item_price) >= 100
ORDER BY orderTotal;

【例7.32】显示fruits表查询结果的前4行,SQL语句如下:
SELECT * From fruits LIMIT 4;

【例7.33】在fruits表中,使用LIMIT子句,返回从第5个记录开始的,行数长度为3的记录,SQL语句如下:
SELECT * From fruits LIMIT 4, 3;

【例7.34】查询customers表中总的行数,SQL语句如下:
 SELECT COUNT(*) AS cust_num 
     FROM customers;
【例7.35】查询customers表中有电子邮箱的顾客的总数,SQL语句如下:
 SELECT COUNT(c_email) AS email_num
     FROM customers;
【例7.36】在orderitems表中,使用COUNT()函数统计不同订单号中订购的水果种类,SQL语句如下:
 SELECT o_num, COUNT(f_id)
     FROM orderitems 
     GROUP BY o_num;
【例7.37】在orderitems表中查询30005号订单一共购买的水果总量,SQL语句如下:
 SELECT SUM(quantity) AS items_total
     FROM orderitems
     WHERE o_num = 30005;
【例7.38】在orderitems表中,使用SUM()函数统计不同订单号中订购的水果总量,SQL语句如下:
 SELECT o_num, SUM(quantity) AS items_total
     FROM orderitems
     GROUP BY o_num;
【例7.39】在fruits表中,查询s_id=103的供应商的水果价格的平均值,SQL语句如下:
 SELECT AVG(f_price) AS avg_price
     FROM fruits
     WHERE s_id = 103;
【例7.40】在fruits表中,查询每一个供应商的水果价格的平均值,SQL语句如下:
 SELECT s_id,AVG(f_price) AS avg_price
      FROM fruits
      GROUP BY s_id;
【例7.41】在fruits表中查找市场上价格最高的水果,SQL语句如下:
SELECT MAX(f_price) AS max_price FROM fruits;
【例7.42】在fruits表中查找不同供应商提供的价格最高的水果,SQL语句如下:
 SELECT s_id, MAX(f_price) AS max_price
      FROM fruits
 GROUP BY s_id;
【例7.43】在fruits表中查找f_name的最大值,SQL语句如下:
 SELECT MAX(f_name) FROM fruits;
【例7.44】在fruits表中查找市场上价格最低的水果,SQL语句如下:
SELECT MIN(f_price) AS min_price FROM fruits;
【例7.45】在fruits表中查找不同供应商提供的价格最低的水果,SQL语句如下:
  SELECT s_id, MIN(f_price) AS min_price
     FROM fruits
     GROUP BY s_id;

为了演示的需要,首先创建数据表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');
【例7.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;

【例7.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;

【例7.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);
【例7.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右连接
右连接是左连接的反向连接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,左表将返回空值。
【例7.50】在customers表和orders表中,查询所有订单,包括没有客户的订单,SQL语句如下:
 SELECT customers.c_id, orders.o_num
     FROM customers RIGHT OUTER JOIN orders
     ON customers.c_id = orders.c_id;

【例7.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;

【例7.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;
7.5.1  带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。
【例7.53】返回tbl2表的所有num2列,然后将tbl1中的num1的值与之进行比较,只要大于num2的任何1个值,即为符合查询条件的结果。
 SELECT num1 FROM tbl1 WHERE num1 > ANY (SELECT num2 FROM tbl2);
【例7.54】返回tbl1表中比tbl2表num2 列所有值都大的值,SQL语句如下:
 SELECT num1 FROM tbl1 WHERE num1 > ALL (SELECT num2 FROM tbl2);

【例7.55】查询suppliers表中是否存在s_id=107的供应商,如果存在,则查询fruits表中的记录,SQL语句如下:
 SELECT * FROM fruits
     WHERE EXISTS
     (SELECT s_name FROM suppliers WHERE s_id = 107);

【例7.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);

【例7.57】查询suppliers表中是否存在s_id=107的供应商,如果不存在则查询fruits表中的记录,SQL语句如下:
 SELECT * FROM fruits
     WHERE NOT EXISTS
     (SELECT s_name FROM suppliers WHERE s_id = 107);
【例7.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);
【例7.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;

【例7.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');

【例7.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');

【例7.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 |
+------+------------+---------+

【例7.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);

【例7.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 |
+-------+---------------------+-------+
【例7.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   |
+------+------------+

【例7.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;

【例7.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)|
+------------------------------+

【例7.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条记录。
【例7.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条记录。
7.8.2  查询以特定字符或字符串结尾的记录 
字符’$’匹配以特定字符或者字符串结尾的文本。
【例7.70】在fruits表中,查询f_name字段以字母’y’结尾的记录,SQL语句如下:
 SELECT * FROM fruits WHERE f_name REGEXP 'y$';
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| c0   |  101 | cherry     |    3.20 |
| m2   |  105 | xbabay    |    2.60 |
+--------+--------+-------------+---------+
fruits表中有4条记录的f_name字段值是以字母’y’结尾,返回结果有4条记录。
【例7.71】在fruits表中,查询f_name字段以字符串“rry”结尾的记录,SQL语句如下:
 SELECT * FROM fruits WHERE f_name REGEXP 'rry$';
+------+------+------------+-----------+
| f_id | s_id | f_name    | f_price  |
+------+------+------------+-----------+
| b1  |  101 | blackberry |   10.20  |
| b2  |  104 | berry     |    7.60  |
| c0  |  101 | cherry    |    3.20  |
+------+------+-------------+------------+
fruits表中有3条记录的f_name字段值是以字符串“rry”结尾,返回结果有3条记录。
7.8.3  用符号"."来替代字符串中的任意一个字符
字符’.’匹配任意一个字符。
【例7.72】在fruits表中,查询f_name字段值包含字母’a’与’g’且两个字母之间只有一个字母的记录,SQL语句如下,
 SELECT * FROM fruits WHERE f_name REGEXP 'a.g';
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| bs1  |  102 | orange | 11.20 |
| m1  |  106 | mango | 15.60 |
+------+------+--------+---------+
查询语句中’a.g’指定匹配字符中要有字母a和g,且两个字母之间包含单个字符,并不限定匹配的字符的位置和所在查询字符串的总长度,因此orange和mango都符合匹配条件。
7.8.4  使用"*"和"+"来匹配多个字符
星号’*’匹配前面的字符任意多次,包括0次。加号’+’匹配前面的字符至少一次。
【例7.73】在fruits表中,查询f_name字段值以字母’b’开头,且’b’后面出现字母’a’的记录,SQL语句如下:
 SELECT * FROM fruits WHERE f_name REGEXP '^ba*';
+------+------+------------+------------+
| f_id | s_id | f_name    | f_price  |
+------+------+------------+------------+
| b1  |  101 | blackberry |   10.20 |
| b2  |  104 | berry     |    7.60 |
| t1  |  102 | banana    |   10.30 |
+------+------+------------+--------------+
星号’*’可以匹配任意多个字符,blackberry和berry中字母b后面并没有出现字母a,但是也满足匹配条件。
【例7.74】在fruits表中,查询f_name字段值以字母’b’开头,且’b’后面出现字母’a’至少一次的记录,SQL语句如下:
 SELECT * FROM fruits WHERE f_name REGEXP '^ba+';
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| t1  |  102 | banana |  10.30 |
+------+------+--------+---------+
‘a+’匹配字母’a’至少一次,只有banana满足匹配条件。
7.8.5  匹配指定字符串 
正则表达式可以匹配指定字符串,只要这个字符串在查询文本中即可,如要匹配多个字符串,多个字符串之间使用分隔符’|’隔开。
【例7.75】在fruits表中,查询f_name字段值包含字符串“on”的记录,SQL语句如下:
  SELECT * FROM fruits WHERE f_name REGEXP 'on';
+------+------+-----------+---------+
| f_id | s_id | f_name  | f_price |
+------+------+-----------+---------+
| bs2  |  105 | melon  |  8.20  |
| l2   |  104 | lemon  |  6.40  |
| o2   |  103 | coconut |  9.20  |
+------+------+------------+---------+
可以看到,f_name字段的melon、lemon和coconut3个值中都包含有字符串“on”,满足匹配条件。
【例7.76】在fruits表中,查询f_name字段值包含字符串“on”或者“ap”的记录,SQL语句如下:
  SELECT * FROM fruits WHERE f_name REGEXP 'on|ap';
+------+------+----------+---------+
| f_id | s_id | f_name  | f_price |
+-------+-------+-----------+---------+
| a1   |  101 | apple   |    5.20 |
| a2   |  103 | apricot |    2.20 |
| bs2  |  105 | melon   |    8.20 |
| l2   |  104 | lemon   |    6.40 |
| o2   |  103 | coconut |    9.20 |
| t2   |  102 | grape   |    5.30 |
+-------+-------+----------+----------+

【例7.77】在fruits表中,使用LIKE运算符查询f_name字段值为“on”的记录,SQL语句如下:
 SELECT * FROM fruits WHERE f_name LIKE 'on';
Empty set (0.00 sec)
f_name字段没有值为“on”的记录,返回结果为空。读者可以体会一下两者的区别。
7.8.6  匹配指定字符中的任意一个
方括号“[]”指定一个字符集合,只匹配其中任何一个字符,即为所查找的文本。
【例7.78】在fruits表中,查找f_name字段中包含字母’o’或者’t’的记录,SQL语句如下:
 SELECT * FROM fruits WHERE f_name REGEXP '[ot]';
+------+------+---------+---------+
| f_id | s_id | f_name  | f_price |
+------+------+---------+---------+
| a2   |  103 | apricot |    2.20 |
| bs1  |  102 | orange  |   11.20 |
| bs2  |  105 | melon   |    8.20 |
| l2   |  104 | lemon   |    6.40 |
| m1   |  106 | mango   |   15.60 |
| m3   |  105 | xxtt    |   11.60 |
| o2   |  103 | coconut |    9.20 |
+------+------+---------+---------+
查询结果可以看到,所有返回的记录的f_name字段的值中都包含有字母o或者t,或者两个都有。
方括号“[]”还可以指定数值集合
【例7.79】在fruits表,查询s_id字段中数值中包含4、5或者6的记录,SQL语句如下:
 SELECT * FROM fruits WHERE s_id REGEXP '[456]';
+------+------+---------+----------+
| f_id | s_id   | f_name | f_price |
+-------+-------+---------+---------+
| b2   |  104 | berry  |    7.60 |
| bs2  |  105 | melon  |    8.20 |
| l2   |  104 | lemon  |    6.40 |
| m1   |  106 | mango  |   15.60 |
| m2   |  105 | xbabay |    2.60 |
| m3   |  105 | xxtt   |   11.60 |
+-------+-------+---------+----------+
查询结果中,s_id字段值中有3个数字中的1个即为匹配记录字段。
匹配集合“[456]”也可以写成“[4-6]”即指定集合区间。例如“[a-z]”表示集合区间为从a~z的字母,“[0-9]”表示集合区间为所有数字。
7.8.7  匹配指定字符以外的字符
“[^字符集合]”匹配不在指定集合中的任何字符。
【例7.80】在fruits表中,查询f_id字段包含字母a~e和数字1~2以外的字符的记录,SQL语句如下:
 SELECT * FROM fruits WHERE f_id REGEXP '[^a-e1-2]';
+------+------+---------+---------+
| f_id | s_id | f_name  | f_price |
+------+------+---------+---------+
| b5   |  107 | xxxx    |    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 |
| t4   |  107 | xbababa |    3.60 |
+------+------+---------+---------+

【例7.81】在fruits表中,查询f_name字段值出现字母’x’至少2次的记录,SQL语句如下:
  SELECT * FROM fruits WHERE f_name REGEXP 'x{2,}';
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| b5  |  107 | xxxx  |   3.60 |
| m3  |  105 | xxtt  |  11.60 |
+------+-------+--------+---------+
可以看到,f_name字段的“xxxx”包含了4个字母’x’,“xxtt”包含两个字母’x’,均为满足匹配条件的记录。
【例7.82】在fruits表中,查询f_name字段值出现字符串“ba”最少1次,最多3次的记录,SQL语句如下:
 SELECT * FROM fruits WHERE f_name REGEXP 'ba{1,3}';
+------+----------+-----------+---------+
| f_id |  s_id  | f_name  | f_price  |
+------+----------+----------+------------+
| m2  |  105  | xbabay  |    2.60  |
| t1   |  102  | banana  |   10.30  |
| t4   |  107  | xbababa |    3.60  |
+-------+--------+------------+-----------+
可以看到,f_name字段的xbabay值中“ba”出现了2次,banana中出现了1次,xbababa中出现了3次,都满足匹配条件的记录。



综合案例


  创建数据表employee和dept。
CREATE TABLE dept
(
d_no         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
d_name       VARCHAR(50),
d_location     VARCHAR(100)
);
由于employee表dept_no依赖于父表dept的主键d_no,因此需要先创建dept表,然后创建employee表。
CREATE TABLE employee
(
e_no        INT NOT NULL PRIMARY KEY,
e_name      VARCHAR(100) NOT NULL,
e_gender    CHAR(2) NOT NULL,
dept_no    INT NOT NULL,
e_job       VARCHAR(100) NOT NULL,
e_salary   SMALLINT NOT NULL,
hireDate   DATE,
CONSTRAINT dno_fk FOREIGN KEY(dept_no)
REFERENCES dept(d_no)
);
  将指定记录分别插入两个表中。
向dept表中插入数据,SQL语句如下:
INSERT INTO dept 
VALUES (10, 'ACCOUNTING', 'ShangHai'),
(20, 'RESEARCH ', 'BeiJing '),
(30, 'SALES ', 'ShenZhen '),
(40, 'OPERATIONS ', 'FuJian ');
向employee表中插入数据,SQL语句如下:
INSERT INTO employee 
VALUES (1001, 'SMITH', 'm',20, 'CLERK',800,'2005-11-12'),
(1002, 'ALLEN', 'f',30, 'SALESMAN', 1600,'2003-05-12'),
(1003, 'WARD', 'f',30, 'SALESMAN', 1250,'2003-05-12'),
(1004, 'JONES', 'm',20, 'MANAGER', 2975,'1998-05-18'),
(1005, 'MARTIN', 'm',30, 'SALESMAN', 1250,'2001-06-12'), 
(1006, 'BLAKE', 'f',30, 'MANAGER', 2850,'1997-02-15'),
(1007, 'CLARK', 'm',10, 'MANAGER', 2450,'2002-09-12'),
(1008, 'SCOTT', 'm',20, 'ANALYST', 3000,'2003-05-12'),
(1009, 'KING', 'f',10, 'PRESIDENT', 5000,'1995-01-01'),
(1010, 'TURNER', 'f',30, 'SALESMAN', 1500,'1997-10-12'),
(1011, 'ADAMS', 'm',20, 'CLERK', 1100,'1999-10-05'),
(1012, 'JAMES', 'm',30, 'CLERK', 950,'2008-06-15');
  在employee表中,查询所有记录的e_no、e_name和e_salary字段值。
SELECT e_no, e_name, e_salary;
执行结果如下:
 SELECT e_no, e_name, e_salary FROM employee;
+------+--------------+-------------+
| e_no | e_name  |  e_salary  |
+------+--------------+--------------+
| 1001 | SMITH  |      800   |
| 1002 | ALLEN  |     1600   |
| 1003 | WARD   |     1250   |
| 1004 | JONES  |     2975   |
| 1005 | MARTIN |     1250   |
| 1006 | BLAKE  |     2850   |
| 1007 | CLARK  |     2450   |
| 1008 | SCOTT  |     3000   |
| 1009 | KING   |     5000   |
| 1010 | TURNER |     1500  |
| 1011 | ADAMS  |     1100   |
| 1012 | JAMES  |      950   |
+------+------------+-----------------+
12 rows in set (0.00 sec)
  在employee表中,查询dept_no等于10和20的所有记录。
SELECT * FROM employee WHERE dept_no IN (10, 20);
执行结果如下:

 SELECT * FROM employee WHERE dept_no IN (10, 20);
+------+--------+---------+---------+----------+----------+-----------+
| e_no | e_name | e_gender | dept_no | e_job   | e_salary  | hireDate  |
+------+--------+---------+---------+----------+----------+-----------+
| 1001 | SMITH   | m        |      20  | CLERK     |      800 | 2005-11-12 |
| 1004 | JONES   | m        |      20  | MANAGER  |     2975  | 1998-05-18 |
| 1007 | CLARK   | m        |      10  | MANAGER  |     2450  | 2002-09-12 |
| 1008 | SCOTT   | m        |      20  | ANALYST  |     3000  | 2003-05-12 |
| 1009 | KING    | f        |      10  | PRESIDENT  |     5000 | 1995-01-01  |
| 1011 | ADAMS   | m        |      20  | CLERK     |     1100  | 1999-10-05 |
+------+--------+---------+---------+----------+----------+-----------+
6 rows in set (0.00 sec)
  在employee表中,查询工资范围在800~2500之间的员工信息。
SELECT * FROM employee WHERE e_salary BETWEEN 800 AND 2500;
执行结果如下:
  SELECT * FROM employee WHERE e_salary BETWEEN 800 AND 2500;
+------+-------------+----------------+------------+---------------+------------------+-----------+
| e_no | e_name  | e_gender   |  dept_no  | e_job     |    e_salary   | hireDate |
+------+--------------+-----------------+---------+-----------------+--------------------+-----------+
| 1001 | SMITH  | m          |      20  | CLERK    |     800     | 2005-11-12 |
| 1002 | ALLEN  | f          |      30  | SALESMAN |    1600    | 2003-05-12 |
| 1003 | WARD   | f          |      30  | SALESMAN |    1250    | 2003-05-12 |
| 1005 | MARTIN | m          |      30  | SALESMAN |    1250   | 2001-06-12 |
| 1007 | CLARK  | m          |      10  | MANAGER |     2450   | 2002-09-12 |
| 1010 | TURNER | f          |      30  | SALESMAN |     1500   | 1997-10-12 |
| 1011 | ADAMS  | m          |      20  | CLERK    |     1100   | 1999-10-05 |
| 1012 | JAMES  | m          |      30  | CLERK    |     950    | 2008-06-15 |
+------+---------------+---------------+--------------+-----------------+----------------+------------+
8 rows in set (0.00 sec)
  在employee表中,查询部门编号为20的部门中的员工信息。
SELECT * FROM employee WHERE dept_no = 20;
执行结果如下:
 SELECT * FROM employee WHERE dept_no = 20;
+------+-------------+-------------+----------------+-------------+----------------+------------+
| e_no | e_name  | e_gender  |  dept_no  |  e_job    |  e_salary   | hireDate    |
+------+-------------+------------------+------------+--------------+----------------+------------+
| 1001 | SMITH  | m          |      20  | CLERK   |      800   | 2005-11-12 |
| 1004 | JONES  | m          |      20  | MANAGER |     2975  | 1998-05-18 |
| 1008 | SCOTT  | m          |      20  | ANALYST |     3000  | 2003-05-12 |
| 1011 | ADAMS  | m          |      20  | CLERK   |     1100   | 1999-10-05 |
+------+--------------+-----------------+-------------+--------------+------------------+------------+
4 rows in set (0.00 sec)
  在employee表中,查询每个部门最高工资的员工信息。
SELECT dept_no, MAX(e_salary) FROM employee GROUP BY dept_no;
执行结果如下:
 SELECT dept_no, MAX(e_salary) FROM employee GROUP BY dept_no;
+---------+-------------------+
| dept_no | MAX(e_salary) |
+---------+-------------------+
|   10  |         5000 |
|    20 |         3000 |
|    30 |         2850 |
+---------+-----------------+
3 rows in set (0.00 sec)
  查询员工BLAKE所在部门和部门所在地。
SELECT d_no, d_location  FROM dept WHERE d_no=
(SELECT dept_no FROM employee WHERE e_name='BLAKE');
执行结果如下:
 SELECT e_name,d_no, d_location
      FROM dept WHERE d_no=
      (SELECT dept_no FROM employee WHERE e_name='BLAKE');
+------+------------+
| d_no | d_location |
+------+------------+
|  30 | ShenZhen |
+------+------------+
1 row in set (0.00 sec)
  使用连接查询,查询所有员工的部门和部门信息。
SELECT e_no, e_name, dept_no, d_name,d_location
FROM employee, dept WHERE dept.d_no=employee.dept_no;
执行结果如下:
 SELECT e_no, e_name, dept_no, d_name,d_location
     FROM employee, dept WHERE dept.d_no=employee.dept_no;
+------+----------+------------------+------------------+-------------+
| e_no | e_name |  dept_no    |   d_name     | d_location |
+------+------------+----------------+--------------------+------------+
| 1001 | SMITH  |        20 | RESEARCH   | BeiJing     |
| 1002 | ALLEN  |        30 | SALES      | ShenZhen    |
| 1003 | WARD   |        30 | SALES      | ShenZhen   |
| 1004 | JONES  |        20 | RESEARCH   | BeiJing    |
| 1005 | MARTIN |        30 | SALES      | ShenZhen   |
| 1006 | BLAKE  |        30 | SALES      | ShenZhen    |
| 1007 | CLARK  |        10 | ACCOUNTING | ShangHai  |
| 1008 | SCOTT  |        20 | RESEARCH   | BeiJing     |
| 1009 | KING   |        10 | ACCOUNTING | ShangHai   |
| 1010 | TURNER |        30 | SALES       | ShenZhen   |
| 1011 | ADAMS  |        20 | RESEARCH  | BeiJing     |
| 1012 | JAMES  |        30 | SALES       | ShenZhen    |
+------+---------------+------------+-------------------+-----------------+
12 rows in set (0.00 sec)
  在employee表中,计算每个部门各有多少名员工。
SELECT dept_no, COUNT(*) FROM employee GROUP BY dept_no;
执行结果如下:
 SELECT dept_no, COUNT(*) FROM employee GROUP BY dept_no;
+---------+----------+
| dept_no | COUNT(*) |
+---------+----------+
|       10 |          2 |
|       20 |          4 |
|       30 |          6 |
+---------+----------+
3 rows in set (0.00 sec)
  在employee表中,计算不同类型职工的总工资数。
SELECT e_job, SUM(e_salary) FROM employee GROUP BY e_job;
执行结果如下:
 SELECT e_job, SUM(e_salary) FROM employee GROUP BY e_job;
+---------------+-------------------------+
| e_job      |  SUM(e_salary)  |
+-----------------+----------------------+
| ANALYST   |            3000 |
| CLERK     |            2850 |
| MANAGER  |            8275 |
| PRESIDENT  |            5000 |
| SALESMAN  |            5600 |
+-------------------+-----------------------+
5 rows in set (0.00 sec)
  在employee表中,计算不同部门的平均工资。
SELECT dept_no, AVG(e_salary) FROM employee GROUP BY dept_no;
执行结果如下:
 SELECT dept_no, AVG(e_salary) FROM employee GROUP BY dept_no;
+---------+-----------------+
| dept_no | AVG(e_salary) |
+---------+----------------+
|    10 |   3725.0000 |
|    20 |   1968.7500 |
|    30 |   1566.6667 |
+---------+---------------+
3 rows in set (0.00 sec)
  在employee表中,查询工资低于1500的员工信息。
SELECT * FROM employee WHERE e_salary < 1500;
执行过程如下:
 SELECT * FROM employee WHERE e_salary < 1500;
+------+--------+----------+---------+----------+---------+------------+
| e_no | e_name | e_gender | dept_no | e_job     | e_salary| hireDate   |
+------+--------+----------+---------+----------+---------+------------+
| 1001 | SMITH  | m          |       20 | CLERK     |      800 | 2005-11-12 |
| 1003 | WARD   | f          |       30 | SALESMAN  |     1250 | 2003-05-12 |
| 1005 | MARTIN | m         |       30 | SALESMAN  |     1250 | 2001-06-12 |
| 1011 | ADAMS  | m         |       20 | CLERK     |     1100 | 1999-10-05 |
| 1012 | JAMES  | m          |       30 | CLERK     |      950 | 2008-06-15 |
+------+--------+----------+---------+----------+---------+------------+
5 rows in set (0.00 sec)
  在employee表中,将查询记录先按部门编号由高到低排列,再按员工工资由高到低排列。
SELECT e_name,dept_no, e_salary 
FROM employee ORDER BY dept_no DESC, e_salary DESC;
执行过程如下:
 SELECT e_name,dept_no, e_salary
     FROM employee ORDER BY dept_no DESC, e_salary DESC;
+------------+--------------+-----------+
| e_name  |  dept_no  | e_salary |
+-------------+-------------+------------+
| BLAKE  |       30 |      2850 |
| ALLEN  |       30 |      1600 |
| TURNER |       30 |      1500 |
| WARD   |       30 |      1250 |
| MARTIN |       30 |      1250 |
| JAMES  |       30 |       950 |
| SCOTT  |       20 |      3000 |
| JONES  |       20 |      2975 |
| ADAMS  |       20 |      1100 |
| SMITH  |       20 |       800 |
| KING   |       10 |      5000 |
| CLARK  |       10 |      2450 |
+------------+--------------+--------------+
12 rows in set (0.00 sec)
  在employee表中,查询员工姓名以字母’A’或’S’开头的员工的信息。
SELECT * FROM employee WHERE e_name REGEXP '^[as]';
执行过程如下:
 SELECT * FROM employee WHERE e_name REGEXP '^[as]';
+------+------------+----------------+--------------+---------------+------------+-------------+
| e_no | e_name  |  e_gender  |  dept_no  |  e_job    | e_salary  | hireDate  |
+------+-------------+----------------+-------------+----------------+-------------+------------+
| 1001 | SMITH  | m          |       20 | CLERK     |    800  | 2005-11-12|
| 1002 | ALLEN  | f          |       30 | SALESMAN |     1600 | 2003-05-12 |
| 1008 | SCOTT  | m          |       20 | ANALYST  |     3000 | 2003-05-12 |
| 1011 | ADAMS  | m          |       20 | CLERK     |   1100  | 1999-10-05|
+------+--------------+-------------------+----------+------------------+-----------+--------------+
4 rows in set (0.00 sec)
  在employee表中,查询到目前为止,工龄大于等于10年的员工信息。
SELECT * FROM employee where YEAR(CURDATE()) -YEAR(hireDate) >= 10;
执行过程如下:
 SELECT * FROM employee where YEAR(CURDATE()) -YEAR(hireDate) >= 10;
+------+------------+--------------+------------+--------------------+---------------+-----------+
| e_no | e_name  | e_gender  | dept_no  | e_job         | e_salary    | hireDate  |
+------+-------------+--------------+-------------+-------------------+----------------+-----------+
| 1004 | JONES  | m         |       20 | MANAGER   |     2975  | 1998-05-18 |
| 1005 | MARTIN | m         |       30 | SALESMAN  |     1250  | 2001-06-12 |
| 1006 | BLAKE  | f         |       30 | MANAGER   |     2850  | 1997-02-15 |
| 1009 | KING   | f         |       10 | PRESIDENT   |     5000  | 1995-01-01 |
| 1010 | TURNER | f         |       30 | SALESMAN  |     1500  | 1997-10-12 |
| 1011 | ADAMS  | m         |       20 | CLERK     |     1100  | 1999-10-05 |
+------+---------------+--------------+--------------+-----------------+---------------+--------------+

***********************后续加入查询语句*******************************

--查询,显示所有员工姓名,部门编号,部门名称
select e.ename,d.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno;
--写一个查询,显示所有工作在CHICAGO并且奖金不会空的员工姓名,工作地点,奖金
select e.ename,d.loc,e.comm
from emp e,dept d
where e.deptno = d.deptno
and d.loc = 'CHICAGO'
and e.comm is not null;
--写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点
select e.ename,d.loc
from emp e,dept d
where e.deptno = d.deptno
and ename like '%A%';
--查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序
select e.empno,e.ename,e.sal,s.grade,d.loc
from emp e,dept d,salgrade s
where e.deptno = d.deptno
and e.sal between s.losal and s.hisal
order by sal asc;
--查询所有工作在new york和chicago的员工姓名,员工编号,以及他们的经理姓名,经理编号
select e.empno,e.ename,m.empno,m.ename
from emp e,emp m,dept d
where e.mgr = m.empno
and e.deptno = d.deptno
and d.loc in('NEW YORK','CHICAGO');
--查询员工SMITH的姓名,部门名称,直接上级名称
select e.ename,d.dname,m.ename
from emp e,emp m,dept d
where e.mgr = m.empno
and e.deptno = d.deptno
and e.ename='SMITH';
--查询员工姓名,部门名称,工资,工资级别,要求工资级别大于四级
select e.ename,d.dname,e.sal,s.grade
from emp e,dept d,salgrade s
where e.deptno = d.deptno
and e.sal between s.losal and s.hisal
and s.grade>4;
--显示员工KING和FORD管理的员工姓名及其经理姓名
select e.ename,m.ename
from emp e,emp m
where e.mgr = m.empno
and m.ename in ('KING','FORD');
--显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加工作时间比经理早
select e.ename,e.hiredate,m.ename,m.hiredate
from emp e,emp m
where e.mgr = m.empno
and e.hiredate<m.hiredate;
--查询部门人数大于2的部门编号,部门名称,部门人数
select d.deptno,d.dname,count(e.empno)
from emp e,dept d
where e.deptno = d.deptno
group by d.deptno,d.dname
having count(e.empno)>2;
--查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,部门平均工资,并按照部门
人数升序排列
select d.deptno,d.dname,count(e.empno),sum(e.sal)/count(e.empno)
from emp e,dept d
where e.deptno = d.deptno
group by d.deptno,d.dname
having count(e.empno)>2
and sum(e.sal)/count(e.empno)>2000
order by count(e.empno) asc;
--查询部门20的员工,每个月的工资总和及平均工资
select sum(sal),avg(sal)
from emp
where deptno = 20
--查询工作在CHICAGO的员工人数,最高工资及最低工资
select max(sal),min(sal)
from emp,dept
where emp.deptno = dept.deptno
and dept.loc = 'CHICAGO';
--查询员工表中一共有几种岗位类型
select count(distinct job) from emp;
--查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工资总和,平均工资
select d.deptno,d.dname,count(e.empno),max(e.sal),min(e.sal),sum(e.sal),avg(e.sal)
from emp e,dept d
where e.deptno = d.deptno
group by d.deptno,d.dname;
--查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,最高工资,最低工资,工资总和,平均
工资
select d.deptno,d.dname,e.job,count(e.empno),max(e.sal),min(e.sal),sum(e.sal),avg(e.sal)
from emp e,dept d
where e.deptno = d.deptno
group by d.deptno,d.dname,e.job;
--查询每个经理管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息
select count(e.empno),m.empno,m.ename
from emp e 
left join emp m 
on e.mgr = m.empno 
group by m.empno,m.ename;
--查询部门平均工资在2500以上的部门名称及平均工资
select d.dname,avg(e.sal)
from emp e,dept d
where e.deptno = d.deptno
group by d.dname
having avg(e.sal)>2500;
--查询员工岗位中不是以"SA"开头并且平均工资在2500元以上的岗位及平均工资,并按平均工资降序排序
select e.job,avg(e.sal)
from emp e
where e.job not like 'SA%'
group by e.job
having avg(e.sal)>2500
order by avg(e.sal) desc;
--查询部门人数在2人以上的部门名称,最低工资,最高工资,并对求得的工资进行四舍五入到整数位
select d.dname,round(min(e.sal),0),round(max(e.sal),0)
from emp e,dept d
where e.deptno = d.deptno
group by d.dname
having count(e.empno)>2;
--查询岗位不是SALESMAN,工资和大于等于2500的岗位及每种岗位的工资和
select job,sum(sal)
from emp
where job<>'SALESMAN'
group by job
having sum(sal)>=2500;
--显示经理号码,这个经理所管理的员工最低工资,没有经理的king也要显示,不包括最低工资小与3000的,按最低工资从高到低排列
select m.empno,min(e.sal)
from emp e
left join emp m
on e.mgr = m.empno
group by m.empno
having min(e.sal)>=3000
order by min(e.sal) desc;
--写一个查询,显示每个部门最高工资和最低工资的差额
select max(sal)-min(sal)
from emp
group by deptno;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值