数据库笔记

       数据库
1.简单查询: 
			1.1-- 查询emp表(员工表)信息
					select * from emp

			1.2-- 查询员工编号 7369 
               -- 选择(行)
			   -- 写查询时 * 等价于所有的列名
					select * from emp where empno=7369
					select empno,ename,job,mgr,hiredate,sal,comm,deptno
					from emp where empno=7369

			1.3-- 查询员工信息 先显示 ename 在显示员工编号及其他信息
					select ename,empno,job,mgr,hiredate,sal,comm,deptno from emp

			1.4-- 查询emp表中 所有的员工姓名 
			   -- 投影(列)
					select  ename from emp 

			1.5-- 查询emp 表中 ename sal 投影
					select ename,sal from emp

			1.6-- 查询那一列的信息  select  列明/*
				-- 数据来源  from 表名
				-- 子句 select *      子句2  from dept ------》组成一个查询语句
				-- mysqle  查询 不区分大小写(关键字大写 其他小写)
				-- 建议多行书写
				-- 查询 emp 表信息 
				-- 只查询你emp表中的 姓名 工资 列的信息
					SELECT ename,sal from emp
				
			1.7	-- 要求查询 姓名 工资 工资涨200
					select ename,sal+200 from emp 

			1.8-- null  有没有激活   0  激活了但是为0 在算数运算中如果数据为null计算结果也为null
				-- 用 ifnull 来解决 运算问题 ifnull (列,如果为空的取值)
					select ename,sal,comm,sal+comm,sal+ifnull(comm,0) from emp

			1.9	-- 用ifnull 来解决null 运算问题 ifnull(expr1,expr2)
				-- ifnull 如果 expr1 为空 则获得expr2的值,如果不为空 则还是取expr1的值
				-- 其别名 用空格或者as  如果有特殊字符,使用""
					 select ename,sal,comm sumal,sal+comm,sal+ifnull(comm,0) sunal2 from emp
					 select ename,sal,comm AS sumal,sal+comm,sal+ifnull(comm,0)as sunal2 from emp

			1.10-- 查询员工部门中  部门编号 不能重复
				-- 去重使用 DISTINCT 关键字
					select  distinct deptno from emp

			1.11-- 显示表结构 desc emp
					desc emp

			1.12-- 加限定条件 where 子句
				-- 查询10部门员工信息
				-- 查询员工信息-------10部门的
					select *
					from emp where deptno=10

			1.13-- 条件:比较操作符 = < > <= >= 不等于:  !=或 <>
				-- 条件为区间 可以使用 between and  也可以使用 >= and <= 来控制
				-- 条件多个且相等时 为 或or 条件 相连时 可以使用in 
					select * from emp where deptno in(10,20) 

			1.14-- 模糊查询   like 通配符 %
				-- %  匹配0个或者多个任意字符
				-- _匹配1个 任意字符   
				-- 查询首字母为s 开头的  // s 结尾的
					select * from emp where ename like 's%'
					select * from emp where ename like '%s'

			1.15-- 查询 第二个字母是A 的  使用下划线代表一个字符
					select * from emp where ename like '_A'

			1.16-- 使用escape 来实现对_%转义(字符本身)
				-- 查询员工姓名中有_的员工名称
					select * from emp where  ename like '%@_%' escape '@'-- 这里@符号相当于转义字符

			1.17-- 判断是否为null   使用 is null 
				-- 查询comm 奖金 为null 员工信息
					select * from emp where comm is null

			1.18-- not  取反 取非 and 优先级大于or 

			1.19-- 排序问题 order by (从低到高排列)
					select * from emp ORDER BY sal
			   -- 排序问题 order by --desc (从高到底排序)
					select * from emp ORDER BY sal desc

2.分页查询(限制记录行数)
			
			-- 分页查询 (限制记录行数)
			-- 每页m数据,显示第n页数据
			2.1-- limit k1,k2  k1:从第几条数据开始查询  k2:显示几条数据
				select *from emp limit 0,3
			2.2-- 查询第n页,每页显示m条数据
				SELECT * FROM emp LIMIT (n-1)*m,m   规律
			2.3-- 查询工资 最高三个人的信息
				SELECT * FROM emp ORDER BY sal DESC LIMIT 0,3
			-- union    union all
			2.4-- A集合前五条数据 
				SELECT ename,hiredate,deptno FROM emp LIMIT 0,5 
			2.5-- B集合第四到第八条数据
				SELECT ename,hiredate,deptno FROM emp LIMIT 3,8
			-- A与B 相同的数据 相交共有部分取一次
				(SELECT ename,hiredate,deptno FROM emp LIMIT 0,5 )
				UNION
				(SELECT ename,hiredate,deptno FROM emp LIMIT 3,8)
			-- A与B 相同的数据 相交共有部分取两次
				(SELECT ename,hiredate,deptno FROM emp LIMIT 0,5 )
				UNION ALL
				(SELECT ename,hiredate,deptno FROM emp LIMIT 3,8)

			-- 函数概述
			2.6-- ABS(x) 函数 返回值x绝对值
				SELECT ABS(-5)
			2.7-- 返回余数 取模 MOD(N,M)返回n被m除的余数  正负号取决于前面的参数
				SELECT MOD(10,3)
			2.8-- CEIL(X),CEILING(X):返回大于或者等于x的最小整数
			2.9-- FLOOR(X):返回小于或者等于x的最大整数
				SELECT CEIL(0.5),CEILING(1.5),FLOOR(0.5)
			2.10-- ROUND(X):四舍五入     TRUNCATE(X,D):直接截断
				SELECT ROUND(11.256,2),TRUNCATE(11.256,2)
			2.11-- 随机数(0,1]   rand()
				SELECT RAND()
			2.12-- SIGN(X) x的值为负,零或正时 返回 结果 -1,0,1
			2.13-- CHAR_LENGTH(str) 返回字符长度   LANGUAGE  返回字节长度
				SELECT CHAR_LENGTH("中国"),LENGTH("中国")
			2.14-- CONCAT(str1,str2,...) (有空显示空null) 字符串的拼接 
			2.15-- CONCAT_WS(separator,str1,str2,...) (有空被忽略)
				SELECT CONCAT("nihao ","12354")
				SELECT CONCAT(ename,sal) from emp
				SELECT CONCAT_WS(",",ename,sal) FROM emp
			2.16-- INSERT(str,pos,len,newstr)  字符串替换 将字母asd 换成后面一长串数字
				SELECT INSERT("asdfgg",1,3,"12345678")
			2.17-- LOWER(str) LCASE(str) 将字符串str 中的字母字符全部转换成小写
			2.18-- UPPER(str) UCASE(str) 将字符串str 中的字母字符全部转换成大写
			2.19-- LEFT(s,n)返回字符串s开始的最左边n个字符
			2.20-- RIGHT(s,n)返回字符串s最右边n字符
			2.21-- LPAD(s1,len,s2)返回字符串s1其左边由字符串s2填补到len字符长度
			2.22-- RPAD(s1,len,s2)返回字符串s1其右边由字符串s2填补到len字符长度
			2.23-- LTRIM(s)返回字符串 删除左侧空格符
			2.24-- RTRIM(s)返回字符串 删除右侧空格符
			2.25-- TRIM(s1)返回字符串 删除左右侧空格符  TRIM( "*" FROM "**tom**")
			2.26-- REPLACE(a,s,d):将a字符串中的s字符替换成d
			2.27-- STRCMP(a,s):比较字符串大小 相同返回0 a<s返回-1 其他情况返回1
			2.28-- SUBSTRING(s,n,len):字符串截取 n起始位 len 长度
			2.29-- LOCATE(substr,str),POSITION(substr IN str),INSTR(str,substr)
				SELECT LOCATE("tom","my name is tom")
			2.30-- ELT(N,str1,str2,str3,...)返回第几个字符串
				SELECT ELT(2,"aaaa","bbbb","cccc")
			-- 时间函数
			2.31-- CURDATE(),CURDATE()+0, CURRENT_DATE() 日期
				SELECT CURDATE(),CURRENT_DATE(),CURDATE()+0
			2.32-- CURRENT_TIME()  	时间   NOW()日期时间
				SELECT CURRENT_TIME(),NOW()
			2.33-- UTC_DATE(),UTC_TIME()
				SELECT UTC_DATE(),UTC_TIME()
			2.34-- TIMEDIFF(expr1,expr2),DATEDIFF(expr1,expr2)时间差
				SELECT TIMEDIFF("13:49:00","13:48:00"),DATEDIFF("2019-11-15","2019-01-01")
			2.35-- DATE_ADD(date,INTERVAL expr unit):时间的加减
				SELECT DATE_ADD(now(),INTERVAL 30 MONTH)
			2.36-- 提取当前时间
				SELECT NOW(),DATE(now()),TIME(NOW())
			-- 提取时间
				SELECT EXTRACT(YEAR FROM NOW())
			-- 提取时间
				SELECT DAYOFWEEK(NOW()),DAYNAME(NOW()),DAYOFMONTH(NOW())
			2.37-- 解决时间显示万能方法 时间日期格式化函数 按照用户的想法
			-- DATE_FORMAT(date,format)
				SELECT DATE_FORMAT(NOW(),'%H:%i:%S')
			-- 流程控制函数 
			2.38-- 查询员工的工资 规定输出等级 
				SELECT sal,CASE 
				WHEN sal>=700 AND sal<=1200 THEN '等级1'
				ELSE '啥也不是'END
				FROM emp
			2.39-- 判断部门 10会计 20调研 30销售 40 运营 其他输出错
				SELECT ename,deptno,
				CASE deptno
				WHEN 10 THEN '会计'
				WHEN 20 THEN '调研'
				WHEN 30 THEN '销售'
				WHEN 40 THEN '运营'
				ELSE '错'END
				FROM emp
			2.40-- if(表达式,结果1,结果2)如果表达式为真true 输出结果1 false 输出假
				SELECT sal,if(sal>1200,'高收入','低收入')
				FROM emp
				SELECT IFNULL(comm,0),if(comm is null,0,comm)FROM emp
			2.41-- MD5(str)  数据加密
				SELECT 123456,MD5('123456')

3.多表连接:
            -- 多表连接 
			3.1-- 笛卡尔积(交叉连接)
				SELECT *
				FROM emp,dept
			3.2-- 等值连接
				SELECT *
				FROM emp,dept
				WHERE emp.deptno=dept.deptno
				SELECT emp.*,dept.*
				FROM emp,dept
				WHERE emp.deptno=dept.deptno
			3.3-- 两个表中 数据列明相同时 可能出现歧义时 使用表名前缀,区分不同表的列
			-- 推荐使用
				SELECT emp.empno,ename,emp.DEPTNO,dept.deptno ,dept.DNAME
				FROM emp,dept
				WHERE emp.deptno=dept.deptno
			3.4-- 给表起别名 FROM 后表名后 添加别名就可 
			-- 注意(mysql中起别名后 要用别名来控制列 不能够用原名)
				SELECT *
				FROM employeeinfomationtable t1,dept t2
				WHERE t1.deptno=t2.deptno AND t1.deptno=10
			3.5-- 非等值连接
			-- 查询员工信息及工资等级
				SELECT *
				FROM emp,salgrade
				WHERE emp.sal BETWEEN salgrade.LOSAL AND salgrade.HISAL
			-- 自身连接
			-- 查询每个员工的姓名和直接上级姓名 --empno,ename,mgr,ename
			3.6-- 可以抽象成两个表
				SELECT t1.empno,t1.ename,t2.empno,t2.ename
				FROM emp t1,emp t2
				WHERE t1.mgr=t2.empno

			-- SQL99 标准
				SELECT * FROM emp,dept
			3.7-- 交叉连接 CROSS JOIN
				SELECT * FROM emp cross JOIN dept
			3.8-- 自然连接 NATURAL JOIN 自然而然的就连接了 找列明相同 数据类型相同的列 进行等值连接
				SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno
				SELECT * FROM emp NATURAL JOIN dept
			3.9-- USING 子句 USING(列名) 两个表中相同的列
				SELECT * from emp join dept USING (deptno)
			3.10-- on 子句 (表连接语句 )
				SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno
				SELECT * FROM emp JOIN dept ON(emp.deptno=dept.deptno)
			3.11-- RIGHT OUTER JOIN(右外连接,将右边的表全部显示出来)
			3.12-- LEFT OUTER JOIN(左外连接,将左边的表全部显示出来)
				SELECT * FROM emp RIGHT JOIN dept ON(emp.deptno=dept.deptno)

			-- 分组函数
			3.13-- 查询 员工工资最高,最低 工资是多少
				SELECT MAX(sal),MIN(sal) FROM emp
			3.14-- 查询 每个月 工资支出综合多少钱
				SELECT SUM(sal) FROM emp
			3.15-- 查询 平均工资多少钱
				SELECT AVG(sal )FROM emp
			3.16-- 查询公司有多少人
				SELECT COUNT(empno) FROM emp
			3.17-- 查询奖金不为空 多少人
				SELECT COUNT(comm) FROM emp
				SELECT COUNT(*)FROM emp
			3.18-- 查询入职日期最早 入职日期最晚的员工信息
				SELECT MIN(hiredate),MAX(hiredate) FROM emp
			3.19-- DISTINCT 对查询结果去重 在查询个数
				SELECT COUNT(DISTINCT deptno)FROM emp
			3.20-- 查询平均奖金数 奖金总和
				SELECT AVG(ifnull(comm,0) ),SUM(comm) FROM emp
			-- 分组语句  GROUP BY
			3.21-- 求各部门的平均工资,按照部门进行分组
			-- 在分组语句中 规定:select 子句中的列 要么是分组函数,要么是group by 后面出现过的列名
				SELECT avg(sal),deptno FROM emp GROUP BY deptno
			3.22-- 每个岗位的工资总和
				SELECT job,SUM(sal)FROM emp YGROUP B job

			3.23-- 查询 部门最高工资高于2500 的部门信息及 最高工资
			3.24-- 分组函数不能写在 where 条件里
			-- 分组后条件限制 使用having 子句
				SELECT deptno,MAX(sal)
				FROM emp
			3.25-- WHERE MAX(sal)>2500
				GROUP BY deptno
				HAVING MAX(sal)>2500

			-- SELECT 语句执行过程:
			-- 1.通过from 子句找到需要查询的表
			-- 2.通过where子句进行非分组函数筛选判断
			-- 3.通过group by 子句完成分组操作
			-- 4.通过having 子句完成组函数的筛选判断
			-- 5.通过select子句选择显示的列或表达式及组函数
			-- 6.通过order by 子句进行排序操作
			-- 7.limit 分页

			-- 组合
			3.26-- 主查询语句 内包含 子查询语句----子查询
			-- 子查询会优先执行 结果放置到 我们的主查询中
			-- 即  子查询执行顺序优先于主查询
				SELECT *
				FROM emp
				WHERE sal>(SELECT sal FROM emp WHERE ename='Jones')
			3.27-- 查询工资最低的成员姓名
				SELECT ename,sal 
				FROM emp,
				WHERE sal=(SELECT MIN(sal) FROM emp )

			3.28-- 查询 各部门 平均工资比全体员工平均工资高的部门编号及部门平均工资
				SELECT deptno,avg(sal)
				FROM emp
				GROUP BY DEPTNO
				HAVING avg(sal)>(SELECT avg(sal) FROM emp)
			3.29-- 单行子查询 不能返回多行数据(运算符都是单行子查询)
			-- 多行子查询 判断相等用in 
				SELECT empno,ename,sal
				FROM emp
				WHERE sal in(SELECT MIN(sal) FROM emp GROUP BY deptno)
			3.30-- ANY 任意一行
			-- =ANY 等于任意一个 与in 等价
			-- >ANY 大于任意一个  大于最小的
			-- <ANY 小于任意一个  小于最大的
			-- 查询部门编号不为10,且工资比10部门任意 一名员工工资高的员工编号,姓名,职为
				SELECT empno,ename,job,sal
				FROM  emp WHERE deptno!=10 AND sal>ANY(SELECT sal FROM emp WHERE deptno=10)
			3.31-- ANY 每一行
			-- >ANY 每一个都大于 大于最大的
			-- <ANY 每一个都小于 小于最小的
			-- 查询部门编号不为20,且工资比20部门所有员工工资高的员工编号,姓名,职位
				SELECT empno,ename,job,sal
				FROM emp WHERE deptno!=20 AND sal >ANY (SELECT sal FROM emp WHERE deptno=20)
			3.32-- 查询不是经理的员工姓名
			-- 当数据中存在为 null 的值与 not in 连用 返回结果为 null
			-- 使用 IFNULL(expr1,expr2) 解决空值问题
				SELECT ename 
				FROM emp WHERE empno NOT in	(SELECT IFNULL(mgr,0) FROM emp)













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值