MySQL数据库篇之单表查询

主要内容:

  一、单表查询的语法

  二、关键字的执行优先级

  三、简单查询

  四、where约束

  五、分组查询 group by

  六、having过滤

  七、查询排序 order by

  八、限制查询的记录数 limit

  九、使用正则表达式查询

扫描二维码关注公众号,回复: 945214 查看本文章

1️⃣ 单表查询的语法

SELECT 字段1,字段2... FROM 表名
                  WHERE 条件
                  GROUP BY field
                  HAVING 筛选
                  ORDER BY field
                  LIMIT 限制条数

2️⃣  关键字的执行优先级

重点中的重点:关键字的执行优先级(从上至下)
from    # 找到表
where   # 拿着where指定的约束条件,去文件/表中取出一条条记录
group by  # 将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
having    # 将分组的结果进行having过滤
select    # 执行select
distinct   # 去重 
order by   # 将结果按条件排序
limit    # 限制结果的显示条数

3️⃣  简单查询

company.employee
    员工id      id                  int             
    姓名        emp_name            varchar
    性别        sex                 enum
    年龄        age                 int
    入职日期     hire_date           date
    岗位        post                varchar
    职位描述     post_comment        varchar
    薪水        salary              double
    办公室       office              int
    部门编号     depart_id           int

  1、创建表

create table employee(
id int not null unique auto_increment,
name varchar(20) not null,
sex enum('male','female') not null default 'male', 
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int, 
depart_id int
);

  2、查看表结构

mysql> desc employee;
+--------------+-----------------------+------+-----+---------+----------------+
| Field        | Type                  | Null | Key | Default | Extra          |
+--------------+-----------------------+------+-----+---------+----------------+
| id           | int(11)               | NO   | PRI | NULL    | auto_increment |
| name         | varchar(20)           | NO   |     | NULL    |                |
| sex          | enum('male','female') | NO   |     | male    |                |
| age          | int(3) unsigned       | NO   |     | 28      |                |
| hire_date    | date                  | NO   |     | NULL    |                |
| post         | varchar(50)           | YES  |     | NULL    |                |
| post_comment | varchar(100)          | YES  |     | NULL    |                |
| salary       | double(15,2)          | YES  |     | NULL    |                |
| office       | int(11)               | YES  |     | NULL    |                |
| depart_id    | int(11)               | YES  |     | NULL    |                |
+--------------+-----------------------+------+-----+---------+----------------+

  3、插入记录

#三个部门:教学,销售,运营
insert into employee(name,sex,age,hire_date,post,salary,office,depart_id) values
('egon','male',18,'20170301','老男孩驻沙河办事处外交大使',7300.33,401,1), #以下是教学部
('alex','male',78,'20150302','teacher',1000000.31,401,1),
('wupeiqi','male',81,'20130305','teacher',8300,401,1),
('yuanhao','male',73,'20140701','teacher',3500,401,1),
('liwenzhou','male',28,'20121101','teacher',2100,401,1),
('jingliyang','female',18,'20110211','teacher',9000,401,1),
('jinxin','male',18,'19000301','teacher',30000,401,1),
('成龙','male',48,'20101111','teacher',10000,401,1),

('歪歪','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('丫丫','female',38,'20101101','sale',2000.35,402,2),
('丁丁','female',18,'20110312','sale',1000.37,402,2),
('星星','female',18,'20160513','sale',3000.29,402,2),
('格格','female',28,'20170127','sale',4000.33,402,2),

('张野','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3)
;

#ps:如果在windows系统中,插入中文字符,select的结果为空白,可以将所有字符编码统一设置成gbk

  4、简单查询 

 SELECT id,name,sex,age,hire_date,post,post_comment,salary,office,depart_id 
    FROM employee;  # 等同于 select * from employee;

结果如下:

+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| id | name       | sex    | age | hire_date  | post                                    | post_comment | salary     | office | depart_id |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
|  1 | egon       | male   |  18 | 2017-03-01 | 老男孩驻沙河办事处外交大使              | NULL         |    7300.33 |    401 |         1 |
|  2 | alex       | male   |  78 | 2015-03-02 | teacher                                 | NULL         | 1000000.31 |    401 |         1 |
|  3 | wupeiqi    | male   |  81 | 2013-03-05 | teacher                                 | NULL         |    8300.00 |    401 |         1 |
|  4 | yuanhao    | male   |  73 | 2014-07-01 | teacher                                 | NULL         |    3500.00 |    401 |         1 |
|  5 | liwenzhou  | male   |  28 | 2012-11-01 | teacher                                 | NULL         |    2100.00 |    401 |         1 |
|  6 | jingliyang | female |  18 | 2011-02-11 | teacher                                 | NULL         |    9000.00 |    401 |         1 |
|  7 | jinxin     | male   |  18 | 1900-03-01 | teacher                                 | NULL         |   30000.00 |    401 |         1 |
|  8 | 成龙       | male   |  48 | 2010-11-11 | teacher                                 | NULL         |   10000.00 |    401 |         1 |
|  9 | 歪歪       | female |  48 | 2015-03-11 | sale                                    | NULL         |    3000.13 |    402 |         2 |
| 10 | 丫丫       | female |  38 | 2010-11-01 | sale                                    | NULL         |    2000.35 |    402 |         2 |
| 11 | 丁丁       | female |  18 | 2011-03-12 | sale                                    | NULL         |    1000.37 |    402 |         2 |
| 12 | 星星       | female |  18 | 2016-05-13 | sale                                    | NULL         |    3000.29 |    402 |         2 |
| 13 | 格格       | female |  28 | 2017-01-27 | sale                                    | NULL         |    4000.33 |    402 |         2 |
| 14 | 张野       | male   |  28 | 2016-03-11 | operation                               | NULL         |   10000.13 |    403 |         3 |
| 15 | 程咬金     | male   |  18 | 1997-03-12 | operation                               | NULL         |   20000.00 |    403 |         3 |
| 16 | 程咬银     | female |  18 | 2013-03-11 | operation                               | NULL         |   19000.00 |    403 |         3 |
| 17 | 程咬铜     | male   |  18 | 2015-04-11 | operation                               | NULL         |   18000.00 |    403 |         3 |
| 18 | 程咬铁     | female |  18 | 2014-05-12 | operation                               | NULL         |   17000.00 |    403 |         3 |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
18 rows in set (0.00 sec)

  select name,salary from employee;

结果如下:

+------------+------------+
| name       | salary     |
+------------+------------+
| egon       |    7300.33 |
| alex       | 1000000.31 |
| wupeiqi    |    8300.00 |
| yuanhao    |    3500.00 |
| liwenzhou  |    2100.00 |
| jingliyang |    9000.00 |
| jinxin     |   30000.00 |
| 成龙       |   10000.00 |
| 歪歪       |    3000.13 |
| 丫丫       |    2000.35 |
| 丁丁       |    1000.37 |
| 星星       |    3000.29 |
| 格格       |    4000.33 |
| 张野       |   10000.13 |
| 程咬金     |   20000.00 |
| 程咬银     |   19000.00 |
| 程咬铜     |   18000.00 |
| 程咬铁     |   17000.00 |
+------------+------------+
18 rows in set (0.00 sec)
View Code

  5、避免重复 DISTINCT

select distinct post from employee;

    查询结果如下:

+-----------------------------------------+
| post                                    |
+-----------------------------------------+
| 老男孩驻沙河办事处外交大使              |
| teacher                                 |
| sale                                    |
| operation                               |
+-----------------------------------------+
4 rows in set (0.00 sec)

  6、通过四则运算查询

SELECT name, salary*12 FROM employee;  # 计算年薪
SELECT name, salary*12 AS Annual_salary FROM employee; # 计算年薪并重命名为 Annual_salary
SELECT name, salary*12 Annual_salary FROM employee; # 计算年薪并重命名为 Annual_salary,省略as

    查询结果如下:

+------------+---------------+
| name       | Annual_salary |
+------------+---------------+
| egon       |      87603.96 |
| alex       |   12000003.72 |
| wupeiqi    |      99600.00 |
| yuanhao    |      42000.00 |
| liwenzhou  |      25200.00 |
| jingliyang |     108000.00 |
| jinxin     |     360000.00 |
| 成龙       |     120000.00 |
| 歪歪       |      36001.56 |
| 丫丫       |      24004.20 |
| 丁丁       |      12004.44 |
| 星星       |      36003.48 |
| 格格       |      48003.96 |
| 张野       |     120001.56 |
| 程咬金     |     240000.00 |
| 程咬银     |     228000.00 |
| 程咬铜     |     216000.00 |
| 程咬铁     |     204000.00 |
+------------+---------------+
18 rows in set (0.00 sec)
View Code

  7、定义显示格式

  CONCAT() 函数用于连接字符串
   SELECT CONCAT('姓名: ',name,'  年薪: ', salary*12)  AS Annual_salary 
   FROM employee;
+-----------------------------------------+
| Annual_salary                           |
+-----------------------------------------+
| 姓名:egon  年薪:87603.96              |
| 姓名:alex  年薪:12000003.72           |
| 姓名:wupeiqi  年薪:99600.00           |
| 姓名:yuanhao  年薪:42000.00           |
| 姓名:liwenzhou  年薪:25200.00         |
| 姓名:jingliyang  年薪:108000.00       |
| 姓名:jinxin  年薪:360000.00           |
| 姓名:成龙  年薪:120000.00             |
| 姓名:歪歪  年薪:36001.56              |
| 姓名:丫丫  年薪:24004.20              |
| 姓名:丁丁  年薪:12004.44              |
| 姓名:星星  年薪:36003.48              |
| 姓名:格格  年薪:48003.96              |
| 姓名:张野  年薪:120001.56             |
| 姓名:程咬金  年薪:240000.00           |
| 姓名:程咬银  年薪:228000.00           |
| 姓名:程咬铜  年薪:216000.00           |
| 姓名:程咬铁  年薪:204000.00           |
+-----------------------------------------+
18 rows in set (0.00 sec)
View Code
   CONCAT_WS() 第一个参数为分隔符
   SELECT CONCAT_WS(':',name,salary*12)  AS Annual_salary 
   FROM employee;
+----------------------+
| Annual_salary        |
+----------------------+
| egon:87603.96        |
| alex:12000003.72     |
| wupeiqi:99600.00     |
| yuanhao:42000.00     |
| liwenzhou:25200.00   |
| jingliyang:108000.00 |
| jinxin:360000.00     |
| 成龙:120000.00       |
| 歪歪:36001.56        |
| 丫丫:24004.20        |
| 丁丁:12004.44        |
| 星星:36003.48        |
| 格格:48003.96        |
| 张野:120001.56       |
| 程咬金:240000.00     |
| 程咬银:228000.00     |
| 程咬铜:216000.00     |
| 程咬铁:204000.00     |
+----------------------+
18 rows in set (0.00 sec)
View Code

  练习题:

1、 查出所有员工的名字,薪资,格式为<名字:egon><薪资:3000>
2、查出所有的岗位(去掉重复)
3、查出所有员工名字,以及他们的年薪,年薪的字段名为annual_year

参考结果:

mysql> select concat('<','名字:',name,'>','<','薪资:','salary','>') from employee;
+---------------------------------------------------------------+
| concat('<','名字:',name,'>','<','薪资:','salary','>')       |
+---------------------------------------------------------------+
| <名字:egon><薪资:salary>                                    |
| <名字:alex><薪资:salary>                                    |
| <名字:wupeiqi><薪资:salary>                                 |
| <名字:yuanhao><薪资:salary>                                 |
| <名字:liwenzhou><薪资:salary>                               |
| <名字:jingliyang><薪资:salary>                              |
| <名字:jinxin><薪资:salary>                                  |
| <名字:成龙><薪资:salary>                                    |
| <名字:歪歪><薪资:salary>                                    |
| <名字:丫丫><薪资:salary>                                    |
| <名字:丁丁><薪资:salary>                                    |
| <名字:星星><薪资:salary>                                    |
| <名字:格格><薪资:salary>                                    |
| <名字:张野><薪资:salary>                                    |
| <名字:程咬金><薪资:salary>                                  |
| <名字:程咬银><薪资:salary>                                  |
| <名字:程咬铜><薪资:salary>                                  |
| <名字:程咬铁><薪资:salary>                                  |
+---------------------------------------------------------------+
18 rows in set (0.00 sec)
View Code
mysql> select distinct depart_id from employee;
+-----------+
| depart_id |
+-----------+
|         1 |
|         2 |
|         3 |
+-----------+
3 rows in set (0.00 sec)
View Code
mysql> select name,salary*12 as annual_salary from employee;
+------------+---------------+
| name       | annual_salary |
+------------+---------------+
| egon       |      87603.96 |
| alex       |   12000003.72 |
| wupeiqi    |      99600.00 |
| yuanhao    |      42000.00 |
| liwenzhou  |      25200.00 |
| jingliyang |     108000.00 |
| jinxin     |     360000.00 |
| 成龙       |     120000.00 |
| 歪歪       |      36001.56 |
| 丫丫       |      24004.20 |
| 丁丁       |      12004.44 |
| 星星       |      36003.48 |
| 格格       |      48003.96 |
| 张野       |     120001.56 |
| 程咬金     |     240000.00 |
| 程咬银     |     228000.00 |
| 程咬铜     |     216000.00 |
| 程咬铁     |     204000.00 |
+------------+---------------+
18 rows in set (0.00 sec)
View Code

4️⃣  WHERE约束

比较运算符:><>= <= <> !=
between 80 and 100 值在10到20之间
in(80,90,100) 值是10或20或30
like 'egon%'
pattern可以是%或_,
%表示任意多字符
_表示一个字符
逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

  1、单条件查询

mysql> select name from employee where post = 'sale';
+--------+
| name   |
+--------+
| 歪歪   |
| 丫丫   |
| 丁丁   |
| 星星   |
| 格格   |
+--------+
5 rows in set (0.00 sec)
View Code

  2、多条件查询

  SELECT name,salary FROM employee
        WHERE post='teacher' AND salary>10000;
+--------+------------+
| name   | salary     |
+--------+------------+
| alex   | 1000000.31 |
| jinxin |   30000.00 |
+--------+------------+
2 rows in set (0.00 sec)
View Code

  3、关键字BETWEEN AND

 SELECT name,salary FROM employee 
        WHERE salary BETWEEN 10000 AND 20000; # 所查数据在某一范围内
+-----------+----------+
| name      | salary   |
+-----------+----------+
| 成龙      | 10000.00 |
| 张野      | 10000.13 |
| 程咬金    | 20000.00 |
| 程咬银    | 19000.00 |
| 程咬铜    | 18000.00 |
| 程咬铁    | 17000.00 |
+-----------+----------+
6 rows in set (0.00 sec)
View Code
  SELECT name,salary FROM employee 
        WHERE salary NOT BETWEEN 10000 AND 20000; # 所查数据不在某一范围内
+------------+------------+
| name       | salary     |
+------------+------------+
| egon       |    7300.33 |
| alex       | 1000000.31 |
| wupeiqi    |    8300.00 |
| yuanhao    |    3500.00 |
| liwenzhou  |    2100.00 |
| jingliyang |    9000.00 |
| jinxin     |   30000.00 |
| 歪歪       |    3000.13 |
| 丫丫       |    2000.35 |
| 丁丁       |    1000.37 |
| 星星       |    3000.29 |
| 格格       |    4000.33 |
+------------+------------+
12 rows in set (0.00 sec)
View Code

  4、关键字 IS NULL(判断某个字段是否为NULL不能用等号,需要用 IS)

SELECT name,post_comment FROM employee 
        WHERE post_comment IS NULL;
+------------+--------------+
| name       | post_comment |
+------------+--------------+
| egon       | NULL         |
| alex       | NULL         |
| wupeiqi    | NULL         |
| yuanhao    | NULL         |
| liwenzhou  | NULL         |
| jingliyang | NULL         |
| jinxin     | NULL         |
| 成龙       | NULL         |
| 歪歪       | NULL         |
| 丫丫       | NULL         |
| 丁丁       | NULL         |
| 星星       | NULL         |
| 格格       | NULL         |
| 张野       | NULL         |
| 程咬金     | NULL         |
| 程咬银     | NULL         |
| 程咬铜     | NULL         |
| 程咬铁     | NULL         |
+------------+--------------+
18 rows in set (0.00 sec)
View Code
SELECT name,post_comment FROM employee 
        WHERE post_comment IS NOT NULL;
Empty set (0.00 sec)
View Code
 SELECT name,post_comment FROM employee 
        WHERE post_comment=''; 注意''是空字符串,不是null
Empty set (0.00 sec)
View Code
 执行
        update employee set post_comment='' where id=2;
        再用上条查看效果
mysql> update employee set post_comment='' where id=2;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT name,post_comment FROM employee
    ->         WHERE post_comment='';
+------+--------------+
| name | post_comment |
+------+--------------+
| alex |              |
+------+--------------+
1 row in set (0.00 sec)

  5、关键字 IN 集合查询

 SELECT name,salary FROM employee 
        WHERE salary=3000 OR salary=3500 OR salary=4000 OR salary=9000 ;
 SELECT name,salary FROM employee 
        WHERE salary IN (3000,3500,4000,9000) ;

  上面两条语句的查询结果完全相同:

+------------+---------+
| name       | salary  |
+------------+---------+
| yuanhao    | 3500.00 |
| jingliyang | 9000.00 |
+------------+---------+
2 rows in set (0.00 sec)
SELECT name,salary FROM employee 
     WHERE salary NOT IN (3000,3500,4000,9000) ; # 查询不在某一集合的范围内的数据
+-----------+------------+
| name      | salary     |
+-----------+------------+
| egon      |    7300.33 |
| alex      | 1000000.31 |
| wupeiqi   |    8300.00 |
| liwenzhou |    2100.00 |
| jinxin    |   30000.00 |
| 成龙      |   10000.00 |
| 歪歪      |    3000.13 |
| 丫丫      |    2000.35 |
| 丁丁      |    1000.37 |
| 星星      |    3000.29 |
| 格格      |    4000.33 |
| 张野      |   10000.13 |
| 程咬金    |   20000.00 |
| 程咬银    |   19000.00 |
| 程咬铜    |   18000.00 |
| 程咬铁    |   17000.00 |
+-----------+------------+
16 rows in set (0.00 sec)
View Code

  6、关键字 LIKE 模糊查询

 通配符’%’  # 匹配多个字符
    SELECT * FROM employee 
            WHERE name LIKE 'eg%';

    通配符’_’ # 每个匹配一字符
    SELECT * FROM employee 
            WHERE name LIKE 'al__';

  练习题:

1. 查看岗位是teacher的员工姓名、年龄
2. 查看岗位是teacher且年龄大于30岁的员工姓名、年龄
3. 查看岗位是teacher且薪资在9000-1000范围内的员工姓名、年龄、薪资
4. 查看岗位描述不为NULL的员工信息
5. 查看岗位是teacher且薪资是10000或9000或30000的员工姓名、年龄、薪资
6. 查看岗位是teacher且薪资不是10000或9000或30000的员工姓名、年龄、薪资
7. 查看岗位是teacher且名字是jin开头的员工姓名、年薪
select name,age from employee where post = 'teacher';
select name,age from employee where post='teacher' and age > 30; 
select name,age,salary from employee where post='teacher' and salary between 9000 and 10000;
select * from employee where post_comment is not null;
select name,age,salary from employee where post='teacher' and salary in (10000,9000,30000);
select name,age,salary from employee where post='teacher' and salary not in (10000,9000,30000);
select name,salary*12 from employee where post='teacher' and name like 'jin%';
View Code

未完,待续...

猜你喜欢

转载自www.cnblogs.com/schut/p/9062316.html