目录
一. CRUD
数据库的主要功能就是管理数据,对数据进行增删改查的操作,也成CRUD
CRUD操作
- C:Create (创建)
- R:Retrieve(读取)
- U:Update(更新)
- D:Delete(删除)
这些操作构成了大多数应用程序与数据库交互的基础,数据表的操作一定是在数据库的基础上进行的,数据的更新和删除是在数据存在的基础上进行的
二. 增加
1)直接插入
格式:insert into 表名 values (值,值……);
创建表的格式:
create table student(id int,name varchar(20),sex varchar(20));
insert into student values (1,'张三','男');
- 这里插入的值必须和创建表时候的格式相互对应(创建时第一个为int类型,那么插入的时候第一个必须是数字)
- 如果插入的是varchar类型,那么就要使用 ' 或者 " 来表示字符串,SQL中没有字符类型
- 值必须使用()括起来
2)指定插入
格式:insert into student (列名,列名……) values (值,值……);
insert into student (name) values ("韩信");
- 在表名后指定的类,必须使用()括起来
- 如果存在多个列,但是只插入一个列,那么其他没有赋值的列。默认值是NULL
3)插入多行记录
insert into student (name) values ("韩信"),("李白"),('立白');
insert into student values (1,'张三','男'),(1,'张三','男'),(1,'张三','男'),(1,'张三','男');
- 这里指定插入和直接插入都是可以一次性插入多行记录
- 一次性插入多行记录比一次插入一行记录,分多次插入快很多。
由于MySQL是客户端-服务器结构程序,每一次发出请求,都会返回一个响应,一次性请求发送多个记录,返回一个响应,分多次发送,会返回多个请求,多次网络交互会消耗更多时间
三. 删除
格式:delete from 表名;
delete from score;
- 这样是清空表里面的所有内容,但是表还存在
- 也可以在后面添加一些限制,从而删除掉具体的某一行,不指定就是删除整个表内的数据
区分drop table 和 delete from 之间的区别
- drop table是删除了表并且也删除了表里的数据,delete from只是删除了表里的数据,表还在
- 可以认为drop table 是吃了饼干并且盒子也扔了,delete from是吃了饼干但是盒子还在
四. 修改
格式:update 列名,列名…… set 列名=值 ;
update score set chinese = 10 where id = 1;
- 一般在使用的时候,会在后面使用where语句添加一些限制条件
- 这里的 = 起到的作用就是赋值,而不是判断是否相等
- 这里也可以使用一些简单的表达式,必须写成math=math+10这种格式,不能是math+=10这样
- 如果不加限制条件,那么就是对表内的所有行都进行修改
五. 查看
在进行查询操作之前,先添加一些数据,用于操作
-- 先添加一些数据,用于观察
create table score(id int ,name varchar(20),
chinese int ,math int ,english int );
insert into score values (1, '张三', 67, 98, 56),(2, '李四', 88, 72, 90),
(3, '王五', 45, 89, 100),(4, '陈六', 77, 65, 82),(5, '孙七', 95, 88, 76),
(6, '周八', 58, 74, 85),(7, '吴九', 100, 99, 97),(8, '郑十', 33, 41, 60),
(9, '刘十一', 89, 92, 84),(10, '杨十二', 70, 75, 68);
1)全列查询
格式:select *from 表名;
select *from score;
- 将表中的所有行和列都查询出来,这里 * 表示所有的列和行
- 这里将服务器通过网络将数据返回,客户端通过表格的形式打印出来
这种一次性查出所有的列和行的数据,具有一定的危险性!!!
- 如果数据库中的这个数据表中的数据非常多,一旦查询所有数据,可能会造成阻塞情况
- 数据存储在硬盘中,读取非常多的数据,可能会将硬盘的IO占满,如果有其他的程序访问硬盘会变的非常慢。
- 对于网络来说,一次性访问大量的数据,可能会把网卡的带宽跑满,这时候如果有其他客户端想要访问服务器会非常慢,可能会造成网卡堵塞情况。
2)指定列查询
格式:select 列名,列名 from 表名;
select id,name from score;
- 将想要查询的列名放在from前面
- 多个列名之间使用,分割
3)查询字段为表达式
格式:select 表达式 from 表名;
select chinese-10 from score;
- 这种由列名构成的表达式,在执行过程中会将这一列中的所有行,带入表达式中参与运算
- 这里的操作不会修改数据库上的数据,数据只是在这里做了一个临时处理
- 可以理解为先临时存储返回查询的结果,在返回的结果上进行修改
- 客户端以临时表的形式展现出来
4)带别名查询
如果这里运行的表达式很复杂或者这个列名不容易理解,通常会使用起别名的方式
格式:select 表达式 as 别名 from 表名;
select chinese+math+english as '总分' from score;
- 这里的别名,只在这条SQL语句中有用,在展示的时候生效,在后面的SQL语句中,就没有用了
- 这里的as可以省略,但是不建议,省略了不好观察
5)去重查询
这里先添加一些数据,用于区分
insert into score values
(11, '张三', 67, 88, 26),
(12, '李四四', 88, 72, 90);
依靠关键字distinct进行去重操作
格式:select distinct 列名,列名…… from 表名;
select distinct name,math from score;
- 这里的列名也可以选择多个,如果多个列名就需要保证这一行多个列名对应的数据都相同才可以删掉,需要满足所有的列值都相等才会删除掉
6)排序查询
格式:select 列名,列名…… from 表名 order by 列名,列名…… desc/asc;
select id,name,chinese from score order by chinese desc;
- 这里的排序要明确排序的规则,选择哪个列名作为比较的规则,排序的时候是升学还是降序
- 如果存在多个列名作为比较规则,第一个为主要比较规则,当第一个列值出现相同的时候,这时候比较第二个列值。
- asc为升序,desc为降序,如果没有指定就默认升序排序
- 排序查询也是先将查询到的结果临时存储,然后进行排序,将排序好的数据返回给客户端
- 这里的排序是针对临时存储数据,不会影响数据库存储的数据
- 如果数据为NULL默认最小,也可以对表达式进行排序
如果不使用order by进行查询,那么得出的结果是不确定的/无序 ,当数据少的时候,觉得是有序,但是如果数据多了或者进行复杂的操作,那么得出的结果就不一定有序
7)条件查询
使用where关键字,对数据进行筛选
格式:select 列名,列名…… from 表名 where 条件;
select name,chinese from score where chinese>80;
条件查询,本质上是将这个条件遍历数据表中的每一行数据。如果条件成立,会将它放入结果集合中,如果不成立就忽略。
MySQL中常见的运算符
运算符 | 说明 |
---|---|
> , >= , < , <= | 大于、大于等于、小于、小于等于 |
= | 等于,NULL 不安全 |
<=> | 等于,NULL 安全 |
!= , <> | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,闭区间 [a0, a1] ,若 a0 <= value <= a1 返回 TRUE |
IN (option, ...) | 若值是 option 中的任意一个,则返回 TRUE |
IS NULL | 判断是否为 NULL |
IS NOT NULL | 判断是否非 NULL |
LIKE | 模糊匹配:% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
- 在其他的编程语言中,=表示赋值,但是在MySQL中,表示判断,MySQL中没有==符号
- =符号在判断NULL=NULL 的时候结果为NULL
- <=>符号在判断NULL=NULL 的时候结果为true
- BETWEEN表示一个区间,IN表示一个具体的值(如果对应就true)
- %韩表示以韩结尾,韩%表示以韩开头,%韩%表示名字中带有韩字
- 这里between两边都是闭区间,in有点类似离散集合,不连续
举例:查找语文比数学好的同学
select name,chinese,math from score where chinese>math;
无论出现多少个列,都是使用这样的格式进行查询
这里的条件查询还可以搭配表达式
举例:查询总分在250以上同学
select name,chinese+math+english as "总分" from score where chinese+math+english>250;
执行顺序
- 先执行from语句,从数据表中读取数据记录,将获取的数据记录临时存储起来,
- 执行where语句,后续的操作在临时存储中的数据中进行,根据where语句中的条件(执行相加操作)进行筛选临时数据中的内容
- 再执行select语句,在筛选后的数据记录中,取出想要查询的字段(这里会再进行一次相加操作)
- 如果有order by 语句,那么最后会对筛选后并选取字段的结果,进行排序
在where语句中不能使用别名,因为取别名这一步是第三步执行的,where语句是第二步执行的
MySQL中的逻辑运算符
运算符 | 说明 |
---|---|
AND | 逻辑与:所有条件 同时成立 时返回TRUE,否则返回FALSE |
OR | 逻辑或:任意一个条件成立时返回TRUE,全部不成立时返回FALSE |
NOT | 逻辑非:对条件取反 |
- AND的优先级高于OR,如果需要同时使用,可以使用小括号包裹住优先执行的部分
举例:查询语文大于90且英语大于70的同学
select name,chinese,english from score where chinese>90 and english>70;
8)分页查询
格式:select 列名,列名…… from 表名 limit 筛选的个数 offset 起始位置(从这个数的下一位开始);
select id,name from score limit 3 offset 3;
- 在前面说一次性查询出所有的列和行数据,如果数据过大,则具有一定的危险性,这时候就可以使用limit
- limit用于限制这次查询最多查出来的个数
在数据使用中,一定要注意!!!这里的很多操作都是危险操作,一旦没有将条件设置好,可能会造成一些不可挽回的效果
六. 补充
1)数据库的备份
方法1:数据库中的数据都是存储在硬盘上,以二进制的形式体现,可以直接将这个文件拷贝到别的的机器上(全量备份)
方法2: 使用MySQldump工具,使用这个工具将MySQL数据库中的数据,导出一系列的insert语句,通过在另外的数据库中执行这些语句,从而实现数据库内容的迁移和备份。
方法3:binlog功能,将数据库中的各种操作通过日志记录下来,让另一个数据库根据binlog中的内容进行执行,从而得到一样的数据。
一个主机上是可以部署多个MySQL服务器,通过改变端口号的方式
2)配置文件
MySQL中的功能是非常复杂的,存在一些功能,具有很多的选项,如果想要使用某一个功能,就需要在配置文件中具体配置,让程序听你的话,按你说的来
先来说说配置文件在哪里
1)先找到对应的文件目录
这里两个都可以
2)打开其中的属性
3)复制里面的目标内容,使用记事本打开
4)根据配置文件的地址,找到相应的文件
5)打开文件
这里的#部分是注释,具体的内容是没有注释的部分,可以在这里修改配置相关的信息
修改完后不要忘记保存哦!!!保存之后需要重启服务器才可以生效