mysql条件查询

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%';

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值