网站免费模版代码,网站自己做需要多少钱,深圳深圳龙岗网站建设,河北省建筑人才网SQL#xff08;Structured Query Language#xff09;是结构化查询语言的简称#xff0c;它是一种数据库查询和程序设计语言#xff0c;同时也是目前使用最广泛的关系型数据库操作语言。#xff08;95%适用于所有关系型数据库#xff09; 【 SQL是关系型数据库通用的操作… SQLStructured Query Language是结构化查询语言的简称它是一种数据库查询和程序设计语言同时也是目前使用最广泛的关系型数据库操作语言。95%适用于所有关系型数据库 【 SQL是关系型数据库通用的操作语言】 在数据库管理系统中使用SQL语言来实现数据的存取、查询、更新等功能。SQL是一种非过程化语言只需提出“做什么”而不需要指明“怎么做”。 SQL语言具有集数据查询、数据操纵、数据定义和数据控制功能于一体类似自然语言、简单易用以及非过程化等特点 数据库管理人员DBA通过数据库管理系统DBMS可以对数据库DB中的数据进行操作 分页查询语句不同MySQL: limit ?, ?orcale: top 5 where 介绍MySQL数据库 mysql是一款开放源码轻量级的关系型数据库 具有体积小数据快成本低开放源码等特点 使用sql语言对数据库进行管理 一SQL语言组成部分5 DQL* 数据的查询语言查询语句的6个组成部分 DML* 数据的操作语言insert delete update DDL 数据的定义语言了解创建/删除/修改 数据库对象 DCL 数据的控制语言了解授予撤回 TCL* 事务的控制语言提交回滚 1DQL —— 数据查询语言Data Query Language 主要用于数据的查询其基本结构是使用 select 子句from 子句和 where 子句的组合来查询一条或多条数据。
1组成结构
select 字段名字段名字段名
from 表名表名表名
where 条件 and/or 条件 and/or 条件 ———— 【分组前条件判断】
group by 字段名字段名字段名————【分组】
having 条件 and/or 条件 and/or 字段名————【分组后条件判断】
order by 字段名字段名字段名————【排序】
【select 语句的执行顺序】 from--where -- group by– select - having- order by
2单表查询
【1】介绍 select 部分
查指定的部位与表内数据的顺序不关 select ename,empno from emp
查表内全部数据 select * from emp
别名——as ----- 真实案例 实体类 属性名写错了 多表查询的时候 ---改名--》deptno改成eptno
select empno,ename,job,deptno as eptno from emp ----- 真实案例 开发组 每周会议 ---写别名 as可以省略 --- 可加可不加如果别名类里面有特殊符号或者空格 必须用
select empno 员工编号,ename 员工姓名,job 岗位名称,deptno as 部门编号 from emp
简单的算术运算 ----- 查询表里所有员工的年薪是多少 忽视了奖金流程函数处补全 ---空值做任何运算结果都为空
select sal*12 年薪ename,comm from emp
去重操作
去重关键字 distinct ----- 查询员工都在哪几个部门工作
select distinct deptno from emp
select distinct job,deptno from emp; -- 对后面的所有列组合 去重 而不是单独的某一列去重介绍 order by
默认情况下是按照升序排列的 asc---升序 可以默认不写 desc---降序
select * from emp order by sal; -- 默认情况下是按照升序排列的
select * from emp order by sal asc; -- asc 升序可以默认不写
select * from emp order by sal desc; -- desc 降序
select * from emp order by sal asc ,deptno desc; -- 在工资升序的情况下deptno按照降序排列select deptno,count(*) num
from emp
where year(hiredate)1981
GROUP BY deptno
order by num,deptno desc 【2】介绍 where 部分
将过滤条件放在where子句的后面可以筛选/过滤出我们想要的符合条件的数据
关系运算符 ! (最后两个都是 不等于) -----查询入职时间在1981年的所有员工信息 select * from emp where hiredate1981-1-1 and hiredate1981-12-31 -----查寻部门编号不是30的所有员工信息
select * from emp where deptno!30 -----查询工资范围在1000--2000的所有员工信息
select * from emp where sal1000 and sal2000 -----查询经理编号是7321的所有员工信息
select * from emp where mgr7321
逻辑运算符
and or | | in———替换 or -----查寻部门编号是10或者20的所有员工信息
select * from emp where deptno10 or deptno20
select * from emp where deptno in (10,20)
空值判断 ..... where is null ————为空 ..... where is not null ————不为空 -----查询没有奖金的所有员工信息
select * from emp where comm is null
模糊查询
% 0~n位任意字符 _ 1位任意字符 ----- 查询名字第三位是a的 select * from emp where ename like __a% ----- 查询员工姓名里以A开头的员工信息
select * from emp where ename like A% ----- 查询岗位名称里带A或者带C的员工信息
select * from emp where job like %A% or %C% ----- 查询 没有奖金不是20号部门 名字里没有A的员工信息
select * from emp where comm is null and deptno!30 and ename not like %A%
小括号的使用
因为不同的运算符的优先级别不同加括号为了可读性
select * from emp where job SALESMAN or job CLERK and sal 1500; -- 先and再or and or
select * from emp where job SALESMAN or (job CLERK and sal 1500);
select * from emp where (job SALESMAN or job CLERK) and sal 1500;【3】函数
函数只是对查询结果中的数据进行处理不会改变数据库中数据表的值。使用函数可以大大提高SELECT语句操作数据库的能力同时也给数据的转换和处理提供了方便。 在sql中使用函数函数的功能封装了特定的一些功能我们直接拿过来使用可以实现对应的功能函数作用为了提高select的能力
分类 单行函数 (进去一条数据出来一条数据) 多行函数/分组函数/聚合函数进去一组数据出来一条数据
除了多行函数max,min,count,sum,avg都是单行函数
单行函数 ----- 字符串函数 拼接concat(str1,str2,。。。strn) ---查询所有 部门编号员工编号员工姓名 的员工信息
select concat(deptno,_,empno,_,ename) from emp 添加insert(str,index,n,newstr) ---查询所有 长春吉软_员工姓名 的员工信息
select ename,insert(ename,1,0,长春吉软_) from emp 总长度length(str) ---查询所有 员工姓名长度 大于5位的
select * from emp where length(ename)5
-- 仅查询了 字节数和员工姓名
select length(ename),ename from emp where length(ename)5 替换replace(str,oldstr,newstr) 获取substring(str,index,n) ---查询所有 员工姓名保留第一位和最后一位字母中间用。。。代替 SELECT REPLACE(ename,substring(ename,2,length(ename)-2),...) FROM emp
-- 拼接和获取
SELECT CONCAT(substring(ename,1,1),...,substring(ename,length(ename),1)) FROM emp; 字符串函数 函数 描述 concat(str1,str2,···strn) 将str1、str2···strn拼接成一个新的字符串 insert(str,index,n,newstr) 将字符串str从第index位置开始的n个字符替换成字符串newstr length(str)获取字符串str的长度 lower(str) 将字符串str中的每个字符转换为小写 upper(str)将字符串str中的每个字符转换为大写 left(str, n) 获取字符串str最左边的n个字符 right(str, n) 获取字符串str最右边的n个字符 lpad(str, n, pad) 使用字符串pad在str的最左边进行填充直到长度为n个字符为止 rpad(str, n, pad 使用字符串pad在str的最右边进行填充直到长度为n个字符为止 ltrim(str) 去除字符串str左侧的空格 rtrim(str) 去除字符串str右侧的空格 trim(str) 去除字符串str左右两侧的空格replace(str,oldstr,newstr) 用字符串newstr替换字符串str中所有的子字符串oldstr reverse(str) 将字符串str中的字符逆序 strcmp(str1, str2) 比较字符串str1和str2的大小 substring(str,index,n)获取从字符串str的index位置开始的n个字符 数值函数 函数 描述 ABS(num) 返回num的绝对值 CEIL(num) 返回大于num的最小整数向上取整 FLOOR(num) 返回小于num的最大整数向下取整 MOD(num1, num2) 返回num1/num2的余数取模 PI() 返回圆周率的值 POW(num,n) POWER(num, n) 返回num的n次方 RAND(num)返回0~1之间的随机数 ROUND(num, n) 返回x四舍五入后的值该值保留到小数点后n位 TRUNCATE(num, n) 返回num被舍去至小数点后n位的值 ----- 日期时间函数
dual ---虚拟表 ----- 房租一个月后到期问到期时间
select ADDDATE(NOW(),INTERVAL 1 MONTH) from dual ----- 查询所有员工试用期通过的时间
select ename,ADDDATE(hiredate,INTERVAL 3 MONTH) from emp ----- 查询所有员工里工龄超过20年的所有员工
select * from emp where (DATEDIFF(NOW(),hiredate)/365)20
select * from EMP WHERE SUBDATE(Now(), INTERVAL 20 YEAR) hiredate -- 减
select * from emp where adddate(hiredate,interval 20 year)now() -- 加 ----- 查询所有员工在1981年9月份入职的所有员工
select * from emp where year(hiredate) 1981 and month(hiredate) 9 -----查询入职时间超100天的所有员工
select DATEDIFF(NOW(),hiredate) from emp where DATEDIFF(NOW(),hiredate)100 时间与日期函数 ----- 流程函数 ----- 查询表里所有员工的年薪是多少
select sal*12 IFNULL(comm,0) 年薪 from emp ----- 查询所有员工编号姓名以及所在的部门名称单表查询
select empno,ename,
case deptno when 10 then 开发部when 20 then 测试部when 30 then 运维部when 40 then 实施部else 最后 end 部门名称 from emp 流程函数 多行函数/分组函数/聚合函数 max()—最大值 min()—最小值 avg()—平均值 sum()—求和 count()—求个数
select max(sal),min(sal),avg(sal),sum(sal),count(sal) from emp ----- 介绍 group by 和 having ----- 查询每个部门里 的最大工资最小工资平均工资
select max(sal),min(sal),avg(sal)
from emp
group by deptno ----- 查询 每个岗位的最高工资最低工资平均工资
select job,max(sal),min(sal),avg(sal)
from emp
GROUP BY job ----- 查询 1000元以上的每个工资的总人数总人数低于5个的部门不显示
select deptno,count(*) c
from emp
where sal1000
GROUP BY deptno
having c5 ----- 查询 每个经理人所带的手下员工的总人数
select mgr,count(*)
from emp
GROUP BY mgr ----- 查询 在1981年入职的各部门总人数
select deptno,count(*)
from emp
where year(hiredate)1981
GROUP BY deptno 其他函数 3多表查询
分类 内连接查询外连接查询 -- from部分 select * from emp,dept (缺少关联关系) 造成--笛卡尔积现象 15*345 内连接查询 ----- 【写法一】
select * from emp,dept where emp.deptnodept.deptno ----- inner join . . . on 【写法二】 inner join —— 内连接 on —— 通过on做两张表之间的关联查询
select * from emp inner join dept on emp.deptnodept.deptno ----- 关键字 using 【写法三】 要求两张表之间的关联列是同名的
select * from emp inner join dept using(deptno) ----- 自然连接 【写法四】 要求两张表之间的关联列 同名同类型同长度
select * from emp e natural join dept d ----- 自身内连接 一张表 ----- 例子查找每个经理的名字入职时间和工资
select distinct m.empno,m.ename,m.hiredate
from emp m,emp e
where m.empnoe.mgr
外连接查询
左外连接 右外连接 ——区分原理一个查询的SQL语句里第一个表名 叫 左表第二个表名叫 右表。 如果是内连接查询左右两个表的地位是一样的
select * from t_emp,dept where dept.deptnot_emp.deptno 如果使用左外连接查询那么左表是主表主表里的数据都会显示出来右表是子表子表里的数据只显示符合连接条件的。
select * from t_emp left join dept on dept.deptnot_emp.deptno-- 右表做主表
select * from t_emp right join dept on dept.deptnot_emp.deptno
4子查询
{没有子查询可能要执行很多次才能得到最终结果 有子查询执行一次就能拿到最终结果}
分类
不相关子查询简单 ——单行不相关子查询 ——多行不相关子查询
相关子查询 ----》存储过程 ----- 单行不相关子查询 --- 查询工资最高的员工信息
select * from emp where sal(select max(sal) from emp) --- 查询工资高于平均工资的雇员名字和工资
select ename,sal from emp where sal(select avg(sal) from emp) ----- 多行不相关子查询 any————任何 all————全部 select * from emp where salany/all(select语句) ----- 相关子查询 ---查询本部门最高工资的员工
select * from emp e
where sal (select max(sal) from emp where deptnoe.deptno)
order by deptno --- 查询工资高于其所在岗位的平均工资
select * from emp e
where sal (select avg(sal) from emp where emp.jobe.job)
order by deptno desc