首页 > 数据库 >SQL语句查询关键字

SQL语句查询关键字

时间:2022-11-25 20:57:58浏览次数:42  
标签:语句 salary name age 关键字 emp SQL post select

1.SQL语句查询关键字

1.select:指定需要查找的字段信息,eg:select *,select name。同时select也支持对字段做处理,eg:select char_length(name)。

2.from:指定需要查询的表信息,from mysql.user,from 表名。

3.SQL语句中关键字的执行顺序和编写顺序并不是一致的,例如:select id,name from userinfo;我们先写的select在写的from,但是执行的时候是先执行的from在执行select,对应关键字的编写顺序和执行顺序我们没必要过多的在意,我们只需要把注意力放在每个关键字的功能上即可。

2.前期数据准备

我们用以下表以及数据来引出今天的知识点。
create table emp(
  id int primary key auto_increment,
  name varchar(20) not null,
  gender 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
);

#插入记录
#三个部门:教学,销售,运营
insert into emp(name,gender,age,hire_date,post,salary,office,depart_id) values
('jason','male',18,'20170301','浦东第一帅形象代言',7300.33,401,1), #以下是教学部
('tom','male',78,'20150302','teacher',1000000.31,401,1),
('kevin','male',81,'20130305','teacher',8300,401,1),
('tony','male',73,'20140701','teacher',3500,401,1),
('owen','male',28,'20121101','teacher',2100,401,1),
('jack','female',18,'20110211','teacher',9000,401,1),
('jenny','male',18,'19000301','teacher',30000,401,1),
('sank','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);
"""
针对select后面的字段名可以先用*占位往后写,最后再回来修改,在实际应用中select后面很少直接写*,因为*表示所有,当表中字段和数据都特别多的情况下非常浪费数据库资源。
"""

3.查询关键字至where筛选

1.查询范围:查询id大于等于3小于等于6的数据
'''sql支持逻辑运算符'''
select * from emp where id >=3 and id <= 6;
'''或者使用between关键字,between m and n相当于 id >=m and id <=n(两端都包含)'''
select * from emp where id between 3 and 6;

2.查询薪资是20000或者18000或者17000的数据
select * from emp where salary=20000 or salary=18000 or salary=17000;
'''sql支持成员运算符'''
select * from emp where salary in (20000,18000,17000);

3.查询id小于3大于6的数据
select * from emp where id<3 or id>6;
select * from emp where id not between 3 and 6;

4.查询员工姓名中包含字母o的员工姓名与薪资
"""
条件不够精准的查询,称之为模糊查找,模糊查找的关键字是like。模糊查找的符号:
	1.%:%可以查找到任意个数的字符(包括0),eg:%o%可以查找到jason,loo,o;%o可以查找到asdhgo,o;
	2._:_可以查找到单个任意字符,eg:_o_可以查找到:aox,boe;o_可以查找到or,ok;
"""
select name,salary from emp where name like '%o%';

5.查询员工姓名是由四个字符组成的员工姓名与其薪资
select * from emp where name like '____';
select * from emp where char_length(name)=4;

6.查询岗位描述为空的员工名与岗位名
'''针对null不能用等号,只能用is'''
select name,post from emp where post_comment is NULL;
"""
在mysql中我们可以通过help 方法名的方式来学习方法的使用
"""

4.查询关键字之group by分组

1.分组:按照指定的条件将单个单个的数据组成一个个整体,比如:将班级学生按照性别分组,将全国人民按照民族分组。分组的目的是为了更好地统计相关数据。

2.聚合函数:专门用于分组之后的数据统计。max:最大值,min:最小值,sum:求和,avg:平均值,计数:count。

3.举例:将员工数据按照部门分组
select * from emp group by post;
"""
不同版本MySQLl针对上句话作出不同处理:MySQL5.6不会报错,5.7及8.0会报错,因为5.7以上版本认为最小单位就是组,而不应该再试组内单个数据单个字段,group by后面的字段名也应该写在select后面,eg:select post from emp group by post。

如果我们相对5.6最初改变实现上述效果,我们需要做以下操作:在my.ini中客户端添加以下内容:only_full_group_by。添加成功后可以看到效果会直接报错。
"""

4.获取每个部门的最高工资
'''要不要分组我们完全可以从题目的需求中分析出来尤其是出现关键字:每个 、平均'''
select post,max(salary) from emp group by post;

5.统计每个部门的部门名称以及部门下的员工姓名
select post,name from emp group by post;我们发现该结果会直接报错,因为分组以外的字段名无法直接填写,需要借助于方法。
"""
因分组以外的字段名无法填写,我们需要借助group_concat()来展示分组以外的其他字段,同时我们也可以在字段之间添加一些特殊符号来分割数据。
"""
 select post,group_concat(name,age) from emp group by post;
 select post,group_concat(name,'_NB') from emp group by post;
 select post,group_concat(name,'|',gender,'|',age) from emp group by post;

5.查询关键字之having过滤

having与where本质是一样的,都是用来对数据做筛选,只不过where用在分组之前(首次筛选),having用在分组之后(二次筛选)。

1.统计各部门年龄在30岁以上的员工平均工资,并且保留大于10000的数据。
'''先统计出年龄在30岁以上的员工数据'''
select * from emp where age > 30;
'''再将筛选出来的数据按照部门分组,并统计平均薪资'''
select post,avg(salary) from emp where age > 30 group by post;
'''针对分组统之后的结果用having再一次删选'''
select post,avg(salary) from emp where age > 30 group by post having avg(salary) > 10000;

6.查询关键字之distinct去重

表中有很多字段下有重复的数据,或者是几个字段组合起来有重复的数据,我们如果想要去重需要用到distinct关键字,distinct后面如果跟一个字段名就是一个字段名下的数据去重,跟多个字段名就是组合去重。
select distinct age from emp;
select distinct name,age from emp;

7.查询关键字order by排序

表中如果有数据需要我们进行排序的时候,可以用到order by 字段名来排序,order by后面的字段名就是排序的依据,默认升序。如果想要按照降序排列需要在后面加上desc(升序后面也有后缀,后缀为asc,但是通常情况下asc省略)。
1.单个字段排序:
select * from emp order by age;  # 默认升序
select * from emp order by age desc;  # 降序

2.多个字段排序:先按照前面的字段名排序,如果相同在按照后面的字段名排序
select * from emp order by age,salary;  
select * from emp order by hire_date,age;  # hire_date,age都按照升序
select * from emp order by age,salary desc;  # 年龄按照升序,薪资按照降序
select * from emp order by age desc,salary desc; # 年龄、薪资都按照降序

3.统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序
针对上述题目我们显然无法一次写出,我们可以将题目拆解为以下几部:
	1.找到10岁以上的员工,拿到他们的全部信息
	select * from emp where age > 10;
	2.再按照部门统计平均薪资
	select post,avg(salary) from emp where age > 10 group by post;
	3.保留平均工资大于1000的部门
	select post,avg(salary) from emp where age > 10 group by post having avg(salary) > 1000;
	4.对平均工资进行排序
	select post,avg(salary) from emp where age > 10 group by post having avg(salary) > 1000 order by avg(salary);
"""
当一条SQL语句中很多地方都需要使用聚合函数计算之后的结果 我们可以节省操作(主要是节省了底层运行效率 代码看不出来)
select post,avg(salary) as avg_salary from emp where age > 10 group by post having avg_salary>1000 order by avg_salary;
"""

8.查询关键字之limit分页

当网站数据较多时,我们无法一次全部呈现,我们需要将数据分页展示。我们能看到的大多数网站都做了分页处理,每页都只能存放固定数量的数据。下面用例子说明limit的用法。
1. select * from emp limit 5; limit后面跟一个参数时,按照顺序一次性展示5条数据。

2.select * from emp limit 3,5; 后面跟两个参数时,表示从第4条数据开始展示,展示5条数据。

3.查询工资最高的人的详细信息:

select * from emp order by salary limit 1 order by salary;(limit限制条件必须放在order by 后面)

9.查询关键字之regexp正则表达式

SQL语句的模糊匹配如果用不习惯 也可以自己写正则批量查询
	select * from emp where name regexp '^j.*(n|y)$';

10.多表查询的思路

表数据准备
create table dep(
  id int primary key auto_increment,
  name varchar(20) 
);

create table emp(
  id int primary key auto_increment,
  name varchar(20),
  sex enum('male','female') not null default 'male',
  age int,
  dep_id int
);

#插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营'),
(205,'财务');

insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('dragon','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204);

上述两个表格分别如下,我们的初衷是把它们合在一起,让第一个表格的dep_id和第二个表格的部门名称name对应,但是却出现了图2的效果:

涉及到两张表对应时,字段很容易冲突,针对上述情况我们称之为'笛卡尔积'。解决笛卡尔积的办法是我们在字段前面加上表名来指定。
select * from emp,dep where emp.dep_id=dep.id;

标签:语句,salary,name,age,关键字,emp,SQL,post,select
From: https://www.cnblogs.com/zkz0206/p/16926315.html

相关文章

  • Mac安装MySQL详细教程
    1、MySQL安装包下载还没下载的话请前往官网下载我们可以看到这里有两个不同架构的dmg的安装包,如果不知道自己电脑是ARM还是X86的话可以打开终端输入:uname-a或者uname......
  • SQL语句查询关键字
    今日内容概要SQL语句查询关键字selectfromwheregroupbyhavingdistinctorderbylimitregexp多表查询的两种方式子查询连表查询今日内容详细SQL......
  • MySQL查询关键字
    SQL语句查询关键字前期数据准备编写SQL语句的小技巧查询关键字之where筛选查询关键字之groupby分组查询关键字之having过滤查询关键字之distinct去重......
  • MySQL单表查询完整语法
    MySQL单表查询完整语法数据按一定结构存入表中,应该能够按照我们的意愿增删改查,而查这一步,我们最基础的语法是:select*from表名查找某张表的所有字段的所有数据select......
  • 查询关键字
    SQL语句查询关键字数据准备createtableemp(idintprimarykeyauto_increment,namevarchar(20)notnull,genderenum('male','female')notnulldefault'ma......
  • SQL语句查询关键字
    目录SQL语句查询关键字selectfrom编写顺序和查询数据前期数据准备编写SQL语句的小技巧查询关键字之筛选where逻辑运算符notandorbetweennotbetween成员运算符in模糊......
  • day41MySQl基础(04)
    SQL语句查询关键字selectfromwheregroupbyhavingdistinctorderbylimitregexp多表查询的两种方式子查询连表操作报错及作业讲解报错 1.粗心大意单词拼......
  • MySQL 4 查询关键字
    今日内容详细SQL语句查询关键字selecct指定需要查询的字段信息select*查所有字段selectname查name字段selectchar_length(name)支持对字段做处理from指定需......
  • JPA自定义函数关键字
     SpringBoot从入门到精通(二十七)JPA实现自定义查询,完全不需要写SQL!-阿里云开发者社区(aliyun.com)关 键 字示例方法JPQL语句AndfindByLastnameAnd......
  • 一条SQL查询语句是如何执行的?总结
    学习《MySQL实战45讲》丁奇--第一篇|基础架构:一条SQL查询语句是如何执行的?总结版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明......