MySQL的基本语句(SELECT型)

SELECT

SELECT ······ FROM ······

从表中查找某数据或者符合相关要求的数据。

SELECT 所查找的数据
FROM 数据表;

SELECT emp_id,emp_name
FROM emp;

在这里插入图片描述

# * 代表所有数据,即查找符合要求的所有数据列
SELECT *
FROM emp;

在这里插入图片描述

列的别名

用别名替换所要输出的数据列名。

SELECT 原要查询的数据列名 别名
FROM 数据表;


SELECT 原要查询的数据列名 AS 别名
FROM 数据表;

SELECT emp_name name,emp_id
FROM emp;

在这里插入图片描述

SELECT emp_name AS name,emp_id
FROM emp;

在这里插入图片描述

去除重复行

查找去除存在的重复行数据后的数据。

SELECT DISTINCT 所要查找的数据列
FROM 数据表;

SELECT DISTINCT salary
FROM emp;

在这里插入图片描述

空值

NULL 表示空值,空值代表里边没有数据,不代表它等于 0 ,同时空值也不代表空字符串,空字符串的长度是 0 ,而空值的长度为空,并且空值与任何数计算,计算结果都为空,空值在MySQL中也占有存储空间。

SELECT password*10
FROM t_user;

在这里插入图片描述

着重号

如果数据库表名或者其他名与数据库关键字冲突时,我们可以用着重号(``)将数据库表名或者其他名标注出来,让数据库得以知道该值不是数据库关键字。

SELECT password AS `order`
FROM t_user;

在这里插入图片描述

算术运算符

加法( + )

整数 + 整数 = 整数
整数 + 浮点数 = 浮点数
整数 + 非数值类型 = 整数/浮点数(‘0’ 、‘1’等可以转换为相应数值的转换后进行运算,‘a’、’%'等不可以转换为相应数值的当作 0 进行运算)

SELECT 所需查找的数据列 + 整数/浮点数
FROM 数据表;

SELECT salary+1000
FROM emp;

在这里插入图片描述

减法( - )

整数 - 整数 = 整数
整数 - 浮点数 = 浮点数
整数 - 非数值类型 = 整数/浮点数(‘0’ 、‘1’等可以转换为相应数值的转换后进行运算,‘a’、’%'等不可以转换为相应数值的当作 0 进行运算)

SELECT 所需查找的数据列 - 整数/浮点数
FROM 数据表;

SELECT salary-1000
FROM emp;

在这里插入图片描述

乘法( * )

整数 * 整数 = 整数
整数 * 浮点数 = 浮点数
浮点数 * 浮点数 = 浮点数

SELECT 所需查找的数据列 * 整数/浮点数
FROM 数据表;

SELECT emp_id,salary*4.78 AS salary
FROM emp;

在这里插入图片描述

除法( / 或DIV)

数 / 整数 = 浮点数(最多保留4位小数)
数 / 整数1 = 它本身
数 / 浮点数1 = 浮点数(数值为它本身,最多保留4位小数)
0不能作为除数,否则计算结果为NULL

SELECT 所需查找的数据列 / 整数/浮点数
FROM 数据表;

SELECT emp_id,salary/4.78 AS salary
FROM emp;

在这里插入图片描述

求模( % 或MOD)

SELECT 所需查找的数据列
FROM 数据表
WHERE 某数据列 % 某值 = 某条件;

#筛选出id为偶数的员工的工资
SELECT emp_id,salary
FROM emp
WHERE emp_id % 2=0;

在这里插入图片描述

比较运算符

等于( = )

  1. 如果等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
  2. 如果等号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
  3. 如果等号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
  4. 如果等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
  5. 不能直接进行比较 “NULL=NULL”,比较结果为 0 。
SELECT 1=1,1=3,2='b',2='2','a'='a','abd'='abcd',1+3=2+2,1+3=2+3,6=NULL,NULL=NULL
FROM DUAL;

在这里插入图片描述

安全等于( <=> )

  1. 如果等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
  2. 如果等号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
  3. 如果等号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
  4. 可以直接进行比较 “NULL=NULL”,比较结果为 1 。
SELECT 1=1,1=3,2='b',2='2','a'='a','abd'='abcd',1+3=2+2,1+3=2+3,6<=>NULL,NULL<=>NULL
FROM DUAL;

在这里插入图片描述

不等于( != 或 <> )

  1. 用于判断两边的数字、字符串或者表达式的值是否不相等,如果不相等则返回1,相等则返回0。

  2. 不等于运算符不能判断NULL值。如果两边的值有任意一个为NULL,或两边都为NULL,则结果为NULL。

  3. 如果等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否不相等。

  4. 如果等号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。

  5. 如果等号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。

SELECT 1!=1,1<>3,2!='b',2<>'2','a'!='a','abd'<>'abcd',1+3!=2+2,1+3<>2+3,6!=NULL,NULL<>NULL
FROM DUAL;

在这里插入图片描述

小于( < )

  1. 如果小于号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
  2. 如果小于号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
  3. 如果小于号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
  4. 如果小于号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
  5. 判断结果若小于则为1,若不小于则为0,但不能与 NULL 进行比较。
#筛选出工资小于3000的员工id,姓名和工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE salary < 3000;

在这里插入图片描述

小于等于( <= )

  1. 如果小于等于号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
  2. 如果小于等于号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
  3. 如果小于等于号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
  4. 如果小于等于号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
  5. 判断结果若小于等于则为1,若不小于等于则为0,但不能与 NULL 进行比较。
#筛选出工资小于等于3000的员工id,姓名和工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE salary <= 3000;

在这里插入图片描述

大于( > )

  1. 如果大于号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
  2. 如果大于号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
  3. 如果大于号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
  4. 如果大于号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
  5. 判断结果若大于则为1,若不大于则为0,但不能与 NULL 进行比较。
#筛选出工资大于3000的员工id,姓名和工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE salary > 3000;

在这里插入图片描述

大于等于( >= )

  1. 如果大于等于号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
  2. 如果大于等于号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
  3. 如果大于等于号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
  4. 如果大于等于号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
  5. 判断结果若大于等于则为1,若不大于等于则为0,但不能与 NULL 进行比较。
#筛选出工资大于等于3000的员工id,姓名和工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE salary >= 3000;

在这里插入图片描述

属于( IN (value1,value2,…) )

筛选出数据值= value1 或 =value2 或 =value3 ······的值,value1,value2,value3······没有先后顺序之分。

#筛选出工资为3000或4000或5000的员工id,姓名和工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE salary IN (3000,4000,5000);

在这里插入图片描述

不属于( NOT IN (value1,value2,…) )

筛选出数据值!= value1 和 !=value2 和 !=value3 ······的值,value1,value2,value3······没有先后顺序之分。

#筛选出工资不为3000、4000、5000的员工id,姓名和工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE salary NOT IN (3000,4000,5000);

在这里插入图片描述

为空( IS NULL )

判断值、字符串或表达式是否为NULL,为NULL则为1,不为NULL则为0。

#筛选出电话为NULL的员工的id和姓名
SELECT emp_id,emp_name
FROM emp
WHERE telephone-2000 IS NULL;

在这里插入图片描述

不为空( IS NOT NULL )

判断值、字符串或表达式是否为NULL,为NULL则为0,不为NULL则为1。

#筛选出电话不为NULL的员工的id和姓名
SELECT emp_id,emp_name
FROM emp
WHERE telephone-2000 IS NOT NULL;

在这里插入图片描述

最小值( LEAST(value1,value2,…) )

  1. 多个整数值进行比较,则输出值最小的整数。
  2. 多个整数和浮点数值进行比较,则将值最小的以浮点型输出。
  3. 多个表达式值进行比较,则将表达式计算后的最小结果值输出。
  4. 多个字符串进行比较,则对每个字符同时进行比较,如果该字符最小,则认定该字符串最小,直接输出。
  5. 如果进行比较的值存在空值,则直接将NULL值输出。
#筛选出多个值中的最小值
SELECT LEAST(1,2,3),LEAST(1.5,2,1),LEAST(1+4,NULL,1-9),LEAST('adsdftas','1375896','fesa')
FROM DUAL;

在这里插入图片描述

最大值( GREATEST(value1,value2,…) )

  1. 多个整数值进行比较,则输出值最大的整数。
  2. 多个整数和浮点数值进行比较,则将值最大的以浮点型输出。
  3. 多个表达式值进行比较,则将表达式计算后的最大结果值输出。
  4. 多个字符串进行比较,则对每个字符同时进行比较,如果该字符最大,则认定该字符串最大,直接输出。
  5. 如果进行比较的值存在空值,则直接将NULL值输出。
#筛选出多个值中的最大值
SELECT GREATEST(1,2,3),GREATEST(1.5,2,1),GREATEST(1+4,NULL,1-9),GREATEST('adsdftas','1375896','fesa')
FROM DUAL;

在这里插入图片描述

两值之间( value BETWEEN ······ AND ······ )

判断某值范围是否属于 [a,b] ,若属于则为1,若不属于则为0,同时a 和 b 必须满足 a<=b。

#筛选出工资属于[3000,4000]的员工id,姓名和工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE salary BETWEEN 3000 AND 4000;

在这里插入图片描述

模糊匹配( LIKE )

LIKE运算符主要用来匹配字符串,通常用于模糊匹配,如果满足条件则返回1,否则返回0。如果给定的值或者匹配条件为NULL,则返回结果为NULL。

‘a%’:以 a 或 A 开头的字符串
‘%a%’:存在 a 或 A 的字符串
‘a%’:以 a 或 A 结尾的字符串
a%':第 2 个字符是 a 或 A 的字符串
‘__a%’:第 3 个字符是 a 或 A 的字符串
'
_%’:第 2 个字符是 _ 的字符串

#名字是以 a 或 A 开头的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name LIKE 'a%';

在这里插入图片描述

#名字存在 a 或 A 的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name LIKE '%a%';

在这里插入图片描述

#名字是以 a 或 A 结尾的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name LIKE '%a';

在这里插入图片描述

#名字中第二个字母是 a 或 A 的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name LIKE '_a%';

在这里插入图片描述

#名字中第三个字母是 a 或 A 的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name LIKE '__a%';

在这里插入图片描述

#名字中第二个符号是 _ 的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name LIKE '_\_%';

在这里插入图片描述

#名字中第二个符号是 _ 的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name LIKE '_$_%' ESCAPE '$';

在这里插入图片描述

正则表达式( REGEXP )

  1. ‘^value’匹配以 value 后面的字符开头的字符串。
  2. ‘value$’匹配以 value 前面的字符结尾的字符串。
  3. ‘value1.value2’匹配 value1 和 value2之间存在一个字符的字符串。注:几个 ‘.’ 代表之间存在几个字符。
  4. “[value1value2···]”匹配包含有 value1 或 value2 或 value3 的字符串。例如,“[abc]”匹配“a”或“b”或“c”,“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
  5. ‘value1value2’匹配在 value2 之前存在零个或多个 value1 的字符串。例如,“x”匹配任何数量的‘x’字符,“[0-9]”匹配任何数量的数字,而“”匹配任何数量的任何字符。
  6. ‘value+’匹配至少存在一个或多个value的字符串。
  7. '[^…]匹配不包含[]内的任何一字符的字符串。
  8. 'value{n}'匹配至少包含 n 次连续出现的 value 字符的字符串。
  9. 'value{n,m}'匹配至少包含 n 次连续出现的 value 字符,并且至多包含 m 次连续出现的 value 字符的字符串。
#名字是以 a 开头的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name REGEXP '^a';

在这里插入图片描述

#名字是以 a 结尾的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name REGEXP 'a$';

在这里插入图片描述

#名字中存在 a、b、c 字母的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name REGEXP '[a-c]';

在这里插入图片描述

#名字中存在 a 和 c 且 两字符之间间隔一个字符的员工的id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name REGEXP 'a.c';

在这里插入图片描述

#名字中包含 a 和 x 且在 x 之前存在零个或多个 a 的员工的id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name REGEXP 'a*x';

在这里插入图片描述

#名字中包含一个或多个 if 的员工的id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name REGEXP 'if+';

在这里插入图片描述

#名字中不包含 if 的员工的id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name REGEXP '[^if]';

在这里插入图片描述

#名字中至少有 2 次连续出现a的员工的id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name REGEXP 'a{2}';

在这里插入图片描述

#名字中至少有 1 次,至多有 2 次连续出现a的员工的id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name REGEXP 'a{1,2}';

在这里插入图片描述

逻辑运算符

逻辑非( ! 或 NOT )

当给定的值为0时返回1;当给定的值为非0值时返回0;当给定的值为NULL时,返回NULL。

#联系方式不为NULL的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE !(telephone <=> NULL);

在这里插入图片描述

#联系方式不为NULL的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE telephone IS NOT NULL;

在这里插入图片描述

逻辑与( && 或 AND )

当给定的所有值均为非0值,并且都不为NULL时,返回1;当给定的一个值或者多个值为0时则返回0;否则返回NULL。

#姓名以 a 开头同时也以 a 结尾的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name LIKE 'a%' && emp_name LIKE '%a';

在这里插入图片描述

#姓名以 a 开头同时也以 a 结尾的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE emp_name LIKE 'a%' AND emp_name LIKE '%a';

在这里插入图片描述

逻辑或( || 或 OR )

当给定的值都不为NULL,并且任何一个值为非0值时,则返回1,否则返回0;当一个值为NULL,并且另一个值为非0值时,返回1,否则返回NULL;当两个值都为NULL时,返回NULL。

#工资为3000或5000的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE salary=3000 || salary=5000;

在这里插入图片描述

#工资为3000或5000的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE salary=3000 OR salary=5000;

在这里插入图片描述

逻辑异或( XOR )

当给定的值中任意一个值为NULL时,则返回NULL;如果两个非NULL的值都是0或者都不等于0时,则返回0;如果一个值为0,另一个值不为0时,则返回1。

#联系方式为NULL的员工id、姓名、工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE (telephone XOR 1) IS NULL;

在这里插入图片描述

排序( ORDER BY )

使用 ORDER BY 进行排序:

  • ASC(ascend):升序
  • DESC(descend):降序
  • ORDER BY 语句要在 SELECT语句的结尾

单列排序

  1. 如果没有使用排序,默认情况下排序是按照数据插入的顺序进行排列的
  2. WHERE 语句要在 FROM 语句之后,在 ORDER BY 语句之前
  3. 列的别名可以在 ORDER BY 中进行使用,但不能在 WHERE 中进行使用
#查询所有员工信息
SELECT *
FROM emp;

在这里插入图片描述

#按照工资升序来显示所有员工信息
SELECT *
FROM emp
ORDER BY salary ASC;

在这里插入图片描述

#按照工资降序来显示所有员工信息
SELECT *
FROM emp
ORDER BY salary DESC;

在这里插入图片描述

#按照工资降序显示所有年薪大于100000的员工的信息
SELECT *
FROM emp
WHERE salary*12>100000
ORDER BY salary DESC;

在这里插入图片描述

#按照年薪降序来显示员工姓名、年薪
SELECT emp_name,salary *12 AS 'annual_salary'
FROM emp
ORDER BY annual_salary DESC ;

在这里插入图片描述

多列排序

对某一数据列进行排序时,如果该数据列存在相同数据,则可以通过设置二级排序(或多级排序)来进一步排序。
对数据列进行排序时,如果不存在不同数据,则不再进入二级排序,直接排序结束;如果存在相同数据,则进行二级排序,若二级排序可以比较出,则直接排序结束,否则进入三级排序······

SELECT 所需查出的信息
FROM 数据表
WHERE 筛选条件
ORDER BY 一级排序,二级排序,三级排序······;

#对年薪不在[40000,90000]的员工按照年薪降序,姓名字符长度升序来显示员工姓名、年薪
SELECT emp_name,salary *12 AS 'annual_salary'
FROM emp
WHERE (salary *12) NOT BETWEEN 40000 AND 90000
ORDER BY annual_salary DESC,LENGTH(emp_name) ASC;

在这里插入图片描述

分页( LIMIT )

SELECT 所需查出的信息
FROM 数据表
WHERE 筛选条件
ORDER BY 一级排序,二级排序,三级排序······
LIMIT 偏移量,每页显示的数据量;

  1. 偏移量是指向下偏移的数据,如果偏移量是 0 ,就说明现在指针指的是第一行数据;如果偏移量是 1 ,就说明现在指针指的是第二行数据。
  2. 偏移量是 0 时,偏移量可以省略,但偏移量不是 0 时,偏移量不可以省略。
  3. 偏移量和展现数据的关系:LIMIT(pageNo-1)*pageSize,pageSize(pageNo代表当前页数,pageSize代表每页多少数据)
#显示前20条员工信息
SELECT *
FROM emp
LIMIT 20;

在这里插入图片描述

#显示40~60条员工信息
SELECT *
FROM emp
LIMIT 40,20;

在这里插入图片描述

#对年薪不在[40000,90000]的员工按照年薪降序,姓名字符长度升序来显示前10条员工姓名、年薪信息
SELECT emp_name,salary *12 AS 'annual_salary'
FROM emp
WHERE (salary *12) NOT BETWEEN 40000 AND 90000
ORDER BY annual_salary DESC,LENGTH(emp_name) ASC
LIMIT 10;

在这里插入图片描述

IFNULL()函数

IFNULL(expression1,expression2);

  1. 如果expression1不为NULL,则IFNULL函数返回expression1; 否则返回expression2的结果。
  2. IFNULL函数根据使用的上下文返回字符串或数字。如果要返回基于TRUE或FALSE条件的值,而不是NULL,则应使用IF函数。
#获取并返回表中第二高的薪水,如果不存在第二高的薪水,则返回 null 
SELECT IFNULL(
    (SELECT DISTINCT salary
    FROM Employee
    ORDER BY salary DESC
    LIMIT 1,1),null) AS SecondHighestSalary;

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值