2022/2/24 2/25
一、数据库
1.数据库的基本概念
1.数据库的英文单词:DataBase 简称 DB
2.什么是数据库?:用于存储和管理数据的仓库。
3.数据库的特点:
1)持久化存储数据的,其实数据库就是一个文件系统
2)方法存储和管理数据
3)使用了统一的方式操作数据库 -----SQL
2.MySQL数据库软件
(cmd窗口下)
1.登录:
1.mysql -uroot -p密码
2.mysql -h连接目标的ip -uroot -p连接目标的密码
3.mysql --host=连接目标的ip --user=root --password=连接目标的密码
2.退出
1.exit
2.quit
数据库:文件夹
表:文件
数据:文件中的数据
3.SQL(结构化查询语言)
1.什么是SQL:其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式都存
在不一样的地方,称为“方言”。
2.SQL的通用语法:
1)SQL语句可以单行或多行书写,以分号结尾
2)可使用空格和缩进来增强语句的可读性
3)MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
4)3种注释:单行注释(-- 注释内容 或 # 注释内容),多行注释(/* 注释内容*/)
3.SQL分类
1)DDL:数据定义语言:用来定义数据库对象(数据库,表)
2)DML:数据操作语言:用来对数据库中表的数据进行增删改。
3)DQL:数据查询语言:用来查询数据库中表的记录。
4)DCL:数据控制语言:用来定义数据库的访问权限和安全级别,及创建用户。
DDL:操作数据库、表
1.操作数据库:CRUD
1.C(Create):创建
创建数据库:create database 数据库名称;
创建数据库,判断不存在,再创建:create database if not exists 数据库名称;
创建数据库,并指定字符集:create databse 数据库名称 character set 字符集名;
练习:创建db4数据库,判断是否存在,并指定字符集为gbk
create database if not exists db4 character set gbk;
2.R(Retrieve):查询
查询所有数据库名称:show databases;
查询某个数据库的字符集:查询某个数据库的创建语句
show create database 数据库名称;
3.U(Updata):修改
修改数据库的字符集:alter database 数据库名称 character set 字符集名称;
4.D(Delete):删除
删除数据库: drop database 数据库名称;
判断数据库是否存在,存在则删除: drop database if exists 数据库名称;
5.使用数据库
查询当前正在使用的数据库名称:select database();
使用数据库:use 数据库名称;2.操作表
1.C(Create):创建
1.语法e:
1)create table 表名(
列名1 数据类型1,
列名2 数据类型2,
列名3 数据类型3,
............
列名n 数据类型n
);
2)注意:最后一列,不需要加逗号(,)
3)数据类型:
1.1 int 整数类型 (age int)
1.2 double 小数类型(score double(5,2))(这个小数一共有5位,保留2位小数)
1.3 date 日期,只包含年月日,yyyy-MM-dd
1.4 datetime 日期,包含年月日时分秒,yyyy-MM-dd HH:mm:ss
1.5 timestamp 时间戳类型,包含年月日时分秒,yyyy-MM-dd HH:mm:ss
注意:若字段为时间戳类型,却不给字段赋值或赋值为null,则默认使用当前系统时间自动赋值.
1.6 varchar 字符串(name varchar(20))(姓名最大20个字符)
注意:zhangsan 8个字符 张三 2个字符
2.创建表(创建表之前,要先查询目前正在使用的表(select database();),如果不是我们需要的那个数据库,则使用我们需要的数据库(use 我们需要的数据库名))
create table student(
id int,
name varchar(32),
age int,
score double(5,3),
birthday date,
insert_time timestamp
);
3.复制表:create table 表名 like 被复制的表名;
2.R(Retrieve):查询
1)查询某个数据库中所有的表名称:show tables;
2)查询表结构:desc 表名;
3.U(Update):修改
1)修改表名:alter table 表名 rename to 新的表名;
2)修改表的字符集:alter table 表名 character set 字符集名称;
注意:字符集utf-8,在数据库操作中写成utf8
3)添加一列:alter table 表名 add 列名 数据类型;
4)修改列名称 类型
1.1修改列所有:alter table 表名 change 列名 新列名 新数据类型;
1.2修改列数据类型:alter table 表名 modify 列名 新数据类型;
5)删除列:alter table 表名 drop 列名;
4.D(Delete):删除
1)删除一个表:drop 表名;
2)判断是否有这个表再删除:drop table if exists 表名;
客户端图形化工具:SQLYog
DML:增删改表中数据
1.添加数据:
语法:insert into 表名(列名1,列名2,...,列名n) values(值1,值2,...,值n);
注意:1.列名和值要一一对应
2.如果表名后,不定义列名,则默认给所有列添加值
insert into 表名 values(值1,值2,...,值n);
3.除了数字类型,其他类型需要使用引号(单双都可以)引起来 USE db1; INSERT INTO student(id,namee,sorce) VALUES(1,'卢楠',90); DESC student; SELECT * FROM student; ALTER TABLE student MODIFY sorce INT; ALTER TABLE student MODIFY namee VARCHAR(32); ALTER TABLE student CHANGE name1 namee VARCHAR(20); INSERT INTO student VALUES(2,"易烊千玺",22); ALTER TABLE student ADD sex VARCHAR(20);
2.删除数据
语法:delete from 表名 [where 条件]
注意:1.如果不加条件,则删除表中所有记录
2.如果要删除所有记录
1)delete from 表名; (不推荐使用,因为会一条条记录删,操作复杂)
2)truncate table 表名;(推荐使用,它是先删除表,再创建一张一样的空 表,效率更高)DELETE FROM student WHERE id=1; DELETE FROM student; TRUNCATE TABLE student;
3.修改数据
语法:update 表名 set 列名1 = 值1,列名2 = 值2,...[where 条件];
注意:如果不加任何条件,则会将表中所有记录全部修改。UPDATE student SET sex="女" WHERE id=1; UPDATE student SET sorce=100;
DQL:查询语句
查询表中的记录
1.select * from 表名;
1.语法:
select 字段列表
from 表名列表
where 条件列表
group by 分组字段
having 分组之后的条件
order by 排序
limit 分页限定
2.基础查询
1.多个字段的查询
select 字段名1,字段名2...from 表名;
注意:如果查询所有字段,则可以使用*来替代字段列表。
2.去除重复:distinct
3.计算列
1.一般可以使用四则运算计算一些列的值(一般只会进行数值型计算)
2.ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
表达式1:哪个字段需要判断是否为null
表达式2:如果该字段为null后的替换值
4.起别名:as:as也可以省略-- 查询 -- 查询姓名和成绩 SELECT namee,sorce FROM student; -- 查询性别 SELECT sex FROM student; -- 去除重复结果 -- 去除姓名为重复的只保留一条 SELECT DISTINCT namee FROM student; -- 去除姓名和成绩都一样的重复的只保留一条 SELECT DISTINCT namee,sorce FROM student; -- 计算 -- 计算两倍的成绩 SELECT sorce,sorce+sorce FROM student; -- 如果有null参与的运算,计算结果都为null -- 可以用ifnull替换null值 SELECT sorce,IFNULL(sorce,0)+IFNULL(sorce,0) FROM student; -- 起别名 -- 加as SELECT namee AS 姓名,sorce AS 成绩 FROM student; -- 不加as SELECT sorce 成绩,IFNULL(sorce,0)+IFNULL(sorce,0) 双成绩 FROM student;
3.条件查询
1.where子句后跟条件
2.运算符
1)> , < , >= , <= , = , <>
2)BETWEEN A AND B:数据在A和B之间
3)IN(集合):数据在这个集合中
4)LIKE:模糊查询
占位符:_(单个字符),%(0到多个字符)
5)IS NULL (为空)IS NOT NULL (不为空)
6)and 或 &&
7)or 或 ||
8)not 或 !-- 查询年龄大于20岁 SELECT * FROM student WHERE age > 20 ; SELECT * FROM student WHERE age >= 20 ; -- 查询年龄等于20岁 SELECT * FROM student WHERE age = 20; -- 查询年龄不等于20岁 SELECT * FROM student WHERE age != 20; SELECT * FROM student WHERE age <> 20; -- 查询年龄大于等于20岁 小于等于30 SELECT * FROM student WHERE age >+ 20 && age <= 30; SELECT * FROM student WHERE age >+ 20 AND age <= 30; SELECT * FROM student WHERE age BETWEEN 20 AND 30; -- 查询年龄22岁,18岁,25岁的信息 SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25; SELECT * FROM student WHERE age IN(22,18,25); -- 查询性别为null的信息 SELECT * FROM student WHERE sex = NULL;-- 这是不对的,null值不能使用=(!=)判断 SELECT * FROM student WHERE sex IS NULL; -- 查询性别不为null的信息 SELECT * FROM student WHERE sex IS NOT NULL; -- 查询姓王的人 SELECT * FROM student WHERE namee LIKE "王%"; -- 查询姓名第二字是楠的人 SELECT * FROM student WHERE namee LIKE "_楠%"; -- 查询姓名是三个字的人 SELECT * FROM student WHERE namee LIKE "___"; -- 查询姓名中包含尔的人 SELECT * FROM student WHERE namee LIKE "%尔%";
DQL:查询语句
1.排序查询
语法:order by 子句
order by 排序字段1 排序方法1,排序字段2 排序方法2...
排序方式:
ASC(升序,默认的),DESC(降序)
注意:如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。-- 按照降序给id号排序 SELECT * FROM student ORDER BY id DESC; -- 按照成绩排名,如果成绩一样,则按照年龄排名 SELECT * FROM student ORDER BY sorce ASC,age DESC;
2.聚合函数:将一列数据作为一个整体,进行纵向的计算。
1)count:计算个数
1.1一般选择非空的列:主键
1.2 count(*)
2)max:计算最大值
3)min:计算最小值
4)sum:计算和
5)avg:计算平均值
注意:聚合函数的计算,排除null值。
解决方法:1.选择不包含非空的列进行计算
2.IFNULL函数-- 计算id列有几个id SELECT COUNT(IFNULL(id,0)) FROM student; -- 计算age列有几个(由于age的其他列都为空,所以count最好用主键 SELECT COUNT(age) FROM student; -- 计算所有 SELECT COUNT(*) FROM student; -- 计算sorce最大值 SELECT MAX(IFNULL(sorce,0)) FROM student; -- 计算sorce最小值 SELECT MIN(IFNULL(sorce,0)) FROM student; -- 计算sorce和 SELECT SUM(IFNULL(sorce,0)) FROM student; -- 计算sorce平均值 SELECT AVG(IFNULL(sorce,0)) FROM student;
3.分组查询
1. 语法:group by 分组字段;
2. 注意:
1.1 分组之后查询的字段:分组字段,聚合函数
1.2 where 和 having 的区别?
1)where在分组之前进行限定,如果不满足条件,则不参与分组。
having在分组之后进行限定,如果不满足结果,则不会被查询出来。
2)where后不可以跟聚合函数,having可以进行聚合函数的判断。-- 按照性别分组,分别查询男女同学的平均分 SELECT sex,AVG(sorce) FROM student GROUP BY sex; -- 按照性别分组,分别查询男女同学的平均分,人数 SELECT sex,AVG(sorce),COUNT(id) FROM student GROUP BY sex; -- 按照性别分组,分别查询男女同学的平均分,人数 要求:分数低于70分的人,不参与分组 SELECT sex,AVG(sorce),COUNT(id) FROM student WHERE sorce > 70 GROUP BY sex; -- 按照性别分组,分别查询男女同学的平均分,人数 要求:分数低于70分的人,不参与分组,,人数要大于2个人 SELECT sex,AVG(sorce),COUNT(id) FROM student WHERE sorce > 70 GROUP BY sex HAVING COUNT(id) > 2; SELECT sex,AVG(sorce),COUNT(id) 人数 FROM student WHERE sorce > 70 GROUP BY sex HAVING 人数 > 2;
4.分页查询
1.语法:limit开始的索引,每页查询的条数;
2.公式:开始的索引 = (当前的页码 -1)* 每页显示的条数
3.分页操作时一个”方言“-- 每页显示2条记录 SELECT * FROM student LIMIT 0,2;-- 从第0条开始,每页两条记录 (第一页) SELECT * FROM student LIMIT 2,2;-- (第二页) -- select * from student limit (3-1)*2,2; (第三页) SELECT * FROM student LIMIT 4,2; -- 公式:开始的索引 = (当前的页码 -1)* 每页显示的条数