/*
select 查询列表 from 表名;
类似于:System.out.println(要打印的东西);
*/
SELECT * FROM student_file
特点:
1、查询列表可以是:表中的字段、常量值、表达式、函数
2、查询到的结果是一个虚拟的表格
功能1、查询表中的单个字段
SELECT last_name FROM employees
功能2、查询表中的多个字段(不同字段之间用逗号隔开)
SELECT last_name , salary , email FROM employees
功能3、查询表中的所有字段(*代表所有的字段,但是顺序是跟原表里的字段一样的)
SELECT * FROM employees
功能4、查询常量值(不用加FROM关键字,只是一个普通的值 ),且不区分字符、字符串(用单引号括起来)
SELECT 100;
SELECT 'join';
功能5、查询表达式
-- 结果为2
SELECT 100%98;
功能6、查询函数
SELECT VERSION();
显示结果
功能7、去重查询
SELECT DISTINCT department_id FROM employees
以上涉及到的是基础查询部分,下面展开条件查询的部分
/*
select
查询列表
from
表名
where
筛选条件;
*/
SELECT * FROM student_file WHERE student.number=1;
分类:
(1)按条件表达式筛选
MySQL中条件运算符:>(大于) <(小于) =(等于) !=(不等于) <>(不等于) >=(大于等于) <=(小于等于)
(2)按逻辑表达式筛选
MySQL中逻辑运算符:&&(与) ||(或) !(非)但更推荐其标准中的and(与) or(或) not(非)
作用:用于连接条件表达式
&&和and:两个条件都为true,结果为true,反之为false
||或or:只要有一个条件为true,结果为true,反之为false
!或not:如果连接的条件本身为false,结果为true,反之为false
(3)模糊查询:①like ②between and ③in ④is null
这些模糊查询用到的这些运算符,也可以归类到条件运算符中
功能1、按条件表达式筛选
-- 案例1:查询工资>12000的员工信息
SELECT * FROM employees WHERE salary>12000;
-- 案例2:查询部门编号不等于90号的员工名和部门编号
SELECT last_name,department_id FROM employees WHERE department_id<>90;
-- 或者写成以下这种格式,也是对的
SELECT last_name,department_id FROM employees WHERE department_id!=90;
功能2、按逻辑表达式筛选
-- 案例1:查询工资在10000到20000之间的员工名、工资以及奖金
SELECT
last_name,salary,commission_pct
FROM
employees
WHERE
salary>=10000
AND
salary<=20000;
-- 案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息
SELECT * FROM employees WHERE department_id<90 OR department_id>110 OR salary>15000;
-- 或者用下面这种逻辑判断式去筛选
SELECT * FROM employees WHERE NOT(department_id>=90 AND department_id<=110)OR salary>15000;
功能3、模糊查询
①like
特点:一般和通配符搭配(通配符包括:% 指任意多个字符,包含0个字符;_ 指任意单个字符),可以判断字符型或数值型
-- 案例1:查询员工名中包含字符a的员工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';
-- 案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资
SELECT last_name,salary FROM employees WHERE last_name LIKE '__n_l%';
-- 案例3:查询员工名中第二个字符为_的员工名
SELECT last_name FROM employees WHERE last_name LIKE '_\_%';
各案例中,因为是字符型,所以要用单引号。案例3中,将特殊符号_进行转义,支持\_表达,或者利用ESCAPE关键词用任意字符指定为转义字符
-- 案例3:查询员工名中第二个字符为_的员工名
SELECT last_name FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';
显示案例2中查询结果 和 案例3中查询结果
②between and
使用between and可以提高语句的简洁度,包含两个临界值,但两个临界值不要调换顺序,其完全等价于>=左边的值且<=右边的值。
-- 案例1:查询员工编号在100到120之间的员工信息
SELECT * FROM employees WHERE employee_id >= 100 AND employee_id <= 120;
-- 使用between and
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;
③in
含义:判断某字段的值是否属于in列表中的某一项
特点:使用in可以提高语句简洁度;in列表的值类型必须统一或者兼容;in列表中不支持通配符。
-- 案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和员工的工种编号
SELECT
last_name,job_id
FROM
employees
WHERE
job_id = 'IT_PROG' OR job_id = 'AD_VP' OR job_id = 'AD_PRES';
-- 用in来简化查询语句
SELECT
last_name,job_id
FROM
employees
WHERE
job_id IN('IT_PROG','AD_VP','AD_PRES');
④is null
注意细节:= 或者< >不能用于判断null值,is null或 is not null 可以判断null值;is 也不能用来做其他判断。
-- 案例:查询没有奖金的员工名和奖金率(错误示范)
SELECT last_name,commission_pct FROM employees WHERE commission_pct = 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;
接下来介绍排序查询
特点:
1、ASC代表的是升序,DESC代表的是降序,如果不写则默认为升序;
2、ORDER BY 子句中可以支持单个字段、多个字段、表达式、函数、别名作为条件的查询
3、ORDER BY 子句一般是放在查询语句的最后位置,LIMIT子句除外。
/* 排序查询
语法:
SELECT 查询列表 FROM WHERE 筛选条件 ORDER BY 排序列表 [ASC 升序 DESC 降序]
*/
-- 案例:查询员工信息,要求工资从高到低排序
SELECT * FROM employees ORDER BY salary DESC;
-- 案例:查询员工信息,要求工资从低到高排序
SELECT * FROM employees ORDER BY salary ASC;
-- 默认为升序
SELECT * FROM employees ORDER BY salary;
排序查询里面可以按照表达式排序、按照别名排序、按照函数排序、按多个字段查询等。
-- 案例1:按年薪的高低显示员工的信息和年薪【按表达排序】
SELECT
* , salary*1*(1+IFNULL(commission_pct,0)) 年薪
FROM
employees
ORDER BY
salary*1*(1+IFNULL(commission_pct,0)) DESC;
-- 案例2:按年薪的高低显示员工的信息和年薪【按别名排序】
SELECT
* , salary*1*(1+IFNULL(commission_pct,0)) 年薪
FROM
employees
ORDER BY
年薪 DESC;
-- 案例3:按姓名的长度显示员工的姓名和工资【按函数排序】
SELECT
LENGTH(last_name) 字节长度, last_name,salary
FROM
employees
ORDER BY
LENGTH(last_name) DESC;
-- 案例4:查询员工信息,要求先按工资升序,再按员工编号降序【按多个字段排序】
SELECT * FROM employees ORDER BY salary ASC, employee_id DESC;
案例4的查询结果如下:箭头方向表示从高到低的方向。
一、着重号‘ ` ’,是用来区分字段和关键字
SELECT NAME FROM employees;
SELECT `name` FROM employees;
二、起别名
方式一 使用AS
SELECT 100%98 AS 结果;
SELECT last_name AS 姓, first_name AS 名 FROM employees;
方式二 使用空格
SELECT lase_name 姓, first_name 名 FROM employees;
如果起别名遇到别名中有特殊符号(比如空格、井号等),建议用双引号将别名括起来,单引号也可以。
起别名优点:
1、便于理解;
2、如果要查询的字段有重名的情况,使用别名可以区分开来
执行结果
三、加号 + 的作用
在java中的 + 号:
1、运算符,两个操作数都为数值型;
2、连接符,只要有一个操作数为字符串
在MySQL中的 + 号:仅仅只有一个功能——作运算符。
(1)两个操作数都为数值型,则做加法运算;
(2)只要其中一方为字符型,就会试图将字符型数值转换成数值型;
如果转换成功,则继续做加法运算,
如果转换失败,则将字符型数值转换成0。
(3)只要其中一方为null,则结果肯定为null。
-- 结果为 190
SELECT 100 + 90;
-- 结果为 213
SELECT '123' + 90;
-- 结果为 90
SELECT 'json' + 90;
-- 结果为 null
SELECT null + 90;
四、在mysql中将不同字段进行拼接
SELECT CONCAT('a','b','c') AS 结果;
SELECT CONCAT(last_name , first_name) AS 姓名 FROM employees;
执行结果
如果拼接的时候遇到字段的值为空的情况,那么就要用到 IFNULL 关键字,第一个参数存放可能值有null的字段,第二个是当该字段的值为null时要返回的值。
SELECT IFNULL (commission_pct,0)
五、安全等于 <=>
缺点:可读性不强。
-- 案例:查询工资为12000的员工信息
SELECT last_name,salary FROM employees WHERE salary <=> 12000;
IS NULL:仅仅可以判断NULL值,可读性较高,建议会用。
<=>:既可以判断NULL值,又可以判断普通的数值,可读性较低。
六、经典面试题
试问:以下两个SQL语句执行结果是否一样?
SELECT * FROM employees;
SELECT * FROM employees WHERE commission_pct LIKE '%%' AND last_name LIKE '%%';
答案:不一样!如果判断的字段有NULL值,那么两者的结果就不一样了。