(七)MySQL数据操作DQL:单表查询1

(1)单表查询

1)环境准备

mysql> CREATE TABLE company.employee5(
id int primary key AUTO_INCREMENT not null,
name varchar(30) not null,
sex enum('male','female') default 'male' not null,
hire_date date not null,
post varchar(50) not null,
job_description varchar(100),
salary double(15,2) not null,
office int,
dep_id int
);
insert into
company.employee5(name,sex,hire_date,post,job_description,salary,office,dep_id) values
('jack','male','20180202','instructor','teach',5000,501,100),
('tom','male','20180203','instructor','teach',5500,501,100),
('robin','male','20180202','instructor','teach',8000,501,100),
('alice','female','20180202','instructor','teach',7200,501,100),
('tianyun','male','20180202','hr','hrcc',600,502,101),
('harry','male','20180202','hr',NULL,6000,502,101),
('emma','female','20180206','sale','salecc',20000,503,102),
('christine','female','20180205','sale','salecc',2200,503,102),
('zhuzhu','male','20180205','sale',NULL,2200,503,102),
('gougou','male','20180205','sale','',2200,503,102);

2)简单查询

语法

select 字段1,字段2 from 表名;
select * from 表名;

查询表中指定字段的数据

mysql> select name,salary,post from employee5;
+-----------+----------+------------+
| name      | salary   | post       |
+-----------+----------+------------+
| jack      |  5000.00 | instructor |
| tom       |  5500.00 | instructor |
| robin     |  8000.00 | instructor |
| alice     |  7200.00 | instructor |
| tianyun   |   600.00 | hr         |
| harry     |  6000.00 | hr         |
| emma      | 20000.00 | sale       |
| christine |  2200.00 | sale       |
| zhuzhu    |  2200.00 | sale       |
| gougou    |  2200.00 | sale       |
+-----------+----------+------------+

查询表中的所有数据

mysql> select * from employee5;
+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+
| id | name      | sex    | hire_date  | post       | job_description | salary   | office | dep_id |
+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+
|  1 | jack      | male   | 2018-02-02 | instructor | teach           |  5000.00 |    501 |    100 |
|  2 | tom       | male   | 2018-02-03 | instructor | teach           |  5500.00 |    501 |    100 |
|  3 | robin     | male   | 2018-02-02 | instructor | teach           |  8000.00 |    501 |    100 |
|  4 | alice     | female | 2018-02-02 | instructor | teach           |  7200.00 |    501 |    100 |
|  5 | tianyun   | male   | 2018-02-02 | hr         | hrcc            |   600.00 |    502 |    101 |
|  6 | harry     | male   | 2018-02-02 | hr         | NULL            |  6000.00 |    502 |    101 |
|  7 | emma      | female | 2018-02-06 | sale       | salecc          | 20000.00 |    503 |    102 |
|  8 | christine | female | 2018-02-05 | sale       | salecc          |  2200.00 |    503 |    102 |
|  9 | zhuzhu    | male   | 2018-02-05 | sale       | NULL            |  2200.00 |    503 |    102 |
| 10 | gougou    | male   | 2018-02-05 | sale       |                 |  2200.00 |    503 |    102 |
+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+

3)避免去重distinct,通常仅用于某一个字段

语法

select distinct 字段 from 表名;

查询雇员表中的部门,把部门字段去重

mysql> select distinct post from employee5;
+------------+
| post       |
+------------+
| instructor |
| hr         |
| sale       |
+------------+
3 rows in set (0.00 sec)

mysql> select post from employee5;
+------------+
| post       |
+------------+
| instructor |
| instructor |
| instructor |
| instructor |
| hr         |
| hr         |
| sale       |
| sale       |
| sale       |
| sale       |
+------------+
10 rows in set (0.00 sec)

4)通过四则运算查询,

语法:
select 字段1,字段2,字段数字 from 表名;
select 字段1,字段2,字段2
数字 as 新字段名字 from 表名
select 字段1,字段2,字段2*数字 新字段名字 from 表名
根据月薪水查14年薪

mysql> select name,salary,salary*14 from employee5;   \创建一个新的年薪14薪字段(salary*14)
mysql> select name,salary,salary*14 as annual_salary from employee5;   \给salary*14这个设置一个别名
mysql> select name,salary,salary*14 annual_salary from employee5;   \salary*14 设定别名(annual_salary)
mysql>  select name,salary,salary*14 from employee5; 
+-----------+----------+-----------+
| name      | salary   | salary*14 |
+-----------+----------+-----------+
| jack      |  5000.00 |  70000.00 |
| tom       |  5500.00 |  77000.00 |
| robin     |  8000.00 | 112000.00 |
| alice     |  7200.00 | 100800.00 |
| tianyun   |   600.00 |   8400.00 |
| harry     |  6000.00 |  84000.00 |
| emma      | 20000.00 | 280000.00 |
| christine |  2200.00 |  30800.00 |
| zhuzhu    |  2200.00 |  30800.00 |
| gougou    |  2200.00 |  30800.00 |
+-----------+----------+-----------+
10 rows in set (0.00 sec)

mysql> select name,salary,salary*14 as annual_salary from employee5;
+-----------+----------+---------------+
| name      | salary   | annual_salary |
+-----------+----------+---------------+
| jack      |  5000.00 |      70000.00 |
| tom       |  5500.00 |      77000.00 |
| robin     |  8000.00 |     112000.00 |
| alice     |  7200.00 |     100800.00 |
| tianyun   |   600.00 |       8400.00 |
| harry     |  6000.00 |      84000.00 |
| emma      | 20000.00 |     280000.00 |
| christine |  2200.00 |      30800.00 |
| zhuzhu    |  2200.00 |      30800.00 |
| gougou    |  2200.00 |      30800.00 |
+-----------+----------+---------------+
10 rows in set (0.00 sec)

mysql> select name,salary,salary*14 annual_salary from employee5;
+-----------+----------+---------------+
| name      | salary   | annual_salary |
+-----------+----------+---------------+
| jack      |  5000.00 |      70000.00 |
| tom       |  5500.00 |      77000.00 |
| robin     |  8000.00 |     112000.00 |
| alice     |  7200.00 |     100800.00 |
| tianyun   |   600.00 |       8400.00 |
| harry     |  6000.00 |      84000.00 |
| emma      | 20000.00 |     280000.00 |
| christine |  2200.00 |      30800.00 |
| zhuzhu    |  2200.00 |      30800.00 |
| gougou    |  2200.00 |      30800.00 |
+-----------+----------+---------------+
10 rows in set (0.00 sec)

5)定义显示格式:contcat()函数用于连接字符串

mysql>  select concat(name,'annual salary:',salary*14) as annual_salary from employee5;
+---------------------------------+
| annual_salary                   |
+---------------------------------+
| jackannual salary:70000.00      |
| tomannual salary:77000.00       |
| robinannual salary:112000.00    |
| aliceannual salary:100800.00    |
| tianyunannual salary:8400.00    |
| harryannual salary:84000.00     |
| emmaannual salary:280000.00     |
| christineannual salary:30800.00 |
| zhuzhuannual salary:30800.00    |
| gougouannual salary:30800.00    |
+---------------------------------+

(2)单条件查询

语法:
select 字段1,字段2 from 表名 where 条件;

1)单条件查询

mysql> select name,salary from employee5 where name='jack';
+------+---------+
| name | salary  |
+------+---------+
| jack | 5000.00 |
+------+---------+

2)多条件查询:查询工资大于5000和小于20000的姓名

语法:
select select 字段1,字段2 from 表名 where 条件1 and 条件2;
select select 字段1,字段2 from 表名 where 条件1 or 条件2;

mysql> select name,salary from employee5 where salary > 5000 and salary <20000;
+-------+---------+
| name  | salary  |
+-------+---------+
| tom   | 5500.00 |
| robin | 8000.00 |
| alice | 7200.00 |
| harry | 6000.00 |
+-------+---------+

3)关键字between and

查询工资大于等于5000和小于等于20000的姓名

mysql> select name,salary from employee5 where salary between 5000 and 20000;
mysql> select name,salary from employee5 where salary not  between 5000 and 20000;

4)关键字 is null

查询字段是空的值

mysql> select name,job_description from employee5 where job_description is null;

5)关键字in 集合查询

查询工资是5000和6000的都是哪些人,和不是哪些人

mysql> select name,salary from employee5 where salary=5000 or salary=6000;
mysql> select name,salary from employee5 where salary in(5000,6000);
mysql> select name,salary from employee5 where salary not in(5000,6000);

6)模糊查询,关键字:like

通配符:%,匹配任意长度字符

mysql> select * from employee5 where name like 'al%';

通配符:_ 匹配任意单个字符

mysql> select * from employee5 where name like 'al_';

(3)查询排序

1)单列排序

按照薪水排序
mysql> select * from employee5 order by salary;   //升序
按照薪水降序
mysql> select * from employee5 order by salary desc; //降序

2)按多列排序

先按入职时间排序,再按薪水排序

mysql> select * from employee5 order by hire_date ,salary asc;

(4)限制查询的记录数

mysql> select * from employee5 order by salary limit 5;    \取前5条数据,默认初始位置是0
mysql> select * from employee5 order by salary limit 4,5;  \从第3条数据开始,取5条数据

(5)使用集合函数查询

count(*) 统计行数据
max(字段) 取字段最大值
min(字段) :取字段最小值
avg(字段) :平均
sum(字段) :取字段和

mysql> select count(*) from employee5;
mysql> select count(*) from employee5 where post='hr';

查询薪水最高的人所有信息

mysql> select * from employee5 where salary = (select max(salary) from employee5);  //子查询

(6)分组查询

1)group by和group_concat()函数一起使用

根据部门id进行分组,把相同部门的人统计出来(拼接)

mysql> select dep_id,group_concat(name) from employee5  group by dep_id;

根据部门进行分组,把部门的每个人姓名打印出来(拼接)

mysql> select post,group_concat(name) from employee5  group by post;

2)group by和集合函数一起使用

根据部门进行分组,取每个部门薪水最大的

mysql> select post,max(salary) from employee5 group by post;

(7)使用正则进行匹配

mysql> select name,salary from employee5 where name regexp 'm{2}';
mysql> select name,salary from employee5 where name regexp 'yun$';
mysql> select name,salary from employee5 where name regexp '^m';
原文地址:https://www.cnblogs.com/lovelinux199075/p/8902457.html