目录
🚩数据库操作
🎈创建数据库
🎈使用数据库
🎈删除数据库
🚩数据类型
🚩表的操作
🎈创建表
🌈查看表结构
🎈删除表
❗练习(综合运用)
🖥️新增数据
📝单行数据 + 全列插入
📝多行数据 + 指定列插入
🖥️查询(Retrieve)
📝全列查询
📝指定列查询
📝查询字段为表达式
📝别名
📝去重:DISTINCT
📝排序:ORDER BY
📝条件查询:WHERE
✅select条件查询执行顺序
这是准备工作,数据库是大小写不区分的,所以我建议是大家都写小写,可读性好。
🚩数据库操作
🎈创建数据库
创建数据库的语法就是
create database zyficl;
我们也可以加上 if not exists 代表的意思是 如果你现在创建的数据库存在那么就不添加,反之添加。 (如果你所创建的数据库已经存在,但是你没有添加if not exists,那么就会报错)
所以我们以后可以加上上面一段,那样就不会报错了
CHARACTER SET 字符集;
所以最完美的写法就是:
create database if not exists do_test character set utf8mb4;
🎈使用数据库
因为我们再进入命令行中的时候,默认是系统的数据库,我们一般都不在系统默认的数据库下进行数据的增删查改,而是在自己所建的数据库中对数据管理,所以我们就要 进入自己的数据库中,这时候我们就用到下面的语句:
use 数据库名;
🎈删除数据库
drop database [if exists] db_name;
上面增加数据库用到if not exists表示是否不存在 ,现在删除数据库需要用到if exists表示是否存在。
数据库删除以后,内部看不到对应的数据库,里边的表和数据全部被删除,所以要慎重删除。
🚩数据类型
我们下面会根据题目来针对性的对一些数据类型进行描述,我们现在利用主要的几个类型
DATETIME:日期类型
后面再插入数据的时候会详细说明。
🚩表的操作
需要操作数据库中的表时,我们需要先使用数据库。
use 数据库名;
🎈创建表
可以使用comment增加字段说明
CREATE TABLE table_name (
field1 datatype, 字段 类型
field2 datatype, 字段 类型
field3 datatype 字段 类型
);
我们创建一个学生表里面包含的字段 (姓名,年龄,密码,性别,身高,体重,生日,留言)
🌈查看表结构
🎈删除表
-- 删除 stu_test 表
drop table stu_test;
-- 如果存在 stu_test 表,则删除 stu_test 表
drop table if exists stu_test;
❗练习(综合运用)
create database if not exists test_goods
default character set utf8mb4;
2.选择数据库
use test_goods;
create table if not exists goods(
goods_id int comment'商品编号',
goods_name varchar(32) comment'商品名称',
unitprice int comment'单价.单位分',
category varchar(12) comment'商品分类',
provider varchar(64) comment'供应商名称'
);
🖥️新增数据
个数,类型要和表结构匹配。
现在创建一个学生表
drop table if exists student;
create table student(
id int,
sn int comment'学号',
name varchar(20) comment'姓名',
qq_mail varchar(20) comment'qq邮箱'
) default character set utf8;
📝单行数据 + 全列插入
insert into 表名 values(值,值,值....);
insert into student values(100,10000,"唐三藏",NULL);
insert into student values(101,10001,"孙悟空","1111");
📝多行数据 + 指定列插入
insert into 表名(列名,列名....)values(值,值.....);
只给某指定的列进行插入数据。其实就是增加行元素。
insert into student(id,sn,name)values
(102,20001,"曹孟德"),
(103,20002,"孙仲谋");
补充:
在MySQL中,你可以使用DATETIME数据类型来表示日期和时间。DATETIME类型以'YYYY-MM-DD HH:MM:SS'的格式存储日期和时间。
以下是如何在MySQL中使用DATETIME类型的示例:
CREATE TABLE example_table ( id INT AUTO_INCREMENT PRIMARY KEY, event_datetime DATETIME );
在这个示例中,我们创建了一个名为example_table的表,其中包含一个名为event_datetime的DATETIME类型列。
你可以使用INSERT语句向表中插入日期时间值,如下所示:
INSERT INTO example_table (event_datetime) VALUES ('2024-03-09 15:30:00');
你也可以使用DATETIME函数来获取当前日期时间:
INSERT INTO example_table (event_datetime) VALUES (NOW());
在检索数据时,DATETIME值将以'YYYY-MM-DD HH:MM:SS'的格式返回。
🖥️查询(Retrieve)
📝全列查询
select*from 表名; //行和列都查询出来
create table if not exists exam_result(
id int,
name varchar(20),
chinese decimal(3,1),
math decimal(3,1),
english decimal(3,1)
)default character set utf8;
INSERT INTO exam_result (id,name, chinese, math, english) VALUES
(1,'唐三藏', 67, 98, 56),
(2,'孙悟空', 87.5, 78, 77),
(3,'猪悟能', 88, 98.5, 90),
(4,'曹孟德', 82, 84, 67),
(5,'刘玄德', 55.5, 85, 45),
(6,'孙权', 70, 73, 78.5),
(7,'宋公明', 75, 65, 30);
📝指定列查询
select 列名,列名,列名 from 表名;
select id,name,english from exam_result;
我指定要查找姓名,英语成绩,id号从成绩表中:
📝查询字段为表达式
查询每个学生语文数学英语的总成绩:
select name,chinese+english+math from exam_result;
-- 表达式不包含字段
SELECT id, name, 10 FROM exam_result;
-- 表达式包含一个字段
SELECT id, name, english + 10 FROM exam_result;
-- 表达式包含多个字段
SELECT id, name, chinese + math + english FROM exam_result;
补充:
SELECT id, name, english + 10 FROM exam_result;
mysql是一个“客户端服务器”结构程度。我们看到上面的结果后,我们得出一个结论:把这一列所有的行带入到表达式中,参与运算,操作不会修改数据库服务器上原始的数据,最终只是临时结果做计算,服务器读出来的时候,返回客户端,以临时表的形式(只出现一次i)
📝别名
select 列名 as 别名 from 表名;
select name,math+english+chinese as total from exam_result;
📝去重:DISTINCT
我增加一个和唐三藏一样的数学成绩的陈陈,然后我要去重相同的数学成绩
一列:
我们看到最后的98.0和第一个98.0删除了,最后只保留一个。
俩列:
如果是俩列必须是俩者都相同才能去重,如果俩者都相同只保留一个操作。不相同删除不了。
我现在插入一个姓名"陈陈”,数学成绩是98.0的
insert into exam_result (name,math) values ("陈陈",98.0);
此时我来去重:此时就剩下一个了。
📝排序:ORDER BY
明确排序规则:以行排列 但是比较的是列与列之间。
- a.针对哪个列进行比较
- b.升序(asc),降序(desc),默认是asc
select 列名 from 表名 order by 列名 (asc/desc/不写);
1. 没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
sql不加order by 此时查询结果数据顺序,是不确定/无序 的,因为我们在自己机器上做的是一些简单的操作,顺序没变,但是如果进行一些更复杂的操作,就不一定了。(意思就是如果我们查看全列表数据,因为我们插入的数据都是简单的,所以每次查看到的时候发现都是一样的排序,但是如果我们操作的复杂,那么会导致每次查看数据的时候就不一定是还是和之前一次是一样的。
我们不能依赖顺序,尤其在代码中,不能依靠上述顺序展开逻辑,因为数据库没有承诺你这个数据库是有序的。所以在后来我们运用了复杂的操作,每次操作展示的顺序是不同的,是不确定。
2. NULL 数据排序,视为比任何值都小,升序(src)出现在最上面,降序(desc)出现在最下面
3.使用表达式及别名排序
4. 可以对多个字段进行排序,排序优先级随书写顺序
📝条件查询:WHERE
会指定具体的条件,按照条件针对数据进行筛选。
sql中没有==,使用=表示比较相等。NULL+98+NULL => NULL<200 => NULL =>false
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!= , <> | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, ...) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
1.基本查询:
SELECT name, english FROM exam_result WHERE english < 60;
SELECT name, chinese, english FROM exam_result WHERE chinese > english
select name,chinese+english+math from exam_result where chinese+english+math<200;
如果我们用as别名
会报错,所以我们要注意: WHERE条件可以使用表达式,但不能使用别名。
✅select条件查询执行顺序
- 1.遍历表中的每个记录
- 2.当前记录值带入条件,根据条件进行筛选 where
- 3.如果这个记录条件成立,就要保留,进行表达式计算
- 4.如果有order by所以都执行完之后,在进行排序(所以上面的order by可以定义别名)
所以where可以使用表达式,但是不能使用别名。
2.AND与OR:and是且(俩个都得成立才成立)or是或(其实一个成立就成立)
select name,chinese,english from exam_result where chinese>80 and english>80;
-- 查询语文成绩大于80分,或数学成绩大于70,并且英语成绩大于70 的同学(意思就是语文和数学成绩其中一个满足即可,但是英语成绩必须大于70)
我们不用记and优先级大于or,我们只需要将or操作打上括号即可。
3.范围查询between..and (闭区间)
In()
select name,chinese from exam_result where chinese between 80 and 90;
select name,chinese from exam_result where chinese>=80 and chinese<=90;
In()相当于随机抽取学生,而不是一个范围
select name,math from exam_result where math in(98,65,84);
SELECT name, math FROM exam_result WHERE math = 58 OR math = 65 OR math
= 98 ;
4.模糊查询:LIKE
孙开头 select name from exam_result where name like "孙%";
孙结尾 select name from exam_result where name like "%孙";
包含孙 select name from exam_result where name like "%孙%";
5.NULL 的查询:IS [NOT] NULL
查询 english成绩 已知的同学姓名
查询 english成绩 未知的同学姓名
5.分页查询:LIMIT
-- 起始下标为 0
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
按id进行分页,每页三条记录,分别显示1,2,3页
接下来就是从下标3开始
接下来就是从下标3开始
此时为空。因为表中只有9行。
自信大方,机会总是留给有准备的人的。