mysql条件查询
我就直接po代码了,代码中有注释
/*
条件查询
语法:
select
查询列表
from
表名
where
筛选条件;
分类:
一、按条件表达式筛选
简单条件运算符:> < = != <> >= <=
(注意:不等于可以使用!=和<>这2种方式,但是推荐使用<>这种)
二、按逻辑表达式筛选
逻辑运算符:
作用:用于连接条件表达式
&& || !不推荐使用
and or not推荐使用
&&和and:两个条件都为true,结果为true,反之为false
||或or: 只要有一个条件为true,结果为true,反之为false
!或not: 如果连接的条件本身为false,结果为true,反之为false
三、模糊查询
like
between and
in
is null
*/
#一、按条件表达式筛选
#案例1:查询工资>18000的员工信息
SELECT
*
FROM
employees
WHERE
salary > 18000
#案例2:查询部门编号不等于90号的员工名和部门编号
SELECT
last_name,
department_id
FROM
employees
WHERE
department_id <> 90;
#二、按逻辑表达式筛选
#案例1:查询工资在10000到20000之间的员工名、工资以及奖金
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE
salary>=10000
AND
salary<=20000;
#或者使用&&,但是不推荐使用&&,比较推荐使用and
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE
salary>=10000 && salary<=20000;
#案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息
SELECT
*
FROM
employees
WHERE
NOT (department_id>=90 AND department_id<=110) OR salary > 15000;
#注意:不推荐使用&& || !这种写法, mysql数据库中更推荐使用AND OR NOT这种写法
SELECT
*
FROM
employees
WHERE
!(department_id>=90 && department_id<=110) || salary > 15000;
#或者如下
SELECT
*
FROM
employees
WHERE
(department_id<90 OR department_id>110) OR salary > 15000;
#或者使用!
SELECT
*
FROM
employees
WHERE
(!(department_id>=90 AND department_id<=110)) OR salary > 15000;
#
DESC employees;
#在mysql中,字符型和日期型必须使用引号包起来,单引号和双引号都可以,数字型不需要使用引号包起来
#在mysql中,字符必须使用引号包起来,单引号和双引号都可以,如下:
SELECT "abc", 'hello', 66, 88.99, 'w';
SELECT '哈哈', "呵呵";
#三、模糊查询
#salary是double类型
SELECT salary FROM employees WHERE salary LIKE '24%';
#在mysql中,字段值不区分大小写,而在Oracle中,字段值严格区分大小写
SELECT last_name FROM employees WHERE last_name LIKE '%ha%';
#案例1:查询员工名中包含字符a的员工信息
#在mysql中,字段值不区分大小写,而在Oracle中,字段值严格区分大小写,所以在mysql中无论是大写的A还是小写的a都可以查询到
SELECT
*
FROM
employees
WHERE
last_name LIKE '%a%';
#在mysql中,字段值不区分大小写,而在Oracle中,字段值严格区分大小写,所以在mysql中无论是大写的A还是小写的a都可以查询到
SELECT
*
FROM
employees
WHERE
last_name LIKE '%A%'; #所以last_name LIKE '%A%'和last_name LIKE '%a%'查询效果一样
#案例2:查询员工名中第三个字符为n,第五个字符为l的员工名和工资
SELECT
last_name,
salary
FROM
employees
WHERE
last_name LIKE '__n_l%';
#案例3:查询员工名中第二个字符为_下划线的员工名(_下划线在mysql数据库中是一个通配符,如何把_下划线当成一个普通的字符呢?)
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '_\_%'; #使用\转义,此时,就把_下划线当成一个普通的字符了
#还有另外一种方式,使用ESCAPE关键字,ESCAPE关键字的作用是转义,mysql数据库中推荐大家使用ESCAPE,如下
SELECT
last_name
FROM
employees
WHERE
/*
使用escape关键字来定义转义符,把$定义为转义字符,如此一来,此时会把$后面的_下划线当成一个普通的_下划线字符,而
不会把_下划线当成通配符了,当然啦,你也可以使用其他字符作为转义字符,不一定要使用$美元符号作为转义字符,你可以使用a啦,b啦作为转义字符
*/
last_name LIKE '_$_%' ESCAPE '$';#为了提高可读性,这里使用$美元符号作为转义字符,当然啦,你也可以使用其他字符作为转义字符
#
SELECT
last_name
FROM
employees
WHERE
/*
使用escape关键字来定义转义符,把a定义为转义字符,如此一来,此时会把a后面的_下划线当成一个普通的_下划线字符,而
不会把_下划线当成通配符了
*/
last_name LIKE '_a_%' ESCAPE 'a';
#ESCAPE关键字的作用是转义
SELECT last_name FROM employees WHERE last_name LIKE
'_a_%' ESCAPE 'a' OR last_name LIKE '_@_%' ESCAPE '@' OR last_name LIKE '_#_%' ESCAPE '#'
OR last_name LIKE '_e_%' ESCAPE 'e';
#2.between and
/*
1.使用between and 可以提高语句的简洁度
2.包含临界值
3.两个临界值不要调换顺序
*/
#案例1:查询员工编号在100到120之间的员工信息
#方式1
SELECT
*
FROM
employees
WHERE
employee_id>=100 AND employee_id<=120;
#方式2 使用between and稍微精简,简写一点
SELECT
*
FROM
employees
WHERE
employee_id BETWEEN 100 AND 120;
#3.in
/*
含义:判断某字段的值是否属于in列表中的某一项
特点:
1.使用in提高语句简洁度
2.in列表的值类型必须一致或兼容
3.in列表中不支持通配符
*/
#案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id = 'AD_PRES' OR job_id = 'IT_PROG' OR job_id = 'AD_VP' ;
#使用in关键字
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id IN ('AD_PRES', 'IT_PROG', 'AD_VP');
#使用not in
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id NOT IN ('AD_PRES', 'IT_PROG', 'AD_VP');
#in列表中不支持通配符,如下:
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id IN ('AD_PRES', 'IT_%');
#4、is null
/*
=或<>不能用于判断null值
is null或is not null 可以判断null值
*/
#案例1:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NULL
#案例1:查询有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NOT NULL
#安全等于 <=> 不推荐使用,因为不够直观
#案例1:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct <=> NULL;
#案例2:查询工资为9000的员工信息
SELECT
last_name,
salary
FROM
employees
WHERE
salary <=> 9000;
/*
is null 和 <=> 的比较
IS NULL:仅仅可以判断NULL值,可读性较高,推荐使用
<=> :既可以判断NULL值,又可以判断普通的数值,可读性较低,不推荐使用,因为不够直观
*/
#查询员工号为176的员工的姓名和部门号和年薪
SELECT
last_name,
department_id,
salary AS 月薪,
salary * 12 AS 年薪,
IFNULL(commission_pct, '好可怜,没年终奖'),
salary * 12 * (1 + IFNULL(commission_pct, 0)) AS "年薪+年终奖"
FROM
employees;
#查询employees表中,job_id不为'IT_PROG'的或者工资大于16000的员工信息
#如下这几条sql语句效果都一样
SELECT * FROM employees WHERE job_id <> 'IT_PROG' OR salary > 16000;
SELECT * FROM employees WHERE job_id != 'IT_PROG' OR salary > 16000;
SELECT * FROM employees WHERE (NOT(job_id = 'IT_PROG')) OR salary > 16000;
SELECT * FROM employees WHERE ((NOT job_id = 'IT_PROG')) OR salary > 16000;
SELECT * FROM employees WHERE (NOT job_id = 'IT_PROG') OR salary > 16000;
SELECT * FROM employees WHERE NOT job_id = 'IT_PROG' OR salary > 16000;
SELECT * FROM employees WHERE (!(job_id = 'IT_PROG')) OR salary > 16000;
SELECT * FROM employees WHERE !(job_id = 'IT_PROG') OR salary > 16000;
#如下这条sql语句和上面那几条sql语句效果不同,该条语句的执行结果是上面语句执行结果的取反
SELECT * FROM employees WHERE !job_id = 'IT_PROG' OR salary > 16000;
#查看departments表结构
#方式1
DESC departments;
#方式2
DESCRIBE departments;
#方式3
SHOW COLUMNS FROM departments;
#查询departments表中涉及到那些位置编号
#根据一个字段去重
SELECT DISTINCT location_id FROM departments; #使用DISTINCT关键字去重
SELECT DISTINCT (location_id) FROM departments;
#
SELECT location_id, department_id FROM departments;
#根据多个字段去重
SELECT DISTINCT location_id, manager_id FROM departments;
#查询commission_pct为null的
SELECT * FROM employees WHERE commission_pct IS NULL;
#查询commission_pct不为null的
SELECT * FROM employees WHERE commission_pct IS NOT NULL;
#是一道面试题,如下2条sql语句,结果是否一样?(答案是可能不一样)
SELECT * FROM employees;
#(从下面这条sql语句中可以看出,答案是肯定不一样,因为commission_pct字段有null值,记住,如果判断的字段有null值,效果就不一样)
SELECT * FROM employees WHERE commission_pct LIKE '%%' AND last_name LIKE '%%';
#面试题,如下2条sql语句,结果是否一样?(答案是一样)
SELECT * FROM employees;
#(答案是一样,因为总归有一个字段不为null)
SELECT * FROM employees WHERE commission_pct LIKE '%%' OR
last_name LIKE '%%' OR email LIKE '%%' OR job_id LIKE '%%' OR phone_number LIKE '%%';
#CONCAT()函数
SELECT CONCAT('hello', 'world');
SELECT CONCAT('hello', '123');
SELECT CONCAT('526', '3');
SELECT CONCAT(526, '3');
SELECT CONCAT(526, 3.9);
SELECT CONCAT(789, 365);
SELECT CONCAT(526, '3.5');
#结果为null
SELECT CONCAT(526, 'hello', NULL);
#IFNULL()函数
SELECT IFNULL(666=666, 'jack') "result";
SELECT IFNULL(5<8, 'hello') 'result';
SELECT IFNULL(2>6, 'hello') result;
SELECT IFNULL(NULL, 'hello') 结果;
SELECT IFNULL(NOT NULL, '中国');
SELECT IFNULL(666, 'hello') AS 结果;
SELECT IFNULL('hahaha', 'hello') AS result;
SELECT IFNULL("江西省赣州市于都县", 'hello') AS "result";
SELECT IFNULL("china", 888) AS 'result';
SELECT IFNULL(1, 'okokok') AS 结果;
SELECT IFNULL(0, 'okokok') AS 结果;
#在mysql数据库中,1代表true,0代表false
#ISNULL()函数,判断是否为null,如果是返回1,如果不是返回0
SELECT ISNULL(commission_pct) AS "是否为NULL", commission_pct FROM employees;
#like可以使用在字符型,也可以使用在数字型,如下:
#department_id字段是int数字型的
SELECT department_id FROM employees WHERE department_id LIKE '1__%';
#last_name字段是字符型的
SELECT last_name FROM employees WHERE last_name LIKE 'a%';
SELECT last_name FROM employees WHERE last_name LIKE 'A%';