目录
RDBMS
RDBMS结构
数据表
SQL
导入数据
简单的查询语句 - select ... from
条件查询 - where
排序 - order by
分组函数/聚合函数/多行处理函数
分组 - grounp by 与 having
查询结果集去重 - distinct
总结
DBMS负责执行SQL语句,通过执行SQL语句来操作DB中的数据。RDBMS表示关型数据库,其中MySQL对应的就是RDBMS。
使用RDBMS时最常见的系统结构就是C/S类型,如下结构
通过网络可以实现多个客户端访问同一个数据库。在一个数据库之中最为基础的数据存储单元为数据表(table),每个表会有若干数据列(Column),而后每一列都有其对应的数据类型,在进行数据操作的时候必须依据数据类型存放。
表是数据在一个 MySQL 数据库中的存储机制,是数据库基本的存储单元。一个表包含行和列:
每个字段应该包含:
字段名,例如:id
数据类型,例如:int
相关的约束,例如:不能为null、长度等。
学习MySQL主要是学习SQL语句,通过执行不同功能将SQL语句分类如下:
DDL(数据定义语言):对表结构的增删改,create、 drop、 alter ;
DML(数据操作语言):对表中的数据进行增删改,insert、delete、update;
DQL(数据查询语言):查询语句,凡是select语句都是DQL;
TCL(事务控制语言):conmit提交事务,rollback回滚事务;
DCL(数据控制语言):grant授权、revoke撤销账户等;
为了学习SQL,需要一些数据作为学习的操作对象。
这时数据库中没有数据,需要导入数据才能进行后续操作,导入数据方法如下:
|- dos命令窗口命令:masql -uroot -p 回车 输入密码
|- show database;(包含“;”符号,这个不是SQL语句,属于MySQL命令);
|- create database bjpowernode; (MySQL命令)
|- use bjpowernode; (MySQL命令);
|-show tables;(MySQL命令)
|- source C:\Users\ren\Desktop\bjpowernode.sql (MySQL命令)
注意:数据初始化完成之后有三张数据表。
可以发现bjpowernode.sql ,这个文件以sql结尾,这样的文件被称为“sql脚本”,当一个文件的扩展文件名为.sql,并且该文件中编写了大量的sql语句,我们称之为sql脚本。直接使用source命令可以执行sql脚本。
需要通过一些语句来了解表,如下:
desc 表名:查看表的结构(MySQL命令);
select * from 表名:查看表中数据;
show create table 表名:查看创建表的语句;
范例:查看表结构
上表中:等级、最低工资、最高工资。
范例:查看表中数据
范例:查看创建表的语句
补充:常用MySQL命令:
查看当前使用的数据库:select database() ;
查看mysql版本号:select version() ;
结束当前语句:\c
退出:exit
SQL语句都是以分号结尾,并且比较特殊的是它不区分大小写,DQL的语法格式如下:
也可以在字段上进行运算,直接在字段名后加上运算,如下:
范例:在字段上加运算
此时可以发现列名不合适,此时需要给查询结果的列进行重命名,使用as关键字(可以省略as关键字),如下:
在面对字符串时,需要使用单引号进行描述。
范例:单引号的使用
查询所有字段可以使用“*”,在实际开发中不使用。
在很多情况下,只需要满足一定条件的数据记录,需要使用where关键字,语法格式:
对于条件需要使用条件运算符,条件运算符:>、<、>=、<=、<>(不等于)、!=(不等于)、between 数值1 and 数值2( [数值1,数值2] ,数值1 <= 数值2)、is null、is not null、and、or、in(等同于or)、not(主要用于is、in中)、like(模糊查询);
对于条件运算符的引用需要注意以下几点:
between and 用在字符方面是左闭右开。
使用括号,表示多个运算符连接使用。
like使用时需要掌握两个符号:%(任意多个字符)、_(任意一个字符)、\(表示转义)、其它正则运算符
null参与“结合(如:*、+等)”运算,运算结果是null,在这种情况下可以使用ifnull()函数进行处理;
|- ifnull()用法:ifnull(可能为空的数据,当作什么处理)
范例:ifnull()用法
注意在SQL中它的执行顺序:from -> where -> select;
范例:查询工资等于5000的员工姓名。
范例:找出名字中第二个字母为O的员工名字。
mysql> select job from emp where job = 'manager' or job = 'salesman'; 等价于 mysql> select job from emp where job in( 'manager', 'salesman');
如果要使用到排序,则需要关键字order by,需要明确的是order by是最后执行的语句:
默认为升序,以列子就懂了,注意字段名可以使用数字代替(不建议使用)。
范例:按照工资降序,工资一样的按照名字的升序序排,找出员工和薪资
显然越靠前的字段越先作用。
范例:找出工作为“SALESMA”员工,按照工资升序排列,order by可以和where关键字一起使用;
语法:
SQL中可以将函数分为:
单行处理函数常见:
|- length():获取参数值的字节个数
|- concat():拼接字符串
|- upper()、lower():变大小写
|-substr()、substring():截取字符串,注意索引从1开始
|-instr():返回字串的起始索引
SQL中可以将函数分为:
在MySQL提供对于某一组数据进行统计操作的时候可以使用分组函数,分组函数只有5个如下:
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
格式: select 分组函数 from .....
范例:找出员工的工资总和
范例:找出总人数
从上面的例子可以看出,分组函数会自动忽略null。
显然容易进一步思考,是否可以将分组函数与条件查询放在一起使用,下面通过一个列子来观察。
范例:找出工资高于平均工资的员工
题目:SQL中禁止分组函数出现在where语句之中?
范例:改进后的代码
分组函数也可组合起来用,下面通过一个具体的例子来看。
范例:分组函数组合使用
题目:count(*)与count(某一个字段名)的区别?
在一些情况下需要考虑属于某个属性值下的具体情况,例如:找出每个部门中最高的薪资。这样就需要使用分组,分组需要用到关键字group by。
|- 用法:select 字段名 或 分组函数 from emp group by 字段名
|- 多个字段联合起来一起分组:
|- 格式:goup by 字段1,字段2,....
在DQL中最为重要的是语法格式和执行顺序,如下:
语法格式:select 分组函数 或 字段名 或 * from ..... where ..... group by ..... having 分组函数 或 ..... order by ....;
执行顺序:from -> where -> group by -> having -> select -> order by; 注意()优先级在当前语句下优先级最高
范例:找出每个工作岗位的最高薪资
显然结果是错的,smith的工资是800,因为代码中只对job进行分组,这条语句会在Oracle中报错;
范例:改进代码
规范:当一条语句中,包含group by时,select中只能包含参加分组的字段和分组函数(包含的字段)。
范例:使用where与group by
上述程序的执行顺序:from -> where -> group by ->select;
范例:找出每个部门不同工作岗位的最高薪资
范例:找出每个部门的最高薪资,要求显示薪资大于2900的数据;
写SQL语句的技巧,一步一步的写。
第一步:
第二步:
这里面可以使用where以提升效率,先条件后分组可以提升效率;
通过以上情况,我们可以得出结论,能够使用where代替having的一定要使用where。
范例:必须用having:找出每个部门的平均薪资,并要求薪资大于2000.00的
注意这里使用having过滤并没有筛选平均薪资大于2000.00数据留下,然后参与avg()。having与where区别。
例如查询工作岗位时,使用 select job from emp;的结果中包含太多的重复,不利于观看,那么就需要去重操作。去重操作需要使用distinct去除重复记录。
distinct 字段1,字段2 ;
|- distinct 只能出现在所有字段的最前方;
范例:使用distinct关键字
范例:联合起来去重
distinct前面不能写字段名,因为去重后记录数小于等于原始的记录数,无法和前面的字段凑在一起。
范例:统计岗位的数量(与分组函数一起使用)
在DQL中最为重要的是语法格式和执行顺序,如下:
语法格式:select 分组函数 或 字段名 或 * from ..... where ..... group by ..... having 分组函数 或 ..... order by ....;
执行顺序:from -> where -> group by -> having -> select -> order by; 注意()优先级在当前语句下优先级最高