MySQL学习之运算符

运算符

1.算术运算符 + - * /(div) %(mod)

算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加
(+)、减(-)、乘(*)、除(/)和取模(%)运算。

1.1 加法与减法运算符

SELECT 100, 100 + 0, 100 - 0, 100 + 50, 100 + 50 -30, 100 + 35.5, 100 - 35.5
FROM DUAL;

# 在sql中 +没有连接的作用,就表示加法运算,此时会将字符串转换为数值(隐式转换)
SELECT 100+'1'   #在Java中,结果为1001
FROM DUAL;     # 101

SELECT 100+'a'
FROM DUAL;    # 'a'看作0处理

SELECT 100+NULL
FROM DUAL;    # NULL参与运算结果为NULL

1.2 乘法和除法运算符

除法中除不除的进结果都为浮点型(保留小数点后四位) 先乘除后加减
div中 分母不能为0,结果为NULL

SELECT 100,100*1,100*1.0,100/1.0,100/2,
100+2*5/2,100/3,100 DIV 0   # 一个数乘以整数1和除以整数1后仍得原数
FROM DUAL;					# 除法中分母为0,结果则为NULL

# 取模
# 结果的正负取决于被模数的符号 -12 MOD -5
SELECT 12%3,12%5,12 MOD -5,-12 MOD 5,-12 MOD -5
FROM DUAL;

# 1.21 查询员工id为偶数的员工信息
SELECT *
FROM employees
WHERE employee_id%2=0;

2.比较运算符

比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回1,比较的结果
为假则返回0,其他情况则返回NULL。
比较运算符经常被用来作为SELECT查询语句的条件来使用,返回符合条件的结果记录。

比较运算符:= <=>(安全等于) <>(!=)(不等于) < <= > >=

2.1 =(等号)的使用

SELECT 1=2 ,1!=2,1='1',1='a',0='a',100='100abncx'
FROM DUAL;    #字符串作比较时,如果不能转化为数值的话,一般隐式转换为0参与运算(100='100abncx')

SELECT 'a'='a','ab'='ab','a'='b' 
FROM DUAL;    #等号两边的值、字符串或表达式都为字符串时,直接比较时,对比字符的ANSI码数值

SELECT 1=NULL,NULL=NULL
FROM DUAL;    #如果等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL

SELECT employee_id,salary,commission_pct
FROM employees
WHERE employee_id=120;
#WHERE commission_pct =NULL;
# NULL和NULL相比较 结果都为NULL,查询出的都是返回结果为1的结果,为1的显示,其他的过滤掉

2.2 <=>(安全等于运算符)

# 安全等于可以对NULL进行判断,在两个操作数都为NULL时其返回值为1,而不为NULL
# 当一个操作数为NULL时,其返回值为0,而不为NULl
# <=> 为NULL而生,
SELECT NULL<=>NULL,1=NULL,1<=>'1',1<=>'a',0<=>'a'
FROM DUAL;

#查询commission_pct为NULL的数据
SELECT last_name,salary,commission_pct
FROM employees
WHERE commission_pct<=>NULL;

2.3 <>(不等于运算符) (!=)

# 用于判断两边的数字、字符串或者表达式的值是否不相等
# 如果不相等则返回1,相等则返回0  不等于运算符不能判断NULl值
# 两边任意有一个NULL值,则结果为NULL

SELECT 3<>2,'4'<>NULL,''<>NULL,NULL!=NULL
FROM DUAL;

2.4比较关键字(非符号型运算符)

IS NULL(为空运算符) IS NOT NULL(不为空运算符)
ISNULL lEAST(最小值运算符) GREATEST(最大值运算符)

2.41.IS NULL(为空运算符)

# IS NULL
# 查询commission_pct为NULL的数据
SELECT last_name,salary,commission_pct
FROM employees
WHERE commission_pct IS NULL;

2.42.ISNULL(字段)

# ISNULL(字段)
# 查询commission_pct为NULL的数据
SELECT last_name,salary,commission_pct
FROM employees
WHERE ISNULL(commission_pct) ;

2.43.IS NOT NULL(不为空运算符)

# IS NOTNULL
# 查询commission_pct不为NULL的数据
SELECT last_name,salary,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;

SELECT last_name,salary,commission_pct
FROM employees
WHERE NOT commission_pct <=>NULL;  #NOT 假变真,真变假 1->0  0->1

2.44.lEAST(最小值运算符) GREATEST(最大值运算符)

# LEAST 最小值运算符
SELECT LEAST('a','h','z'),GREATEST('a','c','z')
FROM DUAL;

#比较employees中名和姓的大小
SELECT LEAST(first_name,last_name),LEAST(LENGTH(first_name),LENGTH(last_name))
FROM employees;

2.45. BETWEEN a AND b

# BETWEEN  a AND b  查询[a,b]范围内的数据 ,a<b
# 查询工资在6000-8000的员工信息
SELECT employee_id,last_name,salary
FROM employees
WHERE salary BETWEEN 6000 AND 8000;
#WHERE salary>=6000 AND salary<=8000;   WHERE salary>=6000 && salary<=8000;

#查询工资不在6000-8000的员工信息
SELECT employee_id,last_name,salary
FROM employees
#where salary not between 6000 and 8000;
WHERE salary<6000 OR salary >8000;

2.46.in(set) / not in(set)

#查询部门为10,20,30的员工信息
SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE department_id IN(10,20,30);
#where department_id =10 or department_id=20 or department_id=30;

#查询工资不是6000,7000,8000的员工信息
SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE salary NOT IN(6000,7000,8000);

2.47.模糊查询 LIKE

# %:代表不确定个数的字符(0个,1个或者多个)

#查询last_name 中包含字符'a'的员工的信息
SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE last_name LIKE '%a%';

#查询last_name 中以字符'a'开头的员工的信息
SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE last_name LIKE 'a%'; 
WHERE last_name LIKE '%a';  # 以字符'a'结尾的员工的信息

#查询last_name 中包含字符'a'且包含字符'e'的员工信息
#写法一:
SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE last_name LIKE '%a%' AND last_name LIKE '%e%';

#写法二:
SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE last_name LIKE '%a%e%' OR last_name LIKE '%e%a%';   #a在前面或者e在前面

# _代表一个不确定的字符

#查询第二个字符是'a'的员工信息
SELECT employee_id,last_name,salary,department_id
FROM employees 
WHERE last_name LIKE '_a%';

#查询第二个字符是_且第三个字符是'a'的员工信息
SELECT employee_id,last_name,salary,department_id
FROM employees
# WHERE last_name LIKE '_\_a%';   #使用转义字符 \ 第二个字符是_,第三个是字符'a'
#或者 使用ESCAPE 指定转义字符
WHERE last_name LIKE '_$_a%' ESCAPE '$'; 

2.48.REGEXP \RLIKE 正则表达式

# ^ 匹配文本的开始字符   $ 匹配文本结束的字符  
SELECT 'cxwstart' REGEXP '^c', 'cxwstart' REGEXP 't$','cxwstart' REGEXP 'xw'
FROM DUAL; 

# . 'b.t' 匹配b到t之间有一个字符的字符串  big bit but
#有两个就是 .. 
SELECT 'cxwlearning' REGEXP 'cxwlearni.g','cxwlearning' REGEXP 'cxwlearn..g'
FROM DUAL;           #cxwlearni.g 匹配cxwlearni到g之间有一个字符的字符串

# '[ab]' 字符包含a或者b的字符串
SELECT 'cxwacd' REGEXP '[ab]'
FROM DUAL;

3.逻辑运算符

  1. 逻辑运算符主要用来判断表达式的真假
  2. 返回值为0、1或者NULL
  3. OR(||) AND(&&) NOT(!) XOR(逻辑异或)

3.1.OR(||) AND(&&)

# OR(||) AND(&&)  AND的优先级高于OR ,先对AND两边的操作数进行操作再进行OR
#查询部门是10,20的员工信息
SELECT employee_id,last_name,salary,department_id
FROM employees
#where department_id =10 or department_id=20;
WHERE department_id =50 AND salary >6000;

NOT(!)

# NOT(!)
#查询工资不在6000-8000的员工信息
SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE salary NOT BETWEEN 6000 AND 8000;

#查询commission_pct 不为空的员工信息
SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE commission_pct IS NOT NULL; 

XOR(逻辑异或)

# XOR 表达式两边 只满足两边其中的一个条件
SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE department_id =50 XOR salary >6000;

4.位运算符

位运算符是在二进制数上进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算,
最后将计算结果从二进制变回十进制数

位运算符:&(与) |(或) ^(异或) ~(取反) <<(左移) >>(右移)

4.1.&(与) |(或) ^(异或) ~(取反)

# 转换为二进制
# & 有假则假,全真为真
# | 有真则真,全假为假
# ^ 不同才为1

SELECT 12&5 ,12|5,12^5
FROM DUAL;

# ~按位取反 1->二进制 00000001 ~1->二进制 11111110
SELECT 10 & ~1
FROM DUAL;

4.2.<<(左移) >>(右移)

# << >>
#在一定范围内满足,每左移一位,相当于乘以2,没向右移一位,相当于除以2
SELECT 4<<1 ,8>>1
FROM DUAL;

练习

1.选择工资不在5000到12000的员工的姓名和工资

SELECT employee_id,last_name,salary
FROM employees
#where salary not between 5000 and 12000;
WHERE salary <5000 OR salary >12000;

2.选择在20号或50号部门工作的员工姓名和部门号

SELECT employee_id,last_name,department_id
FROM employees
#WHERE department_id in(20,50);
WHERE department_id =20 OR department_id=50;

3.选择公司中没有管理者的员工姓名和部门号

FROM employees
#where manager_id is null;
#WHERE ISNULL(manager_id);
WHERE manager_id <=>NULL;

4. 选择公司中有奖金的员工姓名,工资和奖金级别

SELECT last_name,salary,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;

SELECT last_name,salary,commission_pct
FROM employees
WHERE NOT commission_pct <=>NULL;

5.选择员工姓名的第三个字母是a的员工姓名 模糊查询

SELECT employee_id, last_name,salary
FROM employees
WHERE last_name LIKE'__a%';

6.选择姓名中有字母a和k的员工姓名

SELECT employee_id,last_name,salary
FROM employees
WHERE last_name LIKE '%a%k%' OR last_name LIKE '%k%a%';

SELECT employee_id,last_name,salary
FROM employees
WHERE last_name LIKE '%a%' AND last_name LIKE '%k%';

7.显示出表中 employees 表中 first_name 中以’e’结尾的员工信息

SELECT employee_id,first_name,salary
FROM employees
WHERE first_name REGEXP 'e$';  #以'e'开头的员工信息 REGEXP '^e';

SELECT employee_id,first_name,salary
FROM employees
WHERE first_name LIKE '%e';  

8.显示出表 employees 表中 部门编号在 80 到100之间的姓名和工种

SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE department_id BETWEEN 80 AND 100;

9.显示出表employees 的manager_id 是100,101,110的员工姓名,工资,管理者id

SELECT last_name,salary,manager_id
FROM employees
WHERE manager_id IN(100,101,110);

猜你喜欢

转载自blog.csdn.net/cyaya6/article/details/126043895
今日推荐