MySQL:select语句与运算符

339 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情


SQL语句

分类

  • DDL语句:数据定义语句(Data Define Language),例如:创建(create),修改(alter),删除(drop)等
  • DML语句:数据操作语句,例如:增(insert),删(delete),改(update),查(select)

因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类,叫DQL(数据查询语言)或DRL(获取)

  • DCL语句:数据控制语句,例如: grant,commit,rollback等

这三种语句是数据库通用语句,此外,MySQL数据库存在和其他数据库不同的语句,比如USE、SHOW、SET语句。


语法规范

  1. SQL语句不区分大小写,习惯上写成大写
  2. 命名时:尽量使用26个英文字母,0-9数字,下划线,不要使用其他符号
  3. 建议不要使用Mysql的关键字等来作为表名、字段名、数据库名等,如果不小心使用,请在SQL语句中使用(飘号``)引起来
  4. 数据库和表名、字段名等对象名中间不要包含空格
  5. 同一个软件中,数据库不能重名;同一个数据库,表不能重名;同一个表,字段不能重名

注释

  1. #加注释内容
  2. --加一个空格,后面再跟注释内容
  3. 多行注释:/*注释内容 */

标点符号

mysql脚本中标点符号的要求如下:

  • 本身成对的标点符号必须成对
  • 所有标点符号必须英文状态下半角输入方式下输入。

几个特殊的标点符号:

  • 小括号():在创建表、添加数据、函数使用、子查询、计算表达式等等会用()表示某个部分是一个整体结构
  • 单引号":字符串和日期类型的数据值使用单引号""引起来,数值类型的不需要加标点符号。
  • 双引号"":列的别名可以使用双引号"",给表名取别名不要使用双引号。

select语句

  • select最简单的形式是,查看某个常量、变量和表达式 比如:
SELECT 1;
#查看现在的时间
SELECT NOW()
  • 查看某个表的数据:
  1. SELECT* FROM 表名称; 这个是针对于选择好了哪个数据库进行操作。
  2. SELECT* FROM 数据库名.表名称;

(*)表示所有行所有列

  • 查看某些列的数据:SELECT 字段列表 FROM【数据库名.】表名
#查stu表的name列数据
SELECT `name` FROM stu;
  • 查看某些行的数据:
#比如查张三那一行的数据
SELECT * FROM stu WHERE `name` = '张三';
  • 查看某些行某些列的数据:
#比如查看张三的id
SELECT id FROM stu WHERE `name` = '张三';
  • 给查询结果取别名
SELECT id AS 学号

AS可以省略不写

  • 结果去重

比如有两行一样的数据,查询时会都显示,想显示一行可以这么写

SELECT distinct 字段列表 FROM 表名称 【WHERE 条件】;

运算符

算符运算符

  • 加:+
  • 减:-
  • 乘:*
  • 除:/(正常除) div (只保留整数)
  • 求模:%
select 1+2;
select 2-1;
select 2*8;
select 9 div 2; # 4
select 9/2; # 4.5000
select 9%2;

比较运算符

  • 大于:>
  • 小于:<
  • 大于等于:>=
  • 小于等于:<=
  • 判断等于:=(不能用于null判断)
  • 判断不等于:!= 或 <>(不能用于null判断)

注意:

  • 如果成立,显示的结果是1
  • null值的判断用 IS 或 <=>

👇比如我有一张表里面的name属性我要找有空值的和没空值的

select *from employees where `name` <=> null; # 取所有name空值的
select *from employees where `name` is null;

select *from employees where'name' is not null;# 取所有name不为空值的
select *from employees where !('name' <=> null);

区间范围比较运算符

  • 区间范围:

between x and y

not between x and y

  • 集合范围:

in (x,x,x)

not in(x,x,x)

#查询薪资在[10000,15000]之间的员工
SELECT * FROM t_employee WHERE salary BETWEEN 10000 AND 15000;

#查询薪资不在[10000,15000]之间的员工
SELECT * FROM t_employee WHERE salary NOT BETWEEN 10000 AND 15000;

#查询1,2,3部门的员工
SELECT * FROM t_employee WHERE did IN(1,2,3);

#查询不是1,2,3部门的员工
SELECT * FROM t_employee WHERE did NOT IN(1,2,3);

模糊匹配运算符

用LIKE关键字

%:代表任意个字符

_:代表一个字符,如果两个下划线代表两个字符

#查询名字中包含“冰”字 的员工
SELECT * FROM t_employee WHERE ename LIKE '%冰%';

#查询名字中包含3个字,最后一个是“冰”字 的员工
SELECT * FROM t_employee WHERE ename LIKE '__冰';

逻辑运算符

  • 逻辑与:&& 或 and
  • 逻辑或:|| 或 or
  • 逻辑非: ! 或 not
  • 逻辑异或: xor
#查询薪资高于15000的男员工
SELECT * 
FROM t_employee
WHERE salary > 15000 && gender = '男';

SELECT * 
FROM t_employee
WHERE salary > 15000 AND gender = '男';

#查询薪资高于15000,或者他是男员工
SELECT * 
FROM t_employee
WHERE salary > 15000 || gender = '男';

#查询薪资低于10000,或者入职日期在2016-1-1之前的员工
SELECT * 
FROM t_employee
WHERE salary < 10000 || hiredate < '2016-1-1';

#查询入职日期不在 2016-1-1之前的员工
SELECT * FROM t_employee WHERE hiredate >= '2016-1-1';
SELECT * FROM t_employee WHERE !(hiredate < '2016-1-1');


#查询薪资低于10000,但是入职日期是在2016-1-1之后的员工
#或薪资大于等于10000,但是入职日期是在2016-1-1之前的员工
/*
分析:要么满足薪资低于10000,要么满足入职日期在2016-1-1之前
只能满足一个。
*/
SELECT salary,hiredate
FROM t_employee
WHERE salary<10000 XOR hiredate < '2016-1-1';

NULL值判断和计算

  1. 判断时
  • xx is null
  • xx is not null
  • xx <=> null
  1. 计算时ifnull(xx,代替值) 当xx是null时,用代替值计算
#计算所有员工的实发工资
/*
实发工资 = salary * (1+奖金比例)
*/
SELECT ename AS 姓名,
   salary AS 月薪,
   commission_pct AS 奖金比例,
   salary * (1+IFNULL(commission_pct,0)) AS 实发工资
FROM t_employee;