基本MySQL语句
- SELECT
- SELECT ······ FROM ······
- 列的别名
- 去除重复行
- 空值
- 着重号
- 算术运算符
- 加法( + )
- 减法( - )
- 乘法( * )
- 除法( / 或DIV)
- 求模( % 或MOD)
- 比较运算符
- 等于( = )
- 安全等于( <=> )
- 不等于( != 或 <> )
- 小于( < )
- 小于等于( <= )
- 大于( > )
- 大于等于( >= )
- 属于( IN (value1,value2,...) )
- 不属于( NOT IN (value1,value2,...) )
- 为空( IS NULL )
- 不为空( IS NOT NULL )
- 最小值( LEAST(value1,value2,...) )
- 最大值( GREATEST(value1,value2,...) )
- 两值之间( value BETWEEN ······ AND ······ )
- 模糊匹配( LIKE )
- 正则表达式( REGEXP )
- 逻辑运算符
- 逻辑非( ! 或 NOT )
- 逻辑与( && 或 AND )
- 逻辑或( || 或 OR )
- 逻辑异或( XOR )
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;
比较运算符
等于( = )
- 如果等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
- 如果等号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
- 如果等号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
- 如果等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
- 不能直接进行比较 “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;
安全等于( <=> )
- 如果等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
- 如果等号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
- 如果等号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
- 可以直接进行比较 “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,相等则返回0。
-
不等于运算符不能判断NULL值。如果两边的值有任意一个为NULL,或两边都为NULL,则结果为NULL。
-
如果等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否不相等。
-
如果等号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
-
如果等号两边的值一个是整数,另一个是字符串,则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;
小于( < )
- 如果小于号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
- 如果小于号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
- 如果小于号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
- 如果小于号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
- 判断结果若小于则为1,若不小于则为0,但不能与 NULL 进行比较。
#筛选出工资小于3000的员工id,姓名和工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE salary < 3000;
小于等于( <= )
- 如果小于等于号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
- 如果小于等于号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
- 如果小于等于号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
- 如果小于等于号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
- 判断结果若小于等于则为1,若不小于等于则为0,但不能与 NULL 进行比较。
#筛选出工资小于等于3000的员工id,姓名和工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE salary <= 3000;
大于( > )
- 如果大于号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
- 如果大于号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
- 如果大于号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
- 如果大于号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
- 判断结果若大于则为1,若不大于则为0,但不能与 NULL 进行比较。
#筛选出工资大于3000的员工id,姓名和工资
SELECT emp_id,emp_name,salary
FROM emp
WHERE salary > 3000;
大于等于( >= )
- 如果大于等于号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
- 如果大于等于号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
- 如果大于等于号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
- 如果大于等于号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
- 判断结果若大于等于则为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,…) )
- 多个整数值进行比较,则输出值最小的整数。
- 多个整数和浮点数值进行比较,则将值最小的以浮点型输出。
- 多个表达式值进行比较,则将表达式计算后的最小结果值输出。
- 多个字符串进行比较,则对每个字符同时进行比较,如果该字符最小,则认定该字符串最小,直接输出。
- 如果进行比较的值存在空值,则直接将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,…) )
- 多个整数值进行比较,则输出值最大的整数。
- 多个整数和浮点数值进行比较,则将值最大的以浮点型输出。
- 多个表达式值进行比较,则将表达式计算后的最大结果值输出。
- 多个字符串进行比较,则对每个字符同时进行比较,如果该字符最大,则认定该字符串最大,直接输出。
- 如果进行比较的值存在空值,则直接将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 )
- ‘^value’匹配以 value 后面的字符开头的字符串。
- ‘value$’匹配以 value 前面的字符结尾的字符串。
- ‘value1.value2’匹配 value1 和 value2之间存在一个字符的字符串。注:几个 ‘.’ 代表之间存在几个字符。
- “[value1value2···]”匹配包含有 value1 或 value2 或 value3 的字符串。例如,“[abc]”匹配“a”或“b”或“c”,“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
- ‘value1value2’匹配在 value2 之前存在零个或多个 value1 的字符串。例如,“x”匹配任何数量的‘x’字符,“[0-9]”匹配任何数量的数字,而“”匹配任何数量的任何字符。
- ‘value+’匹配至少存在一个或多个value的字符串。
- '[^…]匹配不包含[]内的任何一字符的字符串。
- 'value{n}'匹配至少包含 n 次连续出现的 value 字符的字符串。
- '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;