前言
今天给大家带来关于数据库查询相关操作,希望各位看官能看个愉快
目录
一、基本概念
在学习MySQL之前我们先来了一下几个基本概念:
1.1、基本概念
数据库 【DB(datebase)】:数据库指的是长期存在计算机内、有组织、可共享的、大量数据的集合。数据是按照特定的数据模型来组织、存储在数据库中的。
数据库管理系统【DBMS(Datebase Management System)】:又称为数据库软件(产品),用于管理DB中的数据
常见DBMS :MySQL,Oracle,DB2,SQLServer等 SQL :结构化查询语言,用于和数据库通信的语言而我们学习的SQL语言又有哪些分类呢?
1.2、SQL语言的分类
DML(Data Manipulate Language):
数据操纵语言,用于添加、删除、修改数据库记录,并检查数据完整性 关键字:insert, delete, update 等 DDL(Data Define Languge): 数据定义语言,用于库和表的创建、修改、删除 关键字:create, drop,alter等 TCL(Data Control Language): 数据事务语言 DQL(Data Query Languag): 数据查询语言,用来查询数据库中表的记录(数据) 关键字:select, where 等1.3、数据库的存储特点
1.将数据放到表中,表再放到数据库中
2.一个数据库中可以有多个表,每个表都有一个名字,用来标识自己,表名具有唯一性
3.表具有一些特性,这些特性定义了数据在表中如何存储,类似java中“类”的设计 4.表由列组成,我们也称为字段,所有表都是由一个或多个列组成的,每一列类似于就java中的“属性” 5.表中的数据都是按行存储的,每一行类似于java中的“对象”
二、MySQL
既然要学习数据库,我们就要下载数据库管理系统才可以,这里我们选用的MySQL,大家可以前往他的官网进行下载使用免费版本:MySQL。
安装好MySQL之后,我们需要启动他的服务:
2.1、 MySQL服务的登录和退出
方式一:通过MySQL自带的客户端
只限于root用户 方式二:通过cmd命令提示行关闭,未配置MySQL环境变量,需在MySQL安装的bin下启动cmd 登录:mysql 【-h主机名 -P端口号 】-u用户名 -p密码 (完整版,即远程登陆,可省略中口号中的代码,省略版仅支持登陆本机用户) 退出: exit或ctrl+C2.2、 MySQL服务的启动和停止
方式一:计算机——右击管理——服务——MySQL
方式二:通过管理员身份运行cmd命令提示行 net start mysql(启动服务) net stop mysql(停止服务)2.3、MySQL常见数据指令
功能 | 代码 | 备注 |
---|---|---|
1.查看所有的数据库 | show databases ; | 注意,分号之前要加空格,否则会报错 |
2.进入某个数据库指令 | use 数据库名; | |
3.在数据库中查找表的指令 | show tables; | |
4.在一个数据库中想要查看另一个数据库的表的指令 | show tables from 数据库名 | 注意 使用该指令我们的用户依旧在原库,也就是test中,只是查看了mysql数据库中的表而已。 |
5.查找我目前所在库的位置 | select database(); | |
6.创建新表指令 | create table 表名( 字段名 类型; ……….); | |
7.查看表名结构 | desc 表名; | |
8.查看表中数据 | select * from 表名; | |
9.向表中添加数据 | insert into 表名 (字段...) values(); | |
10.修改表中数据 | update 表名 set 某字段= '修改后的值' where id=n; | 这里的n是你自己表中字段所对应的ID |
11.删除表中数据 | delete from 表名 where id=n | n就是你要删除的行对应的字段 |
12.查看MySQL版本方法 | 1.在进入MySQL数据中 2.退出MySQL数据库之后 |
2.4、MySQL语法规范
1.不区分大小写,但建议关键字大写,表名,列名小写 2.每条命令最好以分号结尾 3.每条命令根据需要,可以进行缩进,或换行 4.注释 单行注释 #注释文字 -- 注释文字 注意,--之后必须打空格 多行注释 /注释文字/
三、MySQL之DQL语言
在该部分我们学习以下内容:
基础查询、条件查询、排序查询、常见函数、分组函数、分组查询、连接查询、子查询、分页查询、union联合查询,内容较多,我们慢慢展开。
3.1、简单查询
在进行查询前呢我们最好下载一个图形化客户端进行操作,这里我学习用的SQLyog,大家可以在CSDN搜索如何下载和使用该软件,这里就不做过多介绍。
当我们第一次进行查询的时候,一定注意要进入你查询的数据库中才能进行查询操作。
3.1.1、简单查询语句语法
select 查询列表 from 表名;
他的意思,类似于java中的System.out.println(打印的内容),把我们查询的内容显示出来。特点:
1、查询的列表可以是表中 的字段 ,常量值,表达式,函数 2、查询的结果是一个虚拟的表格 图示:
以下给大家介绍几种常用的操作
3.1.2、给字段起别名
语法:select 字段 AS 别名;
注意:如果别名与关键字冲突,别名应该使用双引号或者单引号括起来,建议使用双引号
起别名的好处:
1、便于理解 2、如果要查询的字段有重名的情况,使用别名可以区分开来3.1.3、去重
语法:select distinct 字段 from 表名;
去重前:
去重之后:
很明显的看到我们去重之前有107行数据,而去重之后 仅剩余12行数据。
3.1.4、MySQL中+号的作用以及concat函数
在学习java的时候我们可以使用+号去做字符串拼接操作,但是,在MySQL中我们可以使用+号来完成字符串拼接的功能吗?很显然是不可以的。
MySQL中的+号的功能
仅仅只有一个功能 : 运算符 分为以下三种情况: 1、两个操作数都为数值型,则做加法运算 例如:select 100+90; 2、其中一方为字符型,试图将字符型数值转换为数值型 如果转换成功,则做加法运算 select '123'+90; 如果转换失败,则将字符型数值转换为0; select 'hello' + 90; 3、只要其中一方为null,结果就一定是null; select null + 90;concat函数
那么在MySQL中,他也有自己的字符串拼接函数,就是concat
语法:concat(str1,str2....)
实例用法3.1.5、ifnull函数
ifnull函数的含义:ifnull的执行是检查如果字段中有值为null的情况,没有则返回你设置的值
语法: select ifnull(原值字段,你设置的返回值)图示:
3.2、条件查询
语法:
select 查询列表(第三步执行) · from 表名(第一步执行) where 筛选条件(第二部执行)
筛选条件我们可以大致分为三类:
3.2.1、按条件表达式筛选:
条件运算符:> < = != <> >= <=
3.2.2、按逻辑表达式筛选:
逻辑运算符:
&& | || | ! |
and | or | not |
该连接符主要用于连接表达式
作用:
1、&&和and:两个条件都为true,则结果为true,反之为false 2、 ||和or:只要有一个条件为true,则结果为true,反之为false 3、!和not:如果连接的条件本身为false,则结果为true,否则为false3.2.3、模糊查询:
该类连接符分类:
like,between and,in,is null,<=>(安全等于)
like:
该连接符的应用场景大多用于查询某个字段中包含某个字符等,一般和通配符搭配使用
通配符 % 任意多个字符,包含0个字符 _ 任意单个字符between and:
他所查询的就是某个区间的值大多应用场景:也可以用条件表达式去完成
特点:
1、可以提高语句简洁度
2、两个区间的值的顺序不可颠倒 3、包含临界值in:
判断某字段的值是否属于in列表中的某一项
注意特点:
①使用in提高了语句简洁度
②in列表的值必须是同一类型或兼容 ③in字段不支持通配符is null :
用于判断字段值是否为null
注意: =或<>不能用于判断null值 is null 或 is not null可以判断null值那么相反如果想要查询相反值就是is not null
安全等于 <=>:
与 isnull进行比较 isnull仅仅可以判断null值,可读性较高,建议使用 安全等于既可以判断null值,又可以判断普通的数值,可读性较低
3.3、排序查询
语法:
select 要查询的东西 from 表 where 条件 order by 排序的字段|表达式|函数|别名 【asc|desc】
排序方式: * ASC:升序,默认的 * DESC:降序 特点 1.asc代表的是升序,desc代表的是降序 如果关键字不写,默认是升序 2.order by子句一般是放在查询语句的最后面,limit子句除外 3.order by子句中可以支持单个字段,多个字段,表达式,函数,别名 4.length函数表示返回字符串长度
3.4、常见函数
3.4.1、字符函数
concat: 拼接 substr: 截取子串 upper: 转换成大写 lower: 转换成小写 trim: 去前后指定的空格和字符 ltrim: 去左边空格 rtrim: 去右边空格 replace: 替换 lpad: 左填充 rpad: 右填充 instr: 返回子串第一次出现的索引 length: 获取字节个数
3.4.2、数学函数
rand: 随机数 floor: 向下取整 返回<=该参数的最大整数 ceil: 向上取整 返回>=该参数的最小整数 mod: 取余 truncate: 截断 rand:获取随机数,取值范围0-1
3.4.3、日期函数
now: 当前系统日期+时间 curdate: 当前系统日期 curtime: 当前系统时间 str_to_date: 将字符转换成日期 date_format: 将日期转换成字符 datediff:两个日期相差天数 monthname:以英文形式返回月
3.4.4、其他函数
database: 当前库 user: 当前连接用户 version: 版本 password(‘字符’):返回该字符的加密形式 md5('字符'):返回该字符的md5加密形式
3.4.5、流程控制函数
该函数式MySQL中比较重要的函数
首先是case函数
他分为两种使用方法:
(一):
类似于java中的Switch case函数 语法: case 要判断的字段或表达式 when 常量1 then 要显示的值1或语句1; when 常量2 then 要显示的值2或语句2; ... else 要显示的值n或语句n; end
案例:
(二):
类似于java中的多重if语句 语法: case when 条件1 then 要显示的值1或语句1(语句要加分号) when 条件2 then 要显示的值2或语句2 。。。 else 要显示的值n或语句n end
案例:
其次是if函数:
类似于if else效果:
案例:
3.5、分组函数
- count:计算个数 * 一般选择非空的列:主键 * count(*) 表示统计表中所有行数,包括null * max:计算最大值 * min:计算最小值 * sum:计算和 * avg:计算平均值
注意:
1、以上五个分组函数都忽略null值,除了 count() 2、sum和avg一般用于处理数值型,max、min、count可以处理任何数据类型 3、都可以搭配distinct使用,用于统计去重后的结果 4、count的参数可以支持: 字段、、常量值,一般放1 效率 MYISAM存储引擎下 ,COUNT()的效率高 INNODB存储引擎下,COUNT()和COUNT(1)的效率差不多,比COUNT(字段)要高一些 5.和分组函数一同查询的字段要求是group by后的字段(group by是3.6分组查询的语句)
3.6、分组查询
语法: select 查询的字段,分组函数 from 表 group by 分组的字段
特点:
1、可以按单个字段分组 2、和分组函数一同查询的字段最好是分组后的字段 3、可以按多个字段分组,字段之间用逗号隔开 4、可以支持排序 5、having后可以支持别名
注意:
分组函数做筛选不能放在where后面 能做分组前筛选的,尽量选择分组前筛选,以提高效率 分组可以按单个字段也可以按多个字段并且可以搭配着排序使用
题外话:
where 和 having 的区别? 1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来 2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
3.7、连接查询
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
在我们对表进行查询操作时,会出先一个现象就是我们有一个表由m行,另一个表由n行,而当我们对两张表进行连接查询时,对连接条件进行了错误的添加,就会出现m*n行数据,那么这肯定不是我们想要的结果,因为他包含了太多重复的无用的数据,该现象就叫做笛卡尔乘积效应:
发生原因: 1. 省略连接条件 2. 连接条件无效 3. 所有表中所有行互相连接 如何解决: 添加有效的连接条件
3.7.1、连接查询的分类:
3.7.2、sql92标准下的连接查询
它只支持内连接中的等值连接,非等值连接,自连接 语法: SELECT 查询列表 FROM 表名1 别名1 ,表名2 别名2 WHERE 连接条件 【等值连接,非等值连接,自连接】 AND 筛选条件 GROUP BY 分组列表 HAVING 分组后筛选条件 ORDER BY 排序列表
等值连接,什么意思呢? ①多表等值连接的结果为多表的交集部分 ②n表连接,至少需要n-1个连接条件 ③多表的顺序一般没有要求 ④一般需要为表起别名 ⑤可以搭配前面介绍的所有子句使用,比如排序,分组,筛选 连接条件为等于号
举例:
非等值连接:连接条件不为等于号
举例:
很明显这里的连接条件是between and自连接:自己表中内容进行连接, 自连接需要注意对表起别名作区分
3.7.3、sql99标准下的连接查询
内连接: 语法: select 字段列表 from 表名1 [inner] join 表名2 on 条件 where 筛选条件【等值连接,非等值连接,自连接】 group by 分组条件 having 分组后的筛选条件 order by 排序字段
等值连接: ①添加排序、分组、筛选 ②inner可以省略 ③ 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读 ④inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集
实例:
非等值连接:连接条件不为等号
实例:
自连接:在自己表内为连接条件
实例:
外连接: 应用场景:用于查询一个表中有,另一个表没有的记录 特点: 1、外连接的查询结果为主表中的所有记录 如果从表中有和它匹配的,则显示匹配的值 如果从表中没有和它匹配的,则显示null 外连接查询结果=内连接结果+主表中有而从表没有的记录 2、左外连接,left join左边的是主表 右外连接,right join右边的是主表 3、左外和右外交换两个表的顺序,可以实现同样的效果 4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的 左外连接: select 字段列表 from 表名1 left[outer] join 表名2 on 条件 where 筛选条件 group by 分组条件 having 分组后的筛选条件 order by 排序字段
右外连接: 语法: select 字段列表 from 表名1 right[outer] join 表名2 on 条件 where 筛选条件 group by 分组条件 having 分组后的筛选条件 order by 排序字段
实例:
全外由于MySQL不支持,因此这里只了解其语法: select 字段列表 from 表名1 full[outer] join 表名2 on 条件 where 筛选条件 group by 分组条件 having 分组后的筛选条件 order by 排序字段
交叉连接: 语法: select 字段列表 from 表名1 cross join 表名2 on 条件 where 筛选条件 group by 分组条件 having 分组后的筛选条件 order by 排序字段 就是笛卡尔乘积
实例:
3.8、子查询
含义: 出现在其他语句(不仅限于查询语句)中的select语句,称为子查询或内查询 外部的查询语句,称为主查询或外查询
分类:
select语句后面仅仅支持标量子查询
from后面:支持表子查询:将子查询结果充当一张表,要求必须起别名
实例:
exists后面(相关子查询) 查询的括号内一般是一个连接查询 语法: exists(完整的查询语句) 结果:1或0
实例:
where或having后面支持: 标量子查询 列子查询 行子查询
where或having后面标量子查询: 特点: ①子查询放在小括号内 ②子查询一般放在条件的右侧 ③标量子查询,一般搭配着单行操作符使用 > < >= <= = <> 列子查询,一般搭配着多行操作符使用 in、any/some、all ④子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
where或having后面行子查询
实例:
where或having后面列子查询 列子查询一般搭配逻辑操作符使用:
实例:
3.9、分页查询
应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求 语法: select 查询列表 from 表 【join type join 表2 on 连接条件 where 筛选条件 group by 分组字段 having 分组后的筛选 order by 排序的字段】 limit 【offset,】size; {offset要显示条目的起始索引(起始索引从0开始) size 要显示的条目个数} 特点: ①limit语句放在查询语句的最后 ②公式 要显示的页数 page,每页的条目数size select 查询列表 from 表 limit (page-1)*size,size;
3.10、联合查询
应用场景: 要查询的结果来自于多个表,且多个表之间没有任何直接的连接关系 但查询的信息一致时(即两张表查询的信息相同) 含义:将多条查询语句的结果合并成一个结果 特点: 1、要求多条查询语句的查询列数是一致的 2、要求多条查询语句查询的每一列的类型和顺序最好一致 3、union关键字默认去重,如果使用union all可以包含重复项 语法: 查询语句1 union 查询语句2 union ......
写在最后:
最后,求三连关注啊 ,后面会给大家带来其他操作哦。下次见
原文: https://blog.csdn.net/ww166955/article/details/121699057