数据准备
从最简单的查询语句开始,我们先创建一个数据库,名字随意起,然后再创建一张表,表字段和内容都将使用牛客网的数据。创建一张名为salaries的工资表,复制以下代码,并在mysql中回车创建。
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
然后插入数据
INSERT INTO salaries VALUES(10001,60117,'1986-06-26','1987-06-26');
INSERT INTO salaries VALUES(10001,62102,'1987-06-26','1988-06-25');
INSERT INTO salaries VALUES(10001,66074,'1988-06-25','1989-06-25');
INSERT INTO salaries VALUES(10001,66596,'1989-06-25','1990-06-25');
INSERT INTO salaries VALUES(10001,66961,'1990-06-25','1991-06-25');
INSERT INTO salaries VALUES(10001,71046,'1991-06-25','1992-06-24');
INSERT INTO salaries VALUES(10001,74333,'1992-06-24','1993-06-24');
INSERT INTO salaries VALUES(10001,75286,'1993-06-24','1994-06-24');
INSERT INTO salaries VALUES(10001,75994,'1994-06-24','1995-06-24');
INSERT INTO salaries VALUES(10001,76884,'1995-06-24','1996-06-23');
INSERT INTO salaries VALUES(10001,80013,'1996-06-23','1997-06-23');
INSERT INTO salaries VALUES(10001,81025,'1997-06-23','1998-06-23');
INSERT INTO salaries VALUES(10001,81097,'1998-06-23','1999-06-23');
INSERT INTO salaries VALUES(10001,84917,'1999-06-23','2000-06-22');
INSERT INTO salaries VALUES(10001,85112,'2000-06-22','2001-06-22');
简易查询
查看salaries表里面的所有内容,使用最简单的select方法
select * from salaries
语句格式:select 字段 from 表名
表示从表中查询某某字段,*表示的是所有,即从salaries表中查询所有内容,为了到达一样的功能,也可以这样写
select salaries.* from salaries
上述的两种查询结果都是一致的,如下图所示
但是在正常工作中,我们一般不会打印出所有内容来,因为工作过程中的表数据往往是百万个数量级甚至更高,而且全部显示出来,也会导致服务器性能上的问题,所以我们通常是按字段查询,比如下面这题
题目:获取当前salaries表的成员编号emp_no,以及对应的工资salary
# 写法1
SELECT emp_no,salary FROM salaries
在select后面跟上对应的字段名就可以了
显示结果如下图:
也可以写成
# 写法2
SELECT salaries.emp_no,salaries.salary FROM salaries
表示的是从salaries中查看对应的emp_no和salary,但是这样写比较长,有点麻烦,还可以写成这样
# 写法3
SELECT s.emp_no,s.salary FROM salaries s
salaries后面空格跟个s表示:将salaries名改为s,即salaries as s
的缩写
推荐使用写法3,因为通常的查询都会涉及多张表,而每张表中或多或少会有同样的字段名,表多起来非常难以区分是哪个表中的字段,所以建议使用写法3
题目:获取当前salaries表的成员编号为10001的emp_no,以及对应的工资salary
复制刚才的代码,加上一个条件,就可以筛选了
条件的筛选,我们使用where
SELECT s.emp_no,s.salary FROM salaries s
WHERE s.emp_no = 10001
结果如下图:
order by排序查询
题目:获取当前salaries表的成员编号为10001的emp_no,以及对应的工资salary,并按照salary升序排序
排序的时候使用order by
,写在条件的后面
SELECT s.emp_no,s.salary FROM salaries s
WHERE s.emp_no = 10001
ORDER BY salary ASC
排序的写法 ORDER BY 字段名 ASC
,ASC表示升序排序,默认不写是升序排序,降序改为DESC即可
输出结果如下:
group by分组查询
题目:获取当前salaries表的emp_no,以及对应的工资salary,并按照emp_no进行分组
分组使用group by
SELECT emp_no,group_concat(salary) salary FROM salaries
GROUP BY emp_no
按照emp_no分组以后,第二字段的salary可能会出现一个或多个,不使用group_concat的话,写了除分组的字段以外的字段会报错。所以需要用上group_concat()函数,往里面写对应的字段名即可,函数的中文意思是:将组里面多个字符串合并成一个。
输出结果如下图所示:
limit筛选查询
题目:请获取当前(to_date=‘9999-01-01’)薪水第二多的员工的emp_no以及对应的薪水salary
题目分析:
做之前先留意,题目这里有个默认条件to_date=‘9999-01-01’,to_date指的就是近期时间,'9999-01-01’表示无穷的年限,意思就是指to_date为’9999-01-01’的员工,现在还在这家公司工作,符合题意,作为我们做该题的条件依据。
而第几条或者第几名,有特定要求指向的排名的数据,我们可以先给所有数据排序,然后再使用limit
取第几条
SELECT emp_no,salary FROM salaries
WHERE to_date = '9999-01-01'
ORDER BY salary desc
LIMIT 1,1 #第一个1表示从第二条开始,第二个1为取一行数据
输出结果如下图所示: