–
使用oracledemonew表进行练习
– 查询数据
– select 列名列名 from 表名
– *代表所有列,直接写所有列效率高
– 显示全表所有列
SELECT * FROM emp;
– 显示需要的列
SELECT ename,job FROM emp;
– 条件查询
/*就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
=、!=、<>、<、<=、>、>=;
BETWEEN…AND;
IN(set);set代表集合一串数据其实其的作用和OR一样
IS NULL;
AND; &&
OR; ||
NOT; !
*/
SELECT * FROM emp;
– 查询员工编号位1001的员工
SELECT * FROM emp WHERE empno = 1001;
– 查询所有文员
SELECT * FROM emp WHERE job = ‘文员’;
– 查询工资超过10000的员工
SELECT * FROM emp WHERE sal >= 10000;
– 查询工资大于10000的文员
SELECT * FROM emp WHERE sal >= 10000;
– 查询所有的分析师和文员
SELECT * FROM emp WHERE job = ‘文员’ OR job = ‘分析师’;
SELECT * FROM emp WHERE job IN(‘文员’,‘分析师’);
– 查询工作在10000-13000之间的员工信息
SELECT * FROM emp WHERE sal>= 10000 AND sal <= 13000;
– between and 包含临界点不可手动设置,上面的可以,使用BETWEEN 小 AND 大
SELECT * FROM emp WHERE sal BETWEEN 10000 AND 13000;
– in
SELECT * FROM emp WHERE job=‘文员’ OR job=‘分析师’
SELECT * FROM emp WHERE job IN (‘文员’,‘分析师’);
– is null
– 查询没有奖金的员工
SELECT * FROM emp WHERE comm IS NULL;
– 查询有奖金的员工,0不为null也会进入判断
– 第一种方式是直接判断不为空
SELECT * FROM emp WHERE comm IS NOT NULL;
– 第二种方式是是将comm IS NULL 取反的意思,更好理解
SELECT * FROM emp WHERE NOT (comm IS NULL);
SELECT * FROM stu;
– 查询性别为女,并且大于20的记录
SELECT *
FROM stu
WHERE gender=‘女’ AND age>20;
– 查询学号为1,或者姓名为李永的记录
SELECT * FROM stu WHERE sid=1 OR sname=‘李永’;
– 查询学号为1,2,3的记录
SELECT * FROM stu WHERE sid=1 OR sid=2 OR sid=3;
SELECT * FROM stu WHERE sid IN (1,2,3);
– 查询学号不是1,2,3的记录,关于NOT的使用可以直接跟在WHERE后面进行相反条件
SELECT * FROM stu WHERE NOT (sid=1 OR sid=2 OR sid=3);
SELECT * FROM stu WHERE sid!=1 AND sid!=2 AND sid!=3;
SELECT * FROM stu WHERE sid NOT IN (1,2,3);
SELECT * FROM stu WHERE NOT (sid IN (1,2,3));
– 查询年龄在21到23之间的学生记录
SELECT * FROM stu WHERE age BETWEEN 21 AND 23 ;
– 查询性别非男的学生记录,关于NOT的使用可以直接跟在WHERE后面进行相反条件
SELECT * FROM stu WHERE gender!=‘男’;
SELECT * FROM stu WHERE gender<>‘男’;
SELECT * FROM stu WHERE NOT gender=‘男’;
– 模糊查询
mysql中只能简单的模糊,所以更多的功能在JAVA中的正侧进行
– like+通配符,而不是使用=号
– %任意个字符
– _任意一个字符
– 使用=号只能查询到指定值得
SELECT * FROM stu WHERE sname=‘王%’;
– 查询姓王的人
SELECT * FROM stu WHERE sname LIKE ‘王%’;
– 查询姓王,并且名字是两个字的人
SELECT * FROM stu WHERE sname LIKE ‘王__’;
– 姓名总共三个字的人
SELECT * FROM stu WHERE sname LIKE ‘___’;
– 第二个子必须是小,后面任意
SELECT * FROM stu WHERE sname LIKE ‘_小%’;
– 名字中有小字,位置任意
SELECT * FROM stu WHERE sname LIKE ‘%小%’;
– 去除重复记录关键字DISTINCT
– 查询所有职位名称
SELECT * FROM emp;
SELECT job FROM emp;
SELECT DISTINCT job FROM emp;
– 查看雇员的月薪与佣金之和
– 导出数据
– 第一种方式直接加会null和数字相加会返回null
SELECT ename,sal,comm,sal+comm FROM emp;
– 解决此问题直接使用流程函数中的IFNULL(需要替换的值,替换值)
SELECT sal,IFNULL(comm,0) AS ‘总工资’ FROM emp;
– 上方也演示了取别名的功能,AS可以省略
– 数据库函数,类似java中的方法,
– mysql没有类和对象的概念,函数直接调用
– 数学函数,日期函数,字符函数,见笔记本相关函数的介绍
– 日期函数
– 返回当前时间"YYYY-MM-DD"
SELECT CURDATE();
– 返回当前时间设置时间的年
SELECT YEAR(‘2000-1-1’);
– 返回当前时间的年
SELECT YEAR(CURDATE());
– 返回当前时间的月
SELECT MONTH(CURDATE());
– 返回当前的时间,带时分秒
SELECT NOW();
SELECT SYSDATE();
– 时间的的加减,DATE_ADD(时间,INTERVAL 可正可负 单位) YEAR MONTH DAY
SELECT DATE_ADD(CURDATE(),INTERVAL 2 YEAR);
SELECT ADDDATE(CURDATE(),5);
– 字符函数
– 链接函数CONCAT(s1,s2,s3),如果其中一个是NULL,则返回NULL
SELECT CONCAT(‘aaa’,‘bbb’,‘cccc’);
– 链接函数CONCAT_WS(’-’,s1,s2,s3),中间加入链接符号
SELECT CONCAT_WS(’-’,‘aaa’,‘bbb’,‘cccc’);
– LOWER(str)将字符串全部转换成小字母,UPPER(str)全部转换成大写
SELECT LOWER(‘ASdsd’);
SELECT UPPER(‘ASdsd’);
– LENGTH(‘dsadsa’)返回字符串长度
SELECT LENGTH(‘dsadsa’);
– 删除空格LTRIM(str)去除左空格,RTRIM(str)去除左空格,TRIM(str)去除左右空格
SELECT TRIM(’ dsadas’);
– 替换函数 REPLACE(字符串,需要被替换成,替换字段)
SELECT REPLACE(‘dsa-dsadsa-dsa’,’-’,’*’);
– 截取字符串SUBSTRING(字符串,起始位置,长度)同SUBSTR()方法,注意mysql中的字符串从下标1开始
SELECT SUBSTRING(‘12345’,1,2);
– JAVA中的SUBSTRING,JS中的SUBSTRING的不同处。
– LEFT(str,len),RIGHT(str,len)分别从左右截取字符串
SELECT LEFT(‘12345’,2);
SELECT RIGHT(‘12345’,2);
– 其他
SELECT UUID();-- 32位16进制数,根据硬件和时间产生永远不会重复
– 加密等
SELECT MD5(‘aaa’);
– 排序
– 按照工资升序排列
– asc(ascending):默认升序,可以省略
– desc(descending):降序排列
SELECT * FROM emp ORDER BY sal;
SELECT * FROM emp ORDER BY sal ASC;
SELECT * FROM emp ORDER BY sal DESC;
– 可以指定多列排序参考
– 工资升序排列,工资相同按照入职日期降序排列
SELECT * FROM emp ORDER BY sal ASC,hiredate DESC;
– 对10部门的员工按照工资升序排列
SELECT *
FROM emp
WHERE deptno=10
ORDER BY sal ASC;
– order 关键字冲突
CREATE TABLE order
(
id INT ,
NAME VARCHAR(10)
);
SELECT * FROM order
– 聚合函数
/*
聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
*/
– count:统计记录的条数
– 参数一般使用*,或者使用主键列,
– 如果指定的列中有null数据,不统计
SELECT * FROM emp;
SELECT COUNT() FROM emp;
SELECT COUNT() FROM emp WHERE deptno=10;
SELECT COUNT(empno) FROM emp;
– 统计有奖金的人数
SELECT COUNT(comm) FROM emp;
SELECT COUNT(*) FROM emp WHERE comm IS NOT NULL;
– 统计总工资
SELECT SUM(sal) FROM emp;
– 统计平均资,不会计算为NULL的数据,和前面的两列数字相加不一样,数字加NULL会为NULL
SELECT AVG(comm) FROM emp;
SELECT SUM(comm)/COUNT(comm) FROM emp;
– 统计最高工资
SELECT MAX(sal) FROM emp;
– 统计最低工资
SELECT MIN(sal) FROM emp;
SELECT SUM(sal),AVG(sal),MAX(sal),MIN(sal) FROM emp;
– 分组查询:聚合函数+group by
– 统计每个部门有多少人
– 第一种方式很麻烦
SELECT COUNT() FROM emp WHERE deptno=10;
SELECT COUNT() FROM emp WHERE deptno=20;
SELECT COUNT() FROM emp WHERE deptno=30;
– 使用分组会更快捷
SELECT COUNT() FROM emp;
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;
– 统计男生女生的总人数
– 方式一是正确查询的方式
SELECT COUNT() FROM stu;
SELECT gender,COUNT() FROM stu GROUP BY gender;
– 统计每个省份的人数
SELECT province,COUNT() FROM stu GROUP BY province;
– 统计每个省份的男生女生的总人数
SELECT province,gender,COUNT() FROM stu GROUP BY province,gender;
– MySQL不报错,显示出来的数据没有什么意义,这种语法不建议写,SQLServer和Oracle都会报错
– 分组规律:select后面的列可以比group by后面的列少,不能多
SELECT province,gender,COUNT(*) FROM stu GROUP BY province;
– 分组的语法
SELECT 列1,列2,聚合函数 FROM 表 GROUP BY 列1,列2;
– 对分组以后的数据进行筛选
– where在统计之前筛选不满足条件的数据
SELECT province,COUNT(*)
FROM stu
WHERE province!=‘北京’
GROUP BY province;
– 统计人数多个5个的省份
– HAVING在统计数据以后,对统计的数据进行筛选
SELECT province,COUNT()
FROM stu
GROUP BY province
HAVING COUNT()>5;
– 统计北京之外其他省份,学生总数超过5人的省份信息
SELECT province,COUNT(*) cnt
FROM stu
WHERE province!=‘北京’ – 分组之前先筛选,不满条件的数据不参与统计
GROUP BY province
HAVING cnt>5; – 统计之后,对统计数据进行筛选
– 统计每个部门工资10000以上的员工人数
SELECT COUNT(*)
FROM emp
WHERE sal>10000
GROUP BY deptno
– 部门工资10000以上的员工人数大于三人的部门
SELECT deptno,COUNT(*) cnt
FROM emp
WHERE sal>10000
GROUP BY deptno
HAVING cnt>3
– 部门工资10000以上的员工人数大于三人的部门,按照总人数降序排列
– 使用别名的方式进行排序选择
SELECT deptno,COUNT(*) cnt
FROM emp
WHERE sal>10000
GROUP BY deptno
HAVING cnt>3
ORDER BY cnt DESC
– 分页查询
– MySQL Oracle SqlServer这三种数据库的分页语句都不同(方言)
– 每页显示3条数据
– 显示第一页
SELECT * FROM emp LIMIT 0,3
– 显示第二页
SELECT * FROM emp LIMIT 3,3
– 显示第三页
SELECT * FROM emp LIMIT 6,3
– pageIndex 当前页
– pageSize 页大小(每页显示的数据条数)
– SELECT * FROM emp LIMIT (pageIndex-1)*pageSize,pageSize
SELECT 列名列表
FROM 表名
WHERE 开始的筛选条件
GROUP BY 分组列
HAVING 统计数据后进行筛选
ORDER BY 排序列
LIMIT 开始行,数量