一、SQL语句的分类(任何一条sql语句以分号结尾;SQL语句不区分大小写)
DQL(数据查询语言):查询语句,凡是select都是DQL。
DML(数据操作语言):insert、delete、update,对表当中的数据进行增删改。
DDL(数据定义语言):create、drop、alter,对表结构的增删改。
TCL(事务控制语言):commit提交事务,rollback回滚事务。
DCL(数据控制语言):grant授权,revoke撤销权限等。
二、MySQL命令(不是SQL语句)
MySQL指令在windows黑窗口(dos)中使用,注意要先设置好环境变量。
1.启动MySQL服务:net start mysql
2.登录:mysql -u<用户名,一般为root> -p<密码>
说明:登录成功会现实"mysql<“。
3.查看所有的数据库:show databases;
4.创建一个数据库(注意是MySQL命令,不是SQL语句):create database <数据库名>;
5.查询当前使用的数据库:select database();
6.删除数据库:drop database <数据库名>;
7.查看表结构:desc <表名>;
上图中表示表dept有三个字段,分别为DEPTNO、DNAME、LOC。
8.使用该数据库:use <数据库名>;
9.查看当前使用的数据库中有哪些表:show tables;
10.初始化数据:source <.sql文件的全目录>
例如:
说明:.sql文件被称为"sql脚本”,是一种普通文本文件,该文件中编写了大量的sql语句。直接使用source命令可以执行sql脚本。sql脚本中的数据量太大的时候,无法打开,直接使用source命令完成初始化。
11.退出mysql:可使用\q、quit或exit。(不需要加分号)
12.查看创建表的语句:show create table <表名>;
例如:
三、SQL查询语句
1.简单查询语句
语法格式:select 字段名1,字段名2,字段名3,… from 表名;
例如:
再如:
从上图中可以看出,select语句中的字段可以参与数学运算。
注意:在sql语句中的数学运算中如果有一个或多个字段数值为null,则数学运算结果为null。
此外,可以给使用了数学运算的字段重命名,使用"as <别名>",as关键字可以省略:
若是使用了中文命名字段可以用单引号括起来:
省略as关键字:
2.条件查询语句
语法格式:select 字段,字段,… from 表名 where 条件;
执行顺序:先from,后where,最后select。
示例一:
注意:ename的属性字段类型为varchar,在sql语句中值需要使用单引号括起来。
注意:between…and…一定是小数据在前,大数据在后。
补充:where中and的优先级大于or。如果运算符的优先级不确定可以在sql语句中加小括号。
示例二(and与or 的优先级):
示例三(条件查询in):
注意:也可以使用“not in”。
示例四(模糊查询like):
在模糊查询中,必须掌握两个特殊的符号,一个是%,一个是 (下划线)。%代表任意多个字符,(下划线)代表任意1个字符。
如果需要有下划线字符,使用转义字符:
3.排序(升序、降序)
先执行from,再执行where,再执行select,最后执行order by。
注意:多个字段同时排序时,从左到右考虑(越靠前的字段越起主导作用),只有前面的字段相同时才接着考虑后面的字段。
4.分组函数
分组函数的特点为输入多行,输出的结果为1行,即分组函数是多行处理函数(相对于单行处理函数而言)。
注意:分组函数自动忽略null,即分组函数中指定的字段为null的记录不会被处理。
单行处理函数,示例ifnull()函数。例如:
上例中,若comm的值为null则用0代替。
注意:SQL语句中分组函数不可以直接出现在where子句中(原因介绍了group by后解释)。
例如:
上图中的正确写法(子查询后序文章说明):
补充:count(*)与count(<字段名>)的区别为前者为统计的记录总数,后者为统计的指定字段不为null的记录个数。
5.group by和having
注意:先from,再group by,最后select。
group by:按照某个字段或某些字段进行分组。
having:having是对分组之后的数据进行再次过滤。
补充:分组函数一般会和group by联合使用,并且任何一个分组函数都是在group by语句执行结束之后才会执行的。当没有group by时,整张表的数据会自成一组。
解释:分组函数不能直接在where子句中是因为group by在where子句之后执行,而分组函数在group by子句之后执行。
再例:
但下述代码有问题:
注意:使用了group by语句后,select后只允许出现参加分组的字段和分组函数。
上图中的sql语句在oracle中会报错,但是在mysql中不会报错(oracle语法严谨,mysql语法松散)。虽然mysql语句不会报错,但是select后返回的ename是随机的,无意义。
补充:多个字段联合分组
要求是相同部门、相同工作岗位为一组,所以分组需考虑两个字段,sql语句如下:
having字段的使用
示例:
其实上述sql语句也可以写成如下形式,且执行效率更高:
因为最大值也可以在where时就进行过滤。但如果是找出“每个部门的平均薪资大于2000”就不能使用where进行过滤,必须使用having子句进行过滤:
group by和having的区别:
where子句是作用在from子句中执行结果的多个记录上,没有from子句就不能有where子句。having子句是作用在group by子句的执行结果的多个记录上,没有group by子句就不能有having子句。
6.去除重复记录
在select 与字段序列中间加一个distinct关键字即可:
再例:
总结:select子句的执行顺序。
语法格式:
select 字段名1 [别名1],字段名2 [别名1],…
from 表名
where …
group by …
having …
order by …
执行顺序为:先from,再where,再group by,再having,再select,最后order by输出。