MySQL数据库篇之单表查询

主要内容:

  一、单表查询的语法

  二、关键字的执行优先级

  三、简单查询

  四、where约束

  五、分组查询 group by

  六、having过滤

  七、查询排序 order by

  八、限制查询的记录数 limit

  九、使用正则表达式查询

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)

  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)

  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)

   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)

  练习题:

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)

mysql> select distinct depart_id from employee;
+-----------+
| depart_id |
+-----------+
|         1 |
|         2 |
|         3 |
+-----------+
3 rows in set (0.00 sec)

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)

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)

  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)

  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)

  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)

  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)

SELECT name,post_comment FROM employee
        WHERE post_comment IS NOT NULL;

Empty set (0.00 sec)

 SELECT name,post_comment FROM employee
        WHERE post_comment=‘‘; 注意‘‘是空字符串,不是null

Empty set (0.00 sec)

 执行
        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)

  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%‘;

未完,待续...

原文地址:https://www.cnblogs.com/schut/p/9062316.html

时间: 2024-11-01 06:53:01

MySQL数据库篇之单表查询的相关文章

mysql 数据库 IV(单表查询)

1.今日内容 单表查询语法 select distinct 字段1,字段2... from 表名 where 条件 group by 字段 having 筛选 order by 字段 limit 限制条数 关键字执行的优先级 from # 找到表 where # 拿着where指定的约束条件,去文件/表中取出一条条记录 group by # 将取出来的数据进行group by,如果没有group by,则整体做为一组 select distinct #执行select-去重 having #将分

04 数据库入门学习-单表查询、多表查询、子查询

1.复制表 #创建了一张测试表 mysql>create table test (id int primary key auto_increment,name char(10)); #显示原表结构 mysql> desc test; +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+---

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

(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 varcha

mysql四-1:单表查询

一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二.关键字的执行优先级(重点) 1.from  库.表--找到表 2.where  条件--按照where指定的约束条件,去表中取出一条条记录 3.group by  分组条件--对取出的一条条记录分组,如果没有group by,整体作为一组 4.having  过滤--将分组的结果进行过滤 5.selec

MySql(六)单表查询

一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二.关键字的执行优先级(重点) 重点中的重点:关键字的执行优先级fromwheregroup byhavingselectdistinctorder bylimit 1.找到表:from 2.拿着where指定的约束条件,去文件/表中取出一条条记录 3.将取出的一条条记录进行分组group by,如果没有g

数据库原理-数据单表查询

格式:select [all|distinct] <目标列表达式>,[目标列]... from <表名或视图名>[,<表名或视图名>|(seslect 语句)[as]<别名>] [where <条件名>] [group by<列名1>[having <条件表达式>]] [order by<列名1>[asc|desc]] 单表查询 选择表中的若干列 1.查询全部列 select * from student 2.

Linux命令:MySQL系列之五--SELECT单表查询、多表查询升级及删除,插入

SELECT:查询 SELECT select-list FROM tb WHERE qualification  根据标准qualification查找对应的行 查询语句类型:  qualification条件  field领域  distinct独特的 简单查询: 多表查询: 子查询: SELECT * FROM tb_name: 查询tb_name表的所有信息 SELECT field1,field2 FROM tb_name: 投影显示所设定的领域条目(field),一个field就是一

MySQL数据库学习【第七篇】单表查询

先创建表 #创建表 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_com

mysql 的完整性约束 与单表查询

1 foreign key 外键 建立两张表的联系 1 创建表时先创建被关联的表 在创建关联表 create table dep( id int primary key, name varchar(20) not null, descripe varchar(20) not null); 在创建关联表(emp表) create table emp( id int primary key, name varchar(20) not null, age int not null, dep_id in