day3(数据库SQL)
2、MySQL 中的自增列
AUTO_INCREMENT:自动增长,加入一个列声明了自增列,无需手动赋值,直接设置为NULL,会获取当前的最大值,然后加1插入。
注意:自增列允许手动赋值
只适用于整数型的主键列上
3、简单查询
(1)查询特定的列
示例:查询所有员工的姓名、工资、生日
SELECT ename,salary,birthday FORM emp;
(2)查询所有的列
SELECT * FROM emp;
SELECT die,ename,sex,birthday,salary,deptId;
(3)给列起别名
示例:查询所有员工的姓名和工资,使用汉字的别名显示
SELECT ename AS 姓名,salary AS 工资 FROM emp;
练习:查询所有员工的编号,姓名,性别,生日,用中文别名
SELECT eid AS 编号,ename AS 姓名,sex AS 性别,birthday AS 生日 FROM emp;
练习:查询所有员工编号,姓名,使用一个英文字母别名
SELECT eid AS a,ename AS b FROM emp;
注意:AS关键字是可以省略的,保留空格。
(4)只显示不同的记录/合并相同的记录
示例:查询出员工都在哪些部门
SELECT DISTINCT deptID FROM emp;
练习:查询出都有哪些性别的员工
SELECT DISTINCT sex FROM emp;
(5)在查询时执行计算
示例:计算2*33/47-8+10
SELECT 2*33/47-8+10;
练习:查询出所有员工的姓名及其年薪
SELECT ename,salary*12 FROM emp;
练习:假设每个员工工资增加500元,年终奖5000元,查询所有员工的姓名及其年薪,要给列起别名
SELECT ename 姓名,(salary+500)*12+5000 年薪 FROM emp;
(6)对查询的结果集进行排序
示例:查询所有的部门,结果按照部门编号升序排列
SELECT * FROM dept ORDER BY did ASC;#ascendant
示例:查询所有的部门,结果按照部门编号降序偶排列
SELECT * FROM dept ORDER BY did DESC;#descendant
练习:查询所有员工信息,结果安装工资又打到小排序
SELECT * FROM emp ORDER BY salary DESC;
练习:查询所有员工,结果按照年龄由大到小排序
SELECT * FROM emp ORDER BY birthday ASC;
练习:查询所有员工,结果按照年龄由大到小排序
SELECT * FROM emp ORDER BY birthday DESC;
练习:查询所有员工,结果按姓名的升序排序
SELECT * FROM emp ORDER BY ename ASC;
练习:查询所有员工,结果按工资降序排序,如果工资相同按照姓名排序
SELECT * FROM emp ORDER BY salary DESC,ename;
练习:查询所有员工,结果按照性别排序,如果性别相同按照公资的升序排序。
SELECT * FROM emp ORDER BY sex,salary;
ORDER BY 可以按照 数值,日期/时间、字符串来排序
默认按照ASC升序排列
(7)条件查询
示例:查询出编号为5的员工所有信息
SELECT * FROM emp WHERE eid=5;
>= <= > < = !=(不等于) 比较运算符
练习:查询出姓名为king的员工的编号,工资,生日。
SELECT eid,salary,birthday FROM emp WHERE ename='king';
练习:查询出20号部门下所有员工的信息
SELECT * FROM emp WHERE deptId=20;
练习:查询出男员工的所有信息
SELECT * FROM emp WHERE sex=1;
练习:查询出工资大于等于5000的员工所有信息
SELECT * FROM emp WHERE salary>=5000;
练习:查询出1991-1-1后出生的员工所有信息
SELECT * FROM emp WHERE birthday>'1991-1-1';
练习:查询出不在10号部门的员工所有信息
SELECT * FROM emp WHERE deptId!=10;
练习:查询出没有明确部门的员工所有信息
SELECT * FROM emp WHERE deptId is NULL;
练习:查询出有明确部门的员工所有信息
SELECT * FROM emp WHERE deptId IS NOT NULL;
练习:查询出工资大于6000的女员工所有信息
SELECT * FROM emp WHERE salary>6000 AND sex=0;
练习:查询出工资在5000~7000之间的员工所有信息
SELECT * FROM emp WHERE salary>=5000 AND salary<=7000;
SELECT * FROM emp WHERE salary BETWEEN 5000 AND 7000;
练习:查询出工资为5000以下,7000以上的员工所有信息。
SELECT * FROM emp WHERE salary<5000 OR salary>7000;
SELECT * FROM emp WHERE salary NOT BETWEEN 5000 AND 7000;
练习:查询出1990之前出生的员工,和1993年之后出生的员工所有信息
SELECT * FROM emp WHERE birthday NOT BETWEEN '1990-1-1' AND '1993-12-31';
练习:查询出1993年出生的员工信息
SELECT * FROM emp WHERE birthday BETWEEN '1993-1-1' AND '1993-12-31';
练习:查询出10号部门和30号部门的员工所有信息
SELECT * FROM emp WHERE deptId=10 OR deptId=30;
SELECT * FROM emp WHERE deptId IN(10,30);
练习:查询出不在10号部门和30号部门的员工所有信息
SELECT * FROM emp WHERE deptId NOT IN(10,30);
IS NULL/IS NOT NULL AND/OR BETWEEN...AND.../NOT BETWEEN...AND... IN()/NOT IN()
注意:删除、更改、查询都可以结合条件查询。
(8)模糊条件查询
示例:查询出姓名含有字母e的员工所有信息
SELECT *FROM emp WHERE ename LIKE '%e%';
练习:查询出姓名中以e结尾的员工所有信息
SELECT *FROM emp WHERE ename LIKE '%e';
练习:查询出姓名中倒数第2个字符为e的员工所有信息
SELECT *FROM emp WHERE ename LIKE '%e_';
SQL中提供了两个模糊查询的字符
% 可以匹配任意多个字符 >= 0
_ 可以匹配任意一个字符 =1
注意:以上两个匹配不能和=使用,必须使用LIKE关键字
(9)分页查询
假如查询的结果集中有太多的数据,一次显示不完,可以分页显示。
需要有两个条件,当前的页码、每页的数据量
SELECT * FROM emp LIMIT start,count;
start:是一个数字,从结果集中的哪一条开始读取;
count:是一个数字,最多读取的行数
start=(页码-1)*count
假设每一页显示5条记录
第一页:SELECT * FROM emp LIMIT 0,5;
第二页:SELECT * FROM emp LIMIT 5,5;
第三页:SELECT * FROM emp LIMIT 10,5;
第四页:SELECT * FROM emp LIMIT 15,5;
假设每一页显示6条记录
第一页:SELECT * FROM emp LIMIT 0,6;
第二页:SELECT * FROM emp LIMIT 6,6;
(10)复杂查询——聚合查询/分组查询
SELECT COUNT(*) FROM emp;
示例:查询出所有员工的数量
SELECT COUNT(eid) FROM emp;
练习:使用员工的姓名获取员工数量
SELECT COUNT(ename) FROM emp;
练习:使用员工的部门编号获取员工数量
SELECT COUNT(deptId) FROM emp;
函数:功能体,接收若干个数据,返回特定的结果 -- 饺子机
聚合函数:count()/sum()/AVG/MAX()/MIN()
练习:查询出所有员工工资的综合
SELECT SUM(salary) FROM emp;
练习:查询出所有男员工的平均工资
SELECT AVG(salary) FROM emp WHERE sex=1;
练习:查询出工资最高的员工工资
SELECT MAX(salary) FROM emp;
练习:查询出工资最低的员工工资
SELECT MIN(salary) FROM emp;
练习:查询年龄最大员工的生日
SELECT MIN(birthday) FROM emp;
分组查询
只能查询分组条件和聚合函数
示例:按部门编号进行分组,按工资排序
SELECT deptId, MAX(salary) FROM emp GROUP BY deptId;
练习:查询出男女员工的平均工资,最高工资,最低工资
SELECT sex,MAX(salary),MIN(salary),AVG(salary) FROM emp GROUP BY sex;
YEAR() 获取日期中的年份
MONTH() 获取日期中的月份
示例:查询1991年出生的员工
SELECT * FROM emp WHERE YEAR(birthday) = 1991;
示例:查询3月份出生的员工
SELECT * FROM emp WHERE MONTH(birthday) = '3';
2、复杂查询——子查询
本质上就是一个SQL语句的查询结果昨晚另一个SQL语句的查询条件
示例:查询出研发部员工的所有信息
步骤1:查询研发部的部门编号
SELECT did FROM dept WHERE dname='研发部';
步骤2:使用编号查询员工
SELECT * FROM emp WHERE deptId=10;
综合:SELECT * FROM emp WHERE deptId=(SELECT did FROM dept WHERE dname='研发部');
练习:查询出比tom工资高的员工所有信息
SELECT * FROM emp WHERE salary>(SELECT salary FROM emp WHERE ename='Tom');
练习:查询出和tom同一年出生的
SELECT * FROM emp WHERE YEAR(birthday) = (SELECT YEAR(birthday) FROM emp WHERE ename = 'Tom');
3、复杂查询——多表查询
示例:查询出所有员工的姓名及其所在的部门名称
SELECT ename,dname FROM emp,dept; 笛卡尔积
如何避免笛卡尔积,为多表查询添加条件。
SELECT ename,dname FROM emp,dept WHERE deptId=did;
上述语法无法查询出没部门的员工,也不能查询没有员工的部门——SQL92
(1)内连接 INNER JOIN....ON....;——和之前的结果一样
SELECT ename,dname FROM emp INNER JOIN dept ON deptId=did;
(2)左外连接 LEFT OUTER JOIN....ON...——查询结果是左侧表中所有的记录,即使右侧没有对应的记录 OUTER可以省略
SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON deptId=did;
(3)右外连接 RIGHT OUTER JOIN...ON——查询结果是右侧表中所有的记录,即使右侧没有对应的记录 OUTER可以省略
SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptId=did;
(4)全连接 FULL JOIN 显示左侧和右侧表中的所有记录——MySQL不支持
MySQL中的全连接 UNION 合并相同的记录
UNION ALL 不合并相同的记录
(SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON deptId=did)UNION(SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptId=did);
项目中如何保存日期、时间
2018-12-6 2018年12月6日 2018/12/6 12/6/2018
存储的是距离计算机元年(1970-1-1)的毫秒数
48*365*24*60*60*1000
1513728000000 使用BIGINT的列类型

浙公网安备 33010602011771号