目录
一、数据库的基本信息
1.1 数据库的定义
1.2数据库的分类
1.2.1 关系型数据库
1.2.2 非关系型数据库
1.3 SQL介绍
1.3.1 概念
1.3.2 SQl语言分类
1.3.3 SQL注释
1.3.4 数据库操作命令DDL
1.3.5 数据表操作命令DDL
1.3.6 数据表操作命令DML
1.3.7 数据表中内容查询
二、MySQL数据库
2.1 MySQL数据库的特点
2.2 MySQL数据库的链接
2.2.1 命令连接MySQL数据库
2.2.2 工具连接MySQL数据库
2.3 数据类型和数据约束
2.4.1 基础数据库操作
2.4.2 基础数据表操作
2.4.3 数据库的备份和还原
三、数据查询操作
3.1 数据准备
3.1.1 创建数据表
3.1.2 插入数据
3.2 查询基本语法
3.2.1 查询所有字段
3.2.2 查询部分字段
3.2.3 起别名
3.2.4 去重
3.3 条件查询
3.3.1 比较运算符
3.3.2 逻辑运算符
3.3.3 模糊查询
3.3.4 范围查询
3.3.5 空判断
3.4 排序
3.5 聚合函数
3.5.1 查询总记录数
3.5.2 查询最大值
3.5.3 查询最小值
3.5.4 求和
3.5.5 求平均值
3.5.6 其它聚合函数
3.6 分组
3.6.1 分组
3.6.2 分组后的数据筛选
3.7 对比 where 与 having
3.8 分页
3.8.1. 获取部分行
3.8.2 分页
四、连接查询
4.1 常用连接方式
4.2 数据准备
4.3 内连接
4.4 左连接
4.5 右连接
五、子查询
5.1 主查询和子查询的关系
5.2 子查找充当条件
5.3 子查询充当数据源
5.4 子查询中特定关键字使用
六、完整的查询语法
6.1 select [选项 all|distinct]
6.2 表示从数据源中查询哪些字段
6.3 from字句
6.4 where子句
6.5 group by 分组查询
6.6 having 子句
6.7 order by 子句:排序,对数据源进行排序
6.8 limit子句
数据库是指长期存储在计算机内、有组织的数据集合。简而言之,数据库就是一个存储数据的地方。
以表格方式展示:
常见的关系型数据库:
Oracle:大型项目使用
MySQL:web项目中使用最广泛的数据库
Microsoft SQL Server:在微软项目中使用
SQLite:轻量级数据库,一般在移动平台使用
以键值对方式展示:
常见非关系型数据库:
Redis
Mongodb
Hbase
Structured Query Language (结构化查询语言),通过SQL语言可以对数据库进行操作。
DQL:数据查询语言,用于对数据进行查询,例如:select(掌握)
DML︰数据操作语言,对数据进行增加、修改、删除,例如:insert、update、delete(掌握)
TPL:事务处理语言,对事务进行处理,例如: begin transaction、commit、rollback(了解)
DCL:数据控制语言,进行授权与权限回收,例如:grant、revoke(了解)
DDL:数据定义语言,进行数据库、表的管理等,例如: create、drop(了解)
CCL︰指针控制语言,通过控制指针完成表的操作,例如: declare cursor(了解)
注意∶主流的关系型数据库都支持SQL语言,在MySql中SQL语言不区分大小写
- SQL标准
- 多行注释:/* XXXXX */
- 单行注释:-- XXXX。
注意:第2个破折号后面必须跟一个空格符
- MYSQL标准
- 单行注释:”#”
首先通过命令行工具连接到数据库。
mysql -h数据库IP -P端口号 –u数据库登陆用户名 -p数据库登陆密码 mysql –u数据库登陆用户名 -p数据库登陆密码 (如果连接的为本机的数据库,无需指定IP和端口)
查看所有数据库:show databases;
查询数据库:show databases [like '数据库名'];
使用数据库:use 数据库名;
查看当前使用数据库: select database();
创建数据库:
create database 数据库名 charset=utf8;
create database [if not exists] 数据库名 [default charset=utf8];
删除数据库:
drop database 数据库名;
drop database [if exists] 数据库名;
查看当前数据库所有的表:
show tables;
show tables [from 数据库名] [like wild];
查看表结构:desc 表名;
查看表的创建语句:show create table 表名;
创建数据库表
语法格式:
create table 表名( 字段名1 类型 约束, 字段名2 类型 约束, ... ... ... )[engine=innodb default charset=utf8];
create table students( id int unsigned primary key auto_increment, -- id字段为主键,且值自增 name varchar ( 20 ) , -- name字段类型为字符串,长度为20 age int unsigned, --age字段类型为无符号的整型 height decimal(5,2) --sight字段类型为小数,小数位数为2 )engine=innodb default charset=utf8;
删除数据库表
drop table 表名; --删除表
drop table if exists 表名; --如果存在这个表则删除
修改表结构
增加列:alter table 表名 add 列名 列类型 [after 列名]|first;
修改列类型:alter table 表名 modify 列名 列类型[after 列名];
改列名:alter table 表名 change 旧列名 新列名 列类型 [after 列名];
删除列:alter table 表名 drop 列名;
改表名:alter table 表名 rename 新表名;
添加数据
修改:update 表名 set 列1=值1,列2=值2... where 条件;
删除
方式一:delete
delete from 表名 where 条件;
逻辑删除:对于重要的数据,不能轻易执行delete语句进行删除。因为一旦删除,数据无法恢复,这时可以
进行逻辑删除。
1、给表添加字段,代表数据是否删除,一般起名isdelete,0代表未删除,1代表删除,默认值为0
2、当要删除某条数据时,只需要设置这条数据的isdelete字段为1
3、以后在查询数据时,只查询出isdelete为0的数据
例:1、给学生表添加字段(isdelete),默认值为0,
如果表中已经有数据,需要把所有数据的isdelete字段更新为0
update students set isdelete=0;
2、删除id为1的学生
update students set isdelete=1 where id=1;
3、查询未删除的数据
select * from students where isdelete=0;
方式二:truncate
truncate table 表名;(删除表的所有数据,保留表结构)
格式三:drop
drop table 表名;(删除表,所有数据和表结构都删掉)
Truncate、Delete、Drop 的区别
1、Delete 删除数据时,即使删除所有数据,其中的自增长字段不会从1开始
2、Truncate 删除数据时,其中的自增长字段恢复从1开始
3、Drop 是删除表,所有数据和表结构都删掉
总结
在速度上,drop > truncate > delete
如果想删除部分数据用 delete,注意带上 where 子句
如果想删除表,用 drop
如果想保留表而将所有数据删除,自增长字段恢复从1开始,用 truncate
简单查询(查询表格中所以内容):select * from 表名;
1、可移植性好
2、支持多操作系统
3、支持多种编程语言
4、开源、社区版免费
5、支持多线程
6、优化SQL查询算法
7、多种数据库连接方式
8、支持多语言编码格式
注意: 实际工作中, 数据库是安装在服务器当中的, 如果要直连数据库进行数据校验, 就必须远程连接
前置条件:
确定mysql数据库的IP地址
可以通过ifconfig来确认
确认mysql数据库服务是否开启
netstat anptu |grep 3306(服务器端操作)
连接命令:
mysql -h数据库IP -P端口号 –u数据库登陆用户名 -p数据库登陆密码 mysql –u数据库登陆用户名 -p数据库登陆密码 (如果连接的为本机的数据库,无需指定IP和端口)
-h不加时则表示为本机
-P不加时则表示默认3306端口
MySQL客户端工具有很多种,其中navicat用的比较多,还有mysql workbench等。
以navicat为例:
1.新建mysql连接
2.输入账号密码、端口等信息,连接测试,测试成功点击确定,完成连接。
数据类型:
整型:int
有符号范围(-2147483648~2147483647)
无符号范围(0~4294967295)
字符串: varchar
范围(0~65533)
一个字母或一个中文占一个字符
例如: varchar(3)表示最多存3个字符
小数: decimal
示例:decimal(5,2),表示该字段可以存5位数,其中小数位数为2,整数3位。
时间日期: datetime
范围(1000-01-01 00:00:00 ~ 9999-12-31 23:59:59)
示例:2021-01-01 12:29:59'
数据约束:
主键(primary key):物理上存储的顺序
当把某个字段设定为主键之后,该字段的值必须唯一,且不能为空
针对主键的字段,可以设定自动自增,自动在原来最大的ID值上加1。
非空( not null):此字段不允许填写空值
空(Null)和' '空字符是不一样的
唯一( unique):此字段的值不允许重复
默认值( default) :当不填写此值时会使用默认值,如果填写时以填写为准。
外键( foreign key)):维护两个表之间的关联关系
Auto_increment: 自动增长,
一个表只能有一个auto_increment属性,且该属性必须为主键的一部分
1.使用数据库
在navicat窗口中,双击左侧已连接的连接名称即可打开并连接到数据库。
2.创建数据库
打开数据库后,右击连接名称,选择“创建数据库”,然后输入对应的数据,点击确定。
3.修改数据库
打开数据库后,右击要修改的数据库名称,选择数据库属性。
4.删除数据库
打开数据库后,右击要删除的数据库名称,选择“删除数据库”
1.新建表
右击已打开的数据库中“表”字段名,选择“新建表”
在新建表的窗口中输入字段的名称及选择字段的类型等信息
点击保存,输入对应的表名称,再点击确定,然后关闭新建表窗口即可
2.修改、删除表
修改表:右击表名,选择“设计表”,可以进入到表字段设计的窗口。针对要修改的表可以做增加字段、删除字段、修改字段名称及类型等操作。
双击表名,或鼠标右键打开表,可以进入到表格窗口。可以增加、删除表格中的数据。
删除表:右击表名,选择"删除表"即可
备份:
选择结构和数据时保存数据字段和列表信息
选择仅结构时保存数据字段,不保存列表信息
还原:
要还原的数据库不存在时,需要先创建数据库
1.点击数据库,选择新建查询
2.输入命令,点击运行
3.可以对命令行内容进行保存
drop table if exists students; create table students ( studentNo varchar(10) primary key, name varchar(10), sex varchar(1), hometown varchar(20), age tinyint(4), class varchar(10), card varchar(20) );
insert into students values ('001', '王昭君', '女', '北京', '20', '1班', '340322199001247654'), ('002', '诸葛亮', '男', '上海', '18', '2班', '340322199002242354'), ('003', '张飞', '男', '南京', '24', '3班', '340322199003247654'), ('004', '白起', '男', '安徽', '22', '4班', '340322199005247654'), ('005', '大乔', '女', '天津', '19', '3班', '340322199004247654'), ('006', '孙尚香', '女', '河北', '18', '1班', '340322199006247654'), ('007', '百里玄策', '男', '山西', '20', '2班', '340322199007247654'), ('008', '小乔', '女', '河南', '15', '3班', null), ('009', '百里守约', '男', '湖南', '21', '1班', ''), ('010', '妲己', '女', '广东', '26', '2班', '340322199607247654'), ('011', '李白', '男', '北京', '30', '4班', '340322199005267754'), ('012', '孙膑', '男', '新疆', '26', '3班', '340322199000297655');
语法: select * from 表名
例:查询所有学生的所有字段 select * from students
语法:select 字段1,字段2,... from 表名
例:查询所有学生的姓名、性别、年龄 select name,sex,age from students
给表起别名,在多表查询中经常使用
语法:
select 别名.字段1,别名.字段2,... from 表名 as 别名
例:给学生表起别名
select s.name,s.sex,s.age from students as s;
给字段起别名,这个别名出现在结果集中
语法: select 字段1 as 别名1,字段2 as 别名2,... from 表名
例:查询所有学生的姓名、性别、年龄,结果中的字段名显示为中文
select name as 姓名,sex as 性别,age as 年龄 from students;
语法: select distinct 字段1,... from 表名
例:查询所有学生的性别,不显示重复的数据
select distinct sex from students;
使用 where 子句对表中的数据筛选,符合条件的数据会出现在结果集中
语法:select 字段1,字段2... from 表名 where 条件;
where 后面支持多种运算符,进行条件的处理
比较运算
逻辑运算
模糊查询
范围查询
空判断
等于: =
大于: >
大于等于: >=
小于: <
小于等于: <=
不等于: !=或<>
例1:查询小乔的年龄
select age from students where name='小乔'
例2:查询20岁以下的学生
select * from students where age<20
例3:查询家乡不在北京的学生
select * from students where hometown!='北京'
and
or
not
例1:查询年龄小于20的女同学
select * from students where age<20 and sex='女'
例2:查询女学生或'1班'的学生
select * from students where sex='女' or class='1班'
例3:查询非天津的学生
select * from students where not hometown='天津'
like
%表示任意多个任意字符
_表示一个任意字符
例1:查询姓孙的学生
select * from students where name like '孙%'
例2:查询姓孙且名字是一个字的学生
select * from students where name like '孙_'
例3:查询姓名以乔结尾的学生
select * from students where name like '%乔'
例4:查询姓名含白的学生
select * from students where name like '%白%'
in表示在一个非连续的范围内
between ... and ...表示在一个连续的范围内
例1:查询家乡是北京或上海或广东的学生
select * from students where hometown in('北京','上海','广东')
例2:查询年龄为18至20的学生
select * from students where age between 18 and 20
注意:null与' '是不同的
判空is null
判非空is not null
例1:查询没有填写身份证的学生
select * from students where card is null
例2:查询填写了身份证的学
select * from students where card is not null
为了方便查看数据,可以对数据进行排序
语法:select * from 表名 order by 列1 asc|desc,列2 asc|desc,...
将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
默认按照列值从小到大排列
asc从小到大排列,即升序
desc从大到小排序,即降序
例1:查询所有学生信息,按年龄从小到大排序
select * from students order by age
例2:查询所有学生信息,按年龄从大到小排序,年龄相同时,再按学号从小到大排序
select * from students order by age desc,studentNo
使用聚合函数方便进行数据统计
聚合函数不能在 where 中使用
常用聚合函数:
count(): 查询总记录数
max(): 查询最大值
min(): 查询最小值
sum(): 求和
avg(): 求平均值
count(*)表示计算总行数,括号中也可以使用字段名
示例:查询学生总数
select count(*) from students;
max(列)表示求此列的最大值
示例:查询女生的最大年龄
select max(age) from students where sex='女';
min(列)表示求此列的最小值
示例:查询1班的最小年龄
select min(age) from students;
sum(列)表示求此列的和
示例:查询北京学生的年龄总和
select sum(age) from students where hometown='北京';
avg(列)表示求此列的平均值
示例:查询女生的平均年龄
select avg(age) from students where sex='女'
round():把数值字段四舍五入
select sex,round(avg(age)) from students group by sex;
char_length(): 字符串长度
select name,char_length(name) from students;
concat(): 返回连接参数产生的字符串,一个或多个待拼接的内容,任意一个为NULL则返回值为NULL
select name,sex,concat(name,sex) from students;
lower(str): 将str中的字母全部转成小写
select lower(name) from students;
upper(str): 将str中的字母全部装成大写
select upper(name) from students;
left(str,n): 返回字符串str从最左边开始的n个字符
select left(name,2) from students;
right(str,n): 返回字符串str从最右边开始的n个字符
select right(name,2) from students;
trim(str): 返回字符串s删除了两边空格之后的字符串
select trim(name) from students;
substr(str,n,len), substr(str,-len) 截取从指定字符串str中返回从n(起始位置,从1开始)开始、长度为len的字符串
select substr(name,1,2) from students;
reverse(str): 将字符串str反转
select reverse(name) from students;
replace(str,a,b): 替换,b为新内容,a为原内容
select replace(name,'白','黑') from students;
按照字段分组,此字段相同的数据会被放到一个组中
分组的目的是对每一组的数据进行统计(使用聚合函数)
语法:select 字段1,字段2,聚合... from 表名 group by 字段1,字段2...
例1:查询各种性别的人数
select sex,count(*) from students group by sex
例2:查询每个班级中各种性别的人数
select class,sex,count(*) from students group by class,sex
语法:select 字段1,字段2,聚合... from 表名 group by 字段1,字段2,字段3... having 字段1,...聚合...
having后面的条件运算符与where的相同
例1:查询男生总人数
方案一
select count(*) from students where sex='男'
-----------------------------------
方案二:
select sex,count(*) from students group by sex having sex='男'
where 是对 from 后面指定的表进行数据筛选,属于对原始数据的筛选
having 是对 group by 的结果进行筛选
having 后面的条件中可以用聚合函数,where 后面不可以
语法:select * from 表名 limit start,count
从start开始,获取count条数据
start索引从0开始
例1:查询前3行学生信息
select * from students limit 0,3
limit典型的应用场景就是实现分页查询
已知:每页显示m条数据,求:显示第n页的数据
select * from students limit (n-1)*m,m
当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回
内连接:查询的结果为两个表匹配到的数据
左连接:查询的结果为两个表匹配到的数据加左表特有的数据,对于右表中不存在的数据使用 null填充
右连接:查询的结果为两个表匹配到的数据加右表特有的数据,对于左表中不存在的数据使用null填充
drop table if exists courses; create table courses( courseNo int(10) unsigned primary key auto_increment, name varchar(10) ); insert into courses values ('1', '数据库'), ('2', 'qtp'), ('3', 'linux'), ('4', '系统测试'), ('5', '单元测试'), ('6', '测试过程'); drop table if exists scores; create table scores( id int(10) unsigned primary key auto_increment, courseNo int(10), studentno varchar(10), score tinyint(4) ); insert into scores values ('1', '1', '001', '90'), ('2', '1', '002', '75'), ('3', '2', '002', '98'), ('4', '3', '001', '86'), ('5', '3', '003', '80'), ('6', '4', '004', '79'), ('7', '5', '005', '96'), ('8', '6', '006', '80');
语法:select * from 表1 inner join 表2 on 表1.列=表2.列
例1:查询学生信息及学生的成绩
select
*
from
students stu
inner join scores sc on stu.studentNo = sc.studentNo
扩展:内连接的另一种语法:select * from 表1,表2 where 表1.列=表2.列
select* from students stu, scores sc where stu.studentNo = sc.studentNo
例2:查询课程信息及课程的成绩
select
*
from
courses cs
inner join scores sc on cs.courseNo = sc.courseNo
例3:查询学生信息及学生的课程对应的成绩
select
*
from
students stu
inner join scores sc on stu.studentNo = sc.studentNo
inner join courses cs on cs.courseNo = sc.courseNo
例4:查询王昭君的成绩,要求显示姓名、课程号、成绩
select
stu.name,
sc.courseNo,
sc.score
from
students stu
inner join scores sc on stu.studentNo = sc.studentNo wherestu.name = '王昭君'
例5:查询王昭君的数据库成绩,要求显示姓名、课程名、成绩
select
stu.name,
cs.name,
sc.score
from
students stu
inner join scores sc on stu.studentNo = sc.studentNo
inner join courses cs on sc.courseNo = cs.courseNo
where
stu.name = '王昭君' and cs.name = '数据库'
例6:查询所有学生的数据库成绩,要求显示姓名、课程名、成绩
select
stu.name,
cs.name,
sc.score
from
students stu
inner join scores sc on stu.studentNo = sc.studentNo
inner join courses cs on sc.courseNo = cs.courseNo
where
cs.name = '数据库'
例7:查询男生中最高成绩,要求显示姓名、课程名、成绩
select
stu.name,
cs.name,
sc.score
from
students stu
inner join scores sc on stu.studentNo = sc.studentNo
inner join courses cs on sc.courseNo = cs.courseNo
where
stu.sex = '男'
order by
sc.score desc
limit 1
语法:select * from 表1 left join 表2 on 表1.列=表2.列
例1:查询所有学生的成绩,包括没有成绩的学生
select
*
from
students stu
left join scores sc on stu.studentNo = sc.studentNo
例2:查询所有学生的成绩,包括没有成绩的学生,需要显示课程名
select
*
from
students stu
left join scores sc on stu.studentNo = sc.studentNo
left join courses cs on cs.courseNo = sc.courseNo
语法:select * from 表1 right join 表2 on 表1.列=表2.列
例1:查询所有学生的成绩,包括没有成绩的学生
select
*
from
scores sc
right join students stu on stu.studentNo = sc.studentNo
例2:查询所有学生的成绩,包括没有成绩的学生,需要显示课程名
select
*
from
scores sc
right join students stu on stu.studentNo = sc.studentNo
left join courses cs on cs.courseNo = sc.courseNo
子查询:在一个 select 语句中,嵌入了另外一个 select 语句,那么嵌入的 select 语句称之为子查 询语句
主查询:外层的 select 语句称之为主查询语
子查询是嵌入到主查询中的
子查询是辅助主查询的,要么充当条件,要么充当数据源
子查询是可以独立使用的语句,是一条完整的 select 语句
例1:查询大于平均年龄的学生
查询班级学生平均年龄
select avg(age) from students
查询大于平均年龄的学生
select * from students where age > 21.4167
select * from students where age > (select avg(age) from students);
例2:查询王昭君的成绩,要求显示成绩
学生表中查询王昭君的学号
select studentNo from students where name = '王昭君'
成绩表中根据学号查询成
select * from scores where studentNo = '001'
select * from scores where studentNo = (select studentNo from students wherename = '王昭君')
例1和例2中:子查询返回的结果只有一个值(一行一列),这种称之为标量子查询
例3:查询18岁的学生的成绩,要求显示成绩
学生表中查询18岁的学生的学号
select studentNo from students where age=18
成绩表中根据学号查询成绩
select * from scores where studentNo in ('002','006')
select * from scores where studentNo in (select studentNo from students whereage=18)
例3中:子查询返回的结果是一列数据(一列多行),这种称之为列子查询
例4:查询和王昭君同班、同龄的学生信息
select class,age from students where name='王昭君'
select * from students where class='1班' and age=20
select * from students where (class,age)=('1班',20) s
elect * from students where (class,age)=(select class,age from students wherename='王昭君')
例4中:子查询返回的结果是一行(一行多列),这种称之为行子查询
例5:查询数据库和系统测试的课程成绩
select
*
from
scores s
inner join
(select * from courses where name in ('数据库','系统测试')) c on s.courseNo =c.courseNo
例5中:子查询返回的结果是多行多列(相当于一个表),这种称之为表级子查询
in 范围
格式: 主查询 where 条件 in (列子查询)
any | some 任意一个
格式: 主查询 where 列 = any (列子查询)
在条件查询的结果中匹配任意一个即可,等价于 in
all
格式: 主查询 where 列 = all(列子查询) : 等于里面所有
格式: 主查询 where 列 <>all(列子查询) : 不等一其中所有
select * from students
where age in (select age from students where age between 18 and 20)
1.select [选项 all|distinct] 2.*|字段|表达式|表 [as] 别名(从数据源中查询哪些字段) 3.from 数据源 4.where 子句 5.group by 子句 6.having 子句 7.order by 子句 8.limit 子句
选项:
all : (默认值)全部
distinct :去重
*|字段|表达式|表 [as] 别名 (as 可以省略,建议写上)
from 后面接的是数据源, 表示查询数据的来源
语法: where 条件表达式
作用: 使用用于对数据源进行过滤和筛选.
语法: group by 字段
分组的目的: 为了统计结果
用于分组后的再过滤(用法和where一样,只是位置不同)
语法: having 条件表达式
语法: order by 字段 [规则 asc|desc], 字段2 [规则];
限制查询结果的条数,作用是减轻数据库服务器的压力.
语法: limit start,length;