因为查询操作内容较多,所以我们将其分为两部分你进行讲解。首先,查询语言又叫做DQL,即Data Query Language(数据查询语言)。我将其分为七部分,今天我们主要讲解前五部分:
语言分类 | 、难度 |
---|---|
基础查询 | level 0 |
条件查询 | level 1 |
排序查询 | level 1 |
分组查询 | level 1 |
分页查询 | level 2 |
带有函数的查询 | level 2 |
子查询 | level 2 |
联合查询 | level 3 |
首席最重要的是建表大家可以网上赵相关内容进行建表
基础查询
--最简
select * from 表名;
--eg 查询employees表中的全部内容
select * from employees;
--eg 查询employees表中的部分内容
select min_salary from
条件查询
在where后可以用的基础常用运算符
内容 | 符号 |
---|---|
大于等于 | >= |
小于等于 | <= |
大于或大于等于 | > |
小于或大于等于 | < |
不等于 | !=或<> |
不包含或包含 | not in()或in() 用于比较是否在其中 |
为空或不为空 | is null或 is not null 比较为空或不为空 |
是否在a和b之间 | between a and b |
逻辑与 | and |
逻辑或 | or |
模糊查询 | like |
#eg查询员工工资低于2500的的全部信息
select * from employees where salary<2500;
#between and
#查询员工编号在100到120之间的员工信息
select empname from employees where emp_id between 100 and 120;
#等同于
select empname from employees where emp_id>= 100 and emp_id<=120;
# is null或 is not null
查询新来的员工为(设,新来的员工没工资故工资栏位空,老员工有工资,故工资栏位不空)
select empname from employees where salary is null;
#等同于
select empname from employees where salary <=> null
#<=> 安全等与 可以判断null 可读性不高 一般不使用
查询降薪的员工为
select empname from employees where salary is not null;
#in 筛选emp_id是in()里面的数据的行
select empname from employees where emp_id in(100,101,102,103);
#and 必须符合所以筛选条件的语句如
select empname from employees where emp_id>= 100 and emp_id<=120;
#与之类似的or 只要符合一个筛选条件就行,如下emp_id<100的或者emp_id>120的数据
select empname from employees where emp_id<100 and emp_id>120;
排序查询
接下来是排序查询 主要有两个 desc(descend)降序 asc(ascend)升序
#eg 根据工资对于employees进行降序排序(排序会直接去null 再排序显示)
#select 显示列 from 表名 order by 列名 升序or降序;
select salary from employees order by salary desc;
#eg 加入筛选 emp_id<100 数据进行排序
select salary from employees where emp_id<100 order by salary desc;
#eg 先按照salary降序,若有salary值相同,再按照employee_id降序
select salary from employees order by salary desc,employee_id desc;
#eg 先按照salary降序,若有salary值相同,,在salary值相同的情况下,按照employee_id升序
select salary from employees order by salary desc,employee_id asc;
分组查询
故名思意,将选定列的值相同的为一组
这个内容将在聚合函数方面再详细讲解
#eg 根据工作类型进行分类并统计每个类型的工作的人数
select count(*),job_id from employees Group by job_id;
分页查询
mysql分页主要用到的函数时limit函数,而sqlserver则没有limit函数,所以sqlserver通过top或者row—_number()来实现
SELECT 查询列表 FROM 表
【join type join 表2
on 连接条件
where 筛选条件
GROUP BY 分组字段
having 分组后的筛选
order by 排序的条件 】
limit 【offset,】size;
offset要显示目的起始索引 ,若省略则默认起始索引从0开始
size 要显示的条目数
如要第一到五条数据则limit 0,5
如要第10到15条数据则limit 9,6
注意mysql8.0改为 limit…offset…
故如要第一到五条数据则limit 5 offset 0;
如要第10到15条数据则limit 6 offset 9;
【】内根据要求可选可不选
若每页10条数据则
要查询页 limit (要查询页-1)*10,10;
公式:要查询页 limit (page-1)*size,size;
带函数的查询 (这一部分较多,不一一举例)
常见函数
length empname的字节个数
LENGTH(empname)
concat()拼接字符
UPPER(‘’)小写变大写
LOWER(‘’)大写变小写
姓变大写名变小写再拼接
select CONCAT(UPPER(‘first_name’),LOWER(‘last_name’)) from
substring
SELECT SUBSTR(‘晚来天欲雪,能饮一杯无’,7) out_put from employees; //能饮一杯无
截取第7个以后的内容(从杨字开始)
SELECT SUBSTR(‘能饮一杯无’,1,3) out_put from employees;#第一到第三个字 能饮一
SELECT INSTR(‘晚来天欲雪,能饮一杯无’,‘雪,’) AS out_put from employees;
trim
去前后空格
SELECT TRIM(‘a’ FROM ‘asasasasaaaa’) AS out_put from employees;
#去掉前后a变为sasasas
#lpad左填充 rpad 右填充
lpad(‘sdaa’,2,‘&’) AS out_put;
若不够则填充,若够则不填充
#replace 替换
REPLACE(‘thkasjdhkasjd’,‘t’,‘d’)将t换成d
数学函数
round 四舍五入
round(-2.3)-2先数字四舍五入再加正负号
round(2.34567,3)保留三位小数
ceil 向上取整,返回>=该参数的最小整数
floor 向下取整
truncate 截断
truncate(1.6328947,1)//1.6
truncate(1.6328947,2)//1.63
mod 取余
MOD(10,3)==10%3
MOD(10,3)等同于10%3等同于a-a/b*b
日期函数
now()返回当前系统日期+时间
curdate()返回当前系统日期
curtime()返回当前时间
获取指定部分
SELECT YEAR(now())获取年
SELECT MONTH(now())获取月
#查询邮箱中包含a字符的,每个部门的平均工资
select AVG(salary),department_id from Employees where email Like ‘%a%’ GROUP BY
#查询每个领导手下的员工的最高工资
select Max(salary),manager_id from Employees where commission_pct is null Group BY manager_id;
#查询那个部门的员工个数大于2
#1查询每个部门的员工个数
select count(),department_id from Employees group BY department_id;
#2 根据1的结构进性筛选,查询那个部门的员工发个数>2
select count(),department_id from Employees group BY department_id having count(*)>2;
#查询每个工种有奖金的员工的最高工资
select Max(salary),job_id from Employees where commission_pct is not null group by job_id having max(salary)>12000 ;
#分组函数做条件肯定放在having中
子查询
子查询可以分为一下三类即
标量子查询(只有一行一列)
表子查询(只有多行多列)
列子查询(只有多行一列)
行子查询 (只有一行多列)
子查询出现的位置是:
select后面 标量子查询
from 表子查询
where | having 标量子查询|列子查询|行子查询
exists后面表子查询
举个简单的例子
select * from 表1
这方面比较简单,所以给大家举个例子
select 表一的列名 from 表1 where 表1的a列需要符合的部分 in ( select 表2的某列 from 表2 where筛选条件)比如表1的会员号要属于表2的查询的返回的数据里面
联合查询(连接查询)/span>
分sql92和sql99语法
这部分后面会重新编辑,大家可以看自己需要的前面的部分
#内连接
#外连接
#交叉连接
sql99语法
select 查询列表 from 表1 别名 【连接】 join 表2 别名 on 连接条件 【where 筛选条件】 【group by 分组】 【having 筛选条件】 【order by 排序条件】
内连接 :inner
外连接 左外left【outer】 右外 right【outer】 全外 full【outer】 交叉连接 cross
eg
–内连接
select 查询列表 from 表1 别名 inner join 表2 别名 on 连接条件 【where 筛选条件】 【group by 分组】 【having 筛选条件】 【order by 排序条件】
–查询员工名 部门名
SELECT last_name,department_name FROM employees e INNER JOIN departments d ON e.department_id=d.department_id;
SELECT last_name,department_name FROM departments d INNER JOIN employees e ON e.department_id=d.department_id;
非等值连接
查询员工的工资级别
SELECT salary,gradel_level FROM employees e JOIN on e.salary BETWEEN g.lowest_sal AND g.hignest_sal;
自连接
外连接
若符合筛选则连接,不符则null
外连接 交集
相当于内连接的结果+表1中没有但表2中有的+表2中没有但表1中有的 相当于并集
交叉连接
笛卡尔积 cross join