入门MySQL——查询语法练习
程序员文章站
2022-12-21 11:29:49
前言: 前面几篇文章为大家介绍了DML以及DDL语句的使用方法,本篇文章将主要讲述常用的查询语法。其实MySQL官网给出了多个示例数据库供大家实用查询,下面我们以最常用的员工示例数据库为准,详细介绍各自常用的查询语法。 1.员工示例数据库导入 官方文档员工示例数据库介绍及下载链接: "https:/ ......
前言:
前面几篇文章为大家介绍了dml以及ddl语句的使用方法,本篇文章将主要讲述常用的查询语法。其实mysql官网给出了多个示例数据库供大家实用查询,下面我们以最常用的员工示例数据库为准,详细介绍各自常用的查询语法。
1.员工示例数据库导入
官方文档员工示例数据库介绍及下载链接:
同样的,为了方便大家,我这里将员工库的数据库备份分享给大家,大家也可以下载我这份数据,然后再解压导入进你们本地库就可以了。
链接: https://pan.baidu.com/s/13s1oh-3depn-rpejys76ww
密码: 2xqx
下载解压后,直接导入即可,如链接失效可后台联系我。
如果你导入完成,就可以看到下面这6张表了,这就是我们接下来练习查询语法要用的表哦。
为了让大家对示例数据库更了解,这里给出此数据库各表之间的关系图:
简单介绍下这6张表:
-
departments
:部门表,记录的是9个部门的部门编号和部门名称。 -
dept_emp
:部门员工表,记录各部门员工数据,员工id和部门id,起始时间和结束时间(注:9999-01-01的意思就是仍在该部门就职)。 -
dept_manager
:部门经理表,同第二张表结构差不多,记录每个部门的每个经理的任职时期。 -
employees
:员工信息表,记录员工信息,员工编号emp_no是唯一键值。 -
salaries
:薪资表,记录每个员工每段时期的薪资。 -
titles
:职称表,记录每个员工每段时期的职位名称。
2.模糊查询
#查找名字以l开头的员工信息 select * from employees where first_name like 'l%';
3.排序
#按部门编号排序 mysql> select * from departments order by dept_no; +---------+--------------------+ | dept_no | dept_name | +---------+--------------------+ | d001 | marketing | | d002 | finance | | d003 | human resources | | d004 | production | | d005 | development | | d006 | quality management | | d007 | sales | | d008 | research | | d009 | customer service | +---------+--------------------+ 9 rows in set (0.00 sec) 总结: order by排序默认按asc升序来排列 也可指定desc降序排列
4.限制多少行
#取前5行 mysql> select * from employees limit 5; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | | 10002 | 1964-06-02 | bezalel | simmel | f | 1985-11-21 | | 10003 | 1959-12-03 | parto | bamford | m | 1986-08-28 | | 10004 | 1954-05-01 | chirstian | koblick | m | 1986-12-01 | | 10005 | 1955-01-21 | kyoichi | maliniak | m | 1989-09-12 | +--------+------------+------------+-----------+--------+------------+ 5 rows in set (0.00 sec) mysql> select * from employees order by hire_date desc limit 5; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 463807 | 1964-06-12 | bikash | covnot | m | 2000-01-28 | | 428377 | 1957-05-09 | yucai | gerlach | m | 2000-01-23 | | 499553 | 1954-05-06 | hideyuki | delgrande | f | 2000-01-22 | | 222965 | 1959-08-07 | volkmar | perko | f | 2000-01-13 | | 47291 | 1960-09-09 | ulf | flexer | m | 2000-01-12 | +--------+------------+------------+-----------+--------+------------+ 5 rows in set (0.11 sec) 总结: limit限定显示前多少行,可与order by联合使用
5.聚合函数
#查找某员工薪水总和 select sum(salary) from salaries where emp_no = 10001; #统计历史上各个部门所拥有的员工数量,并降序排序 mysql> select dept_no, count(*) as emp_sum from dept_emp group by dept_no order by emp_sum desc; +---------+---------+ | dept_no | emp_sum | +---------+---------+ | d005 | 85707 | | d004 | 73485 | | d007 | 52245 | | d009 | 23580 | | d008 | 21126 | | d001 | 20211 | | d006 | 20117 | | d003 | 17786 | | d002 | 17346 | +---------+---------+ 9 rows in set (0.07 sec)
6.join
#可以试下下面3个语句执行结果的不同 select * from salaries inner join dept_emp on salaries.emp_no = dept_emp.emp_no where salaries.emp_no = 10010; select * from salaries left join dept_emp on salaries.emp_no = dept_emp.emp_no where salaries.emp_no = 10010; select * from salaries right join dept_emp on salaries.emp_no = dept_emp.emp_no where salaries.emp_no = 10010; 总结: a left join b a表全,用b表去匹配a表 left join 关键字会从左表 (a) 那里返回所有的行,即使在右表 (b) 中没有匹配的行,匹配不到的列用null代替 a right join b b表全,用a表去匹配b表 right join 关键字会右表 (b) 那里返回所有的行,即使在左表 (a) 中没有匹配的行,匹配不到的列用null代替 inner join 与join 效果一样 在表中存在至少一个匹配时,inner join 关键字返回行
总结:
推荐大家在本地导入这个示例数据库,其实这个数据库是练习查询语法的好素材。对于我们日常学习或工作中,用的最多的应该就是查询语句了,个人以为写查询sql没有技巧,只有多加练习才能快速写出能解决需求的sql。