-- 1 查询表中单个字段 SELECT `last_name` FROM `employees`; -- 2 查询表中多个字段 SELECT `last_name`,`email`,`department_id` FROM `employees`; # 3.查询表中所有字段 SELECT * FROM `employees`; # 4. 查询表中的常量值 SELECT 100; # 5. 查询表达式 SELECT 100%98; # 6.查询函数 SELECT VERSION(); # 7.起别名 SELECT 100%98 AS 结果; SELECT `last_name` AS 姓 FROM `employees`; # 8. 去重复--查询员工表中涉及到的部门编号 SELECT DISTINCT `department_id` FROM `employees`; # 9.+号的作用--查询员工名和姓连接成一个字段,并显示为 姓名 SELECT CONCAT(`last_name`,`first_name`) AS 姓名 FROM `employees`; # (二)条件查询 /* 语法 selcet 查询列表 from 表名 where 筛选条件 分类 一、按条件表达式筛选 条件运算符:<;>;!=;<=;>=; 二、按逻辑运算符,与或非 and or not 用于连接条件表达式 三、模糊查询 like between and in is null */ # 按条件表达式筛选员工信息 # 1。查询工作大于12000的员信息 SELECT * FROM`employees` WHERE`salary`>12000; # 2.查询部门编号不等于90号员工名和部门编号 SELECT CONCAT(`last_name`,`first_name`) AS 姓名,`department_id` FROM `employees` WHERE `department_id`!=90; # 3.查询工资在10000到12000之间的员工名,工资和奖金 SELECT `first_name`,`salary`,`commission_pct` FROM`employees` WHERE `salary` >10000 AND`salary`<12000; # 4.查询部门编号不是在90到100之间,或者工资高于15000的员工信息 SELECT * FROM`employees` WHERE`department_id`<90 OR `manager_id`>100 OR `salary`>15000; # 模糊查询 -- like -- 和通配符搭配使用:% 表示任意多个字符 -- _下划线表示任意单个字符 -- 查询员工名中第三个字符为n,第5个字符为l的员工名和工资 SELECT `last_name`,`salary` FROM `employees`WHERE `last_name`LIKE ‘__n_l%‘; -- 查询员工名中包含字符a的员工信息 SELECT * FROM `employees`WHERE `last_name`LIKE ‘%a%‘;-- % 表示任意字符的通配符 -- 查询员工名中第二个字符为_下划线的员工名 SELECT `last_name` FROM `employees`WHERE `last_name`LIKE‘_\_%‘;-- \:表示转义字符 -- ESCAPE:表示指定任意符号为转义字符 SELECT `last_name` FROM `employees`WHERE `last_name`LIKE‘_$_%‘ ESCAPE ‘$‘; -- between and-- 闭区间 -- 查询员工编号在90到100之间的员工信息 SELECT * FROM `employees`WHERE `department_id` BETWEEN 90 AND 100; -- in 判断某字段的值是否属于in列表中某一个,值类型必须统一或兼容,列表值不支持通配符 -- 查询员工工种编号是 AD_PRES,AD_VP 中的一个员工名和工种编号 SELECT `last_name`,`job_id` FROM`employees`WHERE `job_id` IN (‘AD_PRES‘,‘AD_VP‘); -- is null -- 查询摩尔没有奖金的员工名和奖金率 SELECT `last_name`,`commission_pct` FROM`employees`WHERE `commission_pct`IS NULL; -- 查询摩尔有奖金的员工名和奖金率 SELECT `last_name`,`commission_pct` FROM`employees`WHERE `commission_pct`IS NOT NULL; # 安全等于<=>,是判断等于,用的较少 -- 查询摩尔没有奖金的员工名和奖金率 SELECT `last_name`,`commission_pct` FROM`employees`WHERE `commission_pct`<=> NULL; -- 查询员工号为176的员工的姓名和部门编号,年薪 SELECT `last_name`,`department_id`,`salary`*12*(1+IFNULL(`commission_pct`,0)) AS 年薪 FROM `employees`; # 排序查询 /* 语法 select from [where] order by [asc, desc] order by 中可以支持单个字段,多个字段,表达式,函数,别名 order by 一般是放在查询语句的最后面,limit字句除外 */ -- 查询员工信息,要求工资从高到低 SELECT* FROM`employees` ORDER BY`salary` DESC; -- 查询部门编号大于90的员工信息,要求按照入职先后排序 SELECT * FROM `employees`WHERE`department_id`>90 ORDER BY `hiredate` ASC; -- [按表达式排序] 按年薪的高低显示员工的信息和年薪 SELECT*,`salary`*12*(1+IFNULL(`commission_pct`,0)) AS 年薪 FROM`employees` ORDER BY 年薪 DESC; -- 按照姓名的长度显示员工的姓名和工资 [按函数排序] SELECT LENGTH(`last_name`) AS 姓名长度,`last_name`,`salary` FROM `employees` ORDER BY 姓名长度 DESC; -- 查询员工信息,要求先按照工资排序,在按照员工部门编号排序[按多个字段排序] SELECT *FROM `employees`ORDER BY `salary` ASC,`department_id` DESC; # 常见函数 /* 分类 单行函数-- concat length 等 分组函数-- 做统计用, */ -- 字符函数 -- length SELECT LENGTH(‘john‘) -- 查看数据库的字符集 SHOW VARIABLES LIKE‘%char%‘; -- concat -- 拼接字符串 SELECT CONCAT(`last_name`,`first_name`) FROM `employees`; -- upper,lower SELECT UPPER(‘john‘); SELECT LOWER(‘JOHN‘); -- substr,substring-- 索引从1开始,到结束 SELECT SUBSTR(‘小龙女金庸‘,4);-- 金庸 SELECT SUBSTR(‘小龙女金庸‘,1,3);-- 小龙女 -- instr --子串在大串中的起索引[第一次] SELECT INSTR(‘小龙女金庸‘,‘金庸‘);-- 4 -- trim -- 去空格[前后] SELECT TRIM(‘ 小龙女金庸 ‘); SELECT TRIM(‘a‘FROM‘aaaa 小龙aaaaaaa女金庸 ‘); -- lpad-- 左边填充指定长度的符号 SELECT LPAD(‘张三丰‘,10,‘*‘); -- rpad-- 右边填充指定长度的符号 SELECT RPAD(‘张三丰‘,12,‘*‘); -- replace-- 替换 SELECT REPLACE(‘张无忌爱上了周芷若‘,‘周芷若‘,‘赵敏‘); # 数学函数 -- round:四舍五入 SELECT ROUND(1.65);-- 2 # ceil :向上取整 SELECT CEIL(1.2); # floor :向下取整 # truncate-- 截断 SELECT TRUNCATE(1.69,1); # mod 取余数 # 日期函数 -- now 返回当前的日期 SELECT NOW(); -- curdate 返回当前系统日期,不包含时间 SELECT CURDATE(); SELECT CURTIME();-- 返回当前的时间,不包含日期 # 可以获取指定的部分,年,月,日,时,分,秒; SELECT YEAR(NOW()); SELECT MONTH(NOW()); SELECT MONTHNAME(NOW()); # str_to_date 将日期字符转换成指定日期格式 SELECT STR_TO_DATE(‘1988-12-13‘,‘%Y-%c-%d‘); -- date_format 将日期转换成字符 SELECT DATE_FORMAT(NOW(),‘%y年%m月%d 日‘); # 其他函数 SELECT VERSION(); SELECT DATABASE(); SELECT USER(); # 流程控制函数 -- if函数:if else 的效果; SELECT `last_name`,`commission_pct`,IF(`commission_pct` IS NULL,‘hehe ‘,‘haha ‘) FROM`employees`; -- case 函数 -- 使用1 /* 案例1. 查询员工工资,要求 部门号=30,显示的工资为1.1倍; 部门号=40,显示的工资为1.2倍; 部门号=50,显示的工资为1.3倍; 其他部门,显示的工资为原工资。 */ SELECT `salary`原始工资,`department_id`, CASE `department_id` WHEN `department_id`=30 THEN `salary`*1.1 WHEN `department_id`=40 THEN `salary`*1.2 WHEN `department_id`=50 THEN `salary`*1.3 ELSE `salary` END AS 新工资 FROM `employees`; -- case 类似于多重if /* 查询员工的工资请 如果工资大于2000,显示A级别 如果工资大于》15000,显示B级别 如果工资大于10000,显示C级别 否则,显示D级别 */ SELECT `salary`, CASE WHEN `salary`>20000 THEN ‘A‘ WHEN `salary`>15000 THEN ‘B‘ WHEN `salary`>10000 THEN ‘C‘ ELSE ‘D‘ END AS 工资级别 FROM `employees`; # 分组函数 -- sum SELECT SUM(`salary`)FROM `employees`; -- avg SELECT AVG(`salary`)FROM `employees`; -- max SELECT MAX(`salary`)FROM `employees`; -- min SELECT MIN(`salary`)FROM `employees`; -- count SELECT COUNT(`salary`)FROM `employees`; # 以上分组函数均忽略null值 -- 可以和distinct搭配使用 SELECT SUM(DISTINCT `salary`),SUM(`salary`)FROM `employees`; SELECT COUNT(*)FROM employees;-- 统计所有样本数 -- 和分组函数一同查询的字段一般要求是group by 后的字段 # 分组查询 /* select 分组函数,列(要求出现在group by的后面) from 表 【where】 group by order by 注意:查询列表必须特殊,要求是分组函数和group by 后出现的字段 */ -- 查询每个工种的最高工资 SELECT MAX(salary),job_id FROM employees GROUP BY job_id; -- 查询每个位置上的部门个数 SELECT COUNT(*),`location_id` FROM`departments`GROUP BY `location_id`; -- 查询邮箱中包含a字符的,每个部门的平均工资 SELECT AVG(`salary`),`department_id` FROM `employees` WHERE `email`LIKE ‘%a%‘ GROUP BY department_id; -- 查询有奖金的每个领导的员工的最高工资 SELECT MAX(salary),manager_id FROM`employees` WHERE `commission_pct`IS NOT NULL GROUP BY`manager_id`; -- 查询那个部门员工的个数大于2 # 添加分组后的筛选 SELECT COUNT(*) AS 员工个数,department_id FROM`employees` GROUP BY `department_id` HAVING COUNT(*)>2; -- 查询每个工种有奖金的员工的最高工资大于12000的工种编号和最高工资 SELECT MAX(salary) ,job_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary)>12000; -- 查询领导编号大于102的每个领导手下的最低工资大于5000的领导编号是哪个,以及其最低工资 SELECT MIN(salary),`manager_id` FROM`employees` WHERE `manager_id`>102 GROUP BY`manager_id` HAVING MIN(`salary`)>5000; # 按表达式或函数分组 -- 按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数大于5的有哪些 SELECT COUNT(*),LENGTH(`last_name`) FROM`employees` GROUP BY LENGTH(`last_name`) HAVING COUNT(*)>5; # 按多个字段分组 -- 查询每个部门每个工种的员工的平均工资 SELECT AVG(`salary`),`department_id`,`job_id` FROM `employees` GROUP BY `department_id`,`job_id`; # 添加查询 -- SELECT AVG(`salary`),`department_id`,`job_id` FROM `employees` WHERE department_id IS NOT NULL GROUP BY `department_id`,`job_id` HAVING AVG(`salary`)>10000 ORDER BY AVG(`salary`) DESC;