DQL:RDBMS、SQL数据表查询 - MySQL 2

 

目录

RDBMS

RDBMS结构

数据表

SQL

导入数据

简单的查询语句 - select ... from

条件查询 - where

排序 - order by

分组函数/聚合函数/多行处理函数

分组 - grounp by 与 having 

查询结果集去重 - distinct

 

总结


DBMS负责执行SQL语句,通过执行SQL语句来操作DB中的数据。RDBMS表示关型数据库,其中MySQL对应的就是RDBMS。

RDBMS

RDBMS结构

使用RDBMS时最常见的系统结构就是C/S类型,如下结构

通过网络可以实现多个客户端访问同一个数据库。在一个数据库之中最为基础的数据存储单元为数据表(table),每个表会有若干数据列(Column),而后每一列都有其对应的数据类型,在进行数据操作的时候必须依据数据类型存放。

数据表

表是数据在一个 MySQL 数据库中的存储机制,是数据库基本的存储单元。一个表包含行和列:

  • 行:数据/记录(data);
  • 列:字段(column);

每个字段应该包含:

  • 字段名,例如:id

  • 数据类型,例如:int

  • 相关的约束,例如:不能为null、长度等。

SQL

学习MySQL主要是学习SQL语句,通过执行不同功能将SQL语句分类如下:

  • DDL(数据定义语言):对表结构的增删改,create、 drop、 alter ;

  • DML(数据操作语言):对表中的数据进行增删改,insert、delete、update;

  • DQL(数据查询语言):查询语句,凡是select语句都是DQL;

  • TCL(事务控制语言):conmit提交事务,rollback回滚事务;

  • DCL(数据控制语言):grant授权、revoke撤销账户等;

为了学习SQL,需要一些数据作为学习的操作对象。

导入数据

这时数据库中没有数据,需要导入数据才能进行后续操作,导入数据方法如下:

  • 第一步:登录MySql数据库管理系统;

           |- dos命令窗口命令:masql -uroot -p    回车    输入密码

  • 第二步:查看有那些数据库

           |- show database;(包含“;”符号,这个不是SQL语句,属于MySQL命令);

  • 第三步:创建属于自己的数据库-bjpowernode

          |- create database bjpowernode; (MySQL命令) 

  • 第四步:使用bjpowernode数据

          |- use bjpowernode; (MySQL命令); 

  • 第五步:查看当前使用的数据库中的表

          |-show tables;(MySQL命令)

  • 第七步:初始化数据

          |- source C:\Users\ren\Desktop\bjpowernode.sql (MySQL命令)

注意:数据初始化完成之后有三张数据表。

可以发现bjpowernode.sql ,这个文件以sql结尾,这样的文件被称为“sql脚本”,当一个文件的扩展文件名为.sql,并且该文件中编写了大量的sql语句,我们称之为sql脚本。直接使用source命令可以执行sql脚本。

需要通过一些语句来了解表,如下:

  • show tables:查看当前使用的数据库中的表(MySQL命令);
  • desc 表名:查看表的结构(MySQL命令);

  • select * from 表名:查看表中数据;

  •  show create table 表名:查看创建表的语句;

范例:查看表结构

上表中:等级、最低工资、最高工资。

范例:查看表中数据

范例:查看创建表的语句

补充:常用MySQL命令:

  • 查看当前使用的数据库:select database() ;

  • 查看mysql版本号:select version() ;

  • 结束当前语句:\c

  • 退出:exit

简单的查询语句 - select ... from

SQL语句都是以分号结尾,并且比较特殊的是它不区分大小写,DQL的语法格式如下:

  • select  字段名1,字段名2,...... from 表名:查看表中某列数据

也可以在字段上进行运算,直接在字段名后加上运算,如下:

  • select  字段名1 运算符 运算对象,字段名2,...... from 表名

范例:在字段上加运算

此时可以发现列名不合适,此时需要给查询结果的列进行重命名,使用as关键字(可以省略as关键字),如下:

  • as:改变列名

在面对字符串时,需要使用单引号进行描述。

范例:单引号的使用

查询所有字段可以使用“*”,在实际开发中不使用。

条件查询 - where

在很多情况下,只需要满足一定条件的数据记录,需要使用where关键字,语法格式:

  • select 字段1,字段2,..... from 表名  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,需要明确的是order by是最后执行的语句:

  • select  字段1,字段2,....  from   表名  order by  字段名  asc(升序)或者desc(降序),字段名   asc或desc;

默认为升序,以列子就懂了,注意字段名可以使用数字代替(不建议使用)。

范例:按照工资降序,工资一样的按照名字的升序序排,找出员工和薪资

显然越靠前的字段越先作用。

范例:找出工作为“SALESMA”员工,按照工资升序排列,order by可以和where关键字一起使用;

函数

语法:

  • select 函数名() ;
  • select 函数名() from 表 ;

SQL中可以将函数分为:

  • 多行处理函数:输入多行数据,输出一行,例如:下面的分组函数就是多行处理函数;
  • 单行处理函数:输入一行数据,输出一行,例如:ifnull()函数;

单行处理函数

单行处理函数常见:

  • 字符函数:

          |- length():获取参数值的字节个数

          |- concat():拼接字符串

          |- upper()、lower():变大小写

          |-substr()、substring():截取字符串,注意索引从1开始

          |-instr():返回字串的起始索引

  • 数学函数
  • 日期函数
  • 其它函数

分组函数/聚合函数/多行处理函数

SQL中可以将函数分为:

  • 多行处理函数:输入多行数据,输出一行,例如:下面的分组函数就是多行处理函数;
  • 单行处理函数:输入一行数据,输出一行,例如:ifnull()函数;

在MySQL提供对于某一组数据进行统计操作的时候可以使用分组函数,分组函数只有5个如下:

  • count   计数

  • sum     求和 

  • avg     平均值

  • max     最大值

  • min      最小值

格式: select    分组函数    from .....

范例:找出员工的工资总和

范例:找出总人数

从上面的例子可以看出,分组函数会自动忽略null。

显然容易进一步思考,是否可以将分组函数与条件查询放在一起使用,下面通过一个列子来观察。

范例:找出工资高于平均工资的员工

题目:SQL中禁止分组函数出现在where语句之中?

  • 分组函数是在分完组后使用的,程序执行顺序为:from -> where -> group by(分组) -> select,当执行where时还没有分组,所以无法执行分组函数,而分组函数一般是和group by一起使用的(没有group by时全表看作一组)。
  • group by语法格式位于where之后:select xx from xx where xx group by xx;

范例:改进后的代码


 

分组函数也可组合起来用,下面通过一个具体的例子来看。

范例:分组函数组合使用

题目:count(*)与count(某一个字段名)的区别?

  • count(*)统计总记录条数,count(某个字段)因为分组函数会自动忽略null,因此统计该字段中不为null的条数。

分组 - grounp by 与 having 

在一些情况下需要考虑属于某个属性值下的具体情况,例如:找出每个部门中最高的薪资。这样就需要使用分组,分组需要用到关键字group by。

  • group by :按照某个字段或者某些字段进行分组,一般都和分组函数联合一起使用;

            |- 用法:select  字段名 或 分组函数   from  emp group by 字段名

            |-  多个字段联合起来一起分组:

                   |- 格式:goup by 字段1,字段2,....

  • having :对于分组之后的数据进行二次过滤;

在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区别。

查询结果集去重 - distinct

例如查询工作岗位时,使用 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;   注意()优先级在当前语句下优先级最高

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值