开启掘金成长之旅!这是我参与「掘金日新计划 · 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语句。
语法规范
- SQL语句不区分大小写,习惯上写成大写
- 命名时:尽量使用26个英文字母,0-9数字,下划线,不要使用其他符号
- 建议不要使用Mysql的关键字等来作为表名、字段名、数据库名等,如果不小心使用,请在SQL语句中使用(飘号``)引起来
- 数据库和表名、字段名等对象名中间不要包含空格
- 同一个软件中,数据库不能重名;同一个数据库,表不能重名;同一个表,字段不能重名
注释
- #加注释内容
- --加一个空格,后面再跟注释内容
- 多行注释:/*注释内容 */
标点符号
mysql脚本中标点符号的要求如下:
- 本身成对的标点符号必须成对
- 所有标点符号必须英文状态下半角输入方式下输入。
几个特殊的标点符号:
- 小括号():在创建表、添加数据、函数使用、子查询、计算表达式等等会用()表示某个部分是一个整体结构
- 单引号":字符串和日期类型的数据值使用单引号""引起来,数值类型的不需要加标点符号。
- 双引号"":列的别名可以使用双引号"",给表名取别名不要使用双引号。
select语句
- select最简单的形式是,查看某个常量、变量和表达式 比如:
SELECT 1;
#查看现在的时间
SELECT NOW()
- 查看某个表的数据:
- SELECT* FROM 表名称; 这个是针对于选择好了哪个数据库进行操作。
- 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值判断和计算
- 判断时
- xx is null
- xx is not null
- xx <=> null
- 计算时ifnull(xx,代替值) 当xx是null时,用代替值计算
#计算所有员工的实发工资
/*
实发工资 = salary * (1+奖金比例)
*/
SELECT ename AS 姓名,
salary AS 月薪,
commission_pct AS 奖金比例,
salary * (1+IFNULL(commission_pct,0)) AS 实发工资
FROM t_employee;