文章目录

  • 1.新增
  • 1.1 不指定列插入
  • 1.2 指定列插入
  • 1.3 一次性插入多行
  • 2.查询
  • 2.1 全列查询(查询表中的所有列)
  • 2.2 指定列查询
  • 2.3 在查寻过程中进行简单计算(列和列之间)
  • 2.4 给查询结果的列指定一个别名
  • 2.5 查询的时候针对列来去重(把重复的记录合成一个)
  • 2.6 针对查询结果进行排序
  • 2.6.1 关于排序的注意事项
  • 2.7 条件查询(按照一定条件进行筛选)
  • 2.7.1 描述条件关系的运算符
  • 2.7.2 基本条件查询示例
  • 2.7.3 使用 % 和 _ 来查询任意个字符
  • 2.7.4 NULL结果查询
  • 2.7.5 使用 limit 来限制查询结果的数量
  • 2.7.6 搭配 0ffset 指定从第几条开始筛选(0ffset是从0开始计算的)
  • 3.修改
  • 3.1 一行记录的修改
  • 3.2 多行记录的修改
  • 3.3 利用表达式进行修改
  • 3.4 多个列的修改
  • 3.5 搭配子句进行修改
  • 4.删除



mysql 修改为外面能连接_数据库

操作数据库最主要的操作就是增删改查,也就是 CURD

  • C 是 create 新增
  • U 是 update 修改
  • R 是 retrieve 查询
  • D 是 delete 删除

1.新增

1.1 不指定列插入

命令格式:

insert into 表名 values(列, 列, 列, 列......);

into 可以省略,但是不建议。

需要注意的是新增前,务必先选中一个数据库。

示例:给 student 表插入两条记录。

mysql 修改为外面能连接_数据库_02


看到图中提示的 OK 后,说明插入成功。

use java 即为选中 java 这个数据库后开始操作。

在 SQL 中不区分单双引号,即单引号和双引号都可以表示字符串

注意:

插入的内容要和数据表的列数和类型匹配,不然不会报错。

可以看出 student 表中有两个列,一个要是整数,一个要是字符或字符串

mysql 修改为外面能连接_mysql_03



列数不匹配的错误信息:

mysql 修改为外面能连接_mysql 修改为外面能连接_04



类型不匹配的错误信息:

mysql 修改为外面能连接_表名_05

1.2 指定列插入

命令格式:

insert into 表名 (列名) values(1);

也可以一次性指定多个列。

命令格式:

insert into 表名 (id, name) values(1, '张三');

如果要指定多个列,就在表名后面的括号里使用逗号分割即可。


演示:

mysql 修改为外面能连接_数据库_06


插入成功。

使用 insert 指定列插入后,未被指定的列则会以 默认值(NULL) 填充。

mysql 修改为外面能连接_表名_07


default 下就是默认值的意思。

1.3 一次性插入多行

命令格式:

insert into 表名 values (列, 列, 列...), (列, 列, 列...);

演示:

mysql 修改为外面能连接_mysql 修改为外面能连接_08


圈出的部分提示我的数据库有3行的数据受到了影响。

现在有一个问题:

为什么在 mysql 中一次插入一条记录,分十次插入的效率要低于一次插入十条记录呢?

1、原因1:由网络请求和响应的时间开销引起的~~

mysql 修改为外面能连接_表名_09


每一次插入都会有一定的时间开销,而十次插入的时间开销明显更多。



2、原因2:数据库服务器是把数据保存在硬盘上的

mysql 修改为外面能连接_表名_10


这就好比,我下楼拿快递,快递到一个我下去拿一个,有几个快递就要拿几次;

然而还可以等所有的快递都到了再一起去拿,这样就一次拿完了。



3、原因3:

mysql关系型数据库,每进行一个sql操作,内部都会开启一个实务,每次开启实务也会有一定的开销。

这个以后会讲到。

2.查询

2.1 全列查询(查询表中的所有列)

命令格式:

select * from 表名;

示例:查询 student 表中的所有学生

mysql 修改为外面能连接_数据库_11


可以看到 student 表的两列信息都查询到了。

2.2 指定列查询

命令格式:

select 列名 from 表名;

示例:查询 student 表中的 name 列。

mysql 修改为外面能连接_表名_12


此时显示出来的就是 name 列的全部信息。

2.3 在查寻过程中进行简单计算(列和列之间)

示例1:计算 books 表中图书减去5元后的价格

命令格式:

select 列名, 列名-5 from 表名;

减去前:

mysql 修改为外面能连接_java_13



减去后:

mysql 修改为外面能连接_java_14


在进行表达式查询的时候,查询结果是一个“临时表”。这个临时表并不是写入到硬盘当中的,临时表的类型也不是和原表类型完全一致(会尽可能把数据给表示进去)。


mysql 修改为外面能连接_java_15


可以发现再次查询全表,价格并未发生改变。

示例2:计算 student 表中所有学生的总分

命令格式:

select 列, 列, 列 + 列 + 列 from 表名;

查询结果:

mysql 修改为外面能连接_java_16


上述结果都是临时表。

表达式查询知识针对每一行所对应的列进行计算,无法进行行与行之间的计算。

2.4 给查询结果的列指定一个别名

命令格式:

select 列, 列, 列 + 列 + 列 total from 表名;

示例:计算 student 表中所有学生的总分

演示:

mysql 修改为外面能连接_mysql 修改为外面能连接_17


total 就是起的别名,直接写在 from 的前面。

但是这样直接在加 from 前面加别名容易看错,这时可以加上一个 as

现在来说优化前面的示例:

命令格式:

select 列, 列, 列 + 列 + 列 as total from 表名;

演示:

mysql 修改为外面能连接_表名_18


得到了与之前相比相同的结果。

2.5 查询的时候针对列来去重(把重复的记录合成一个)

命令格式:

select distinct 列 from 表名;

示例:将 student 表 math 成绩相同的合并为一个。

演示:

mysql 修改为外面能连接_mysql 修改为外面能连接_19


可以看到相同的 math 成绩被去掉了。

distinct 也可以进行多个列的去重,只不过要求是所有的列必须是相同的。

多个列去重的情况:

命令格式:

select distinct 列, 列... from 表名;

示例:将 student 表 math 和 chinese 成绩都相同的合并为一个

演示:

mysql 修改为外面能连接_mysql_20


可以看到两门课程都已经去重完毕。

2.6 针对查询结果进行排序

这里需要用到 order by

示例:将 chinese 成绩排序升序的。

命令格式

select * from 表名 order by 列名;

演示:

mysql 修改为外面能连接_java_21


可以看到 chinese 成绩被排序成升序的了。

列名后面不加东西就是默认升序排列。

mysql 修改为外面能连接_数据库_22


上图即为升序。

降序的写法:

在列名后面加上一个 desc

演示:

mysql 修改为外面能连接_数据库_23


可以看到 chinese 成绩被排序成降序的了

2.6.1 关于排序的注意事项

1、如果 SQL 中没有显示的写 order by,认为查询结果的顺序是不可预期的!!!
写代码不可以依赖这种不可预期的顺序!!!

mysql 修改为外面能连接_java_24

不加 order by ,看起来好像是根据插入的顺序一次排序的。但是实际上,mysql 并没有对顺序做任何的承诺!!!

这个时候就不能依赖的个顺序!!!


2、如果要排序的列中有 NULL ,此时的NULL 就是最小值~~

示例:升序排序 student 表中 chinese 成绩。

mysql 修改为外面能连接_java_25

可以看到表示最小值的 NULL 被排在了第一个。

如果要是多个纪录,排序的列值相同,此时先后顺序也是不确定的~~

3、排序也可以针对表达式或者别名来进行~~

示例:按照同学的总分进行升序排序

命令格式:

select 列名, 列名 + 列名 + 列名... as total from 表名 order by 别名;

演示:

mysql 修改为外面能连接_表名_26


此时就是按照升序排成总分。

因为在 SQL 中NULL和任何值计算。结果都是 NULL,所以罗志祥的总分才会最低。

4、排序还可以指定多个列进行排序(更复杂的比较规则)

示例:先按照 chinese 成绩排序,再按照 math 成绩排序。

命令格式:

select * from 表名 order by 列名, 列名;

演示:

mysql 修改为外面能连接_mysql_27

2.7 条件查询(按照一定条件进行筛选)

mysql 修改为外面能连接_mysql_28

2.7.1 描述条件关系的运算符

关系运算符

mysql 修改为外面能连接_java_29



<=> 是针对 NULL 特殊处理了,使用 = 来比较某个值和 NULL 之间的关系,

结果任然是 NULL,NULL 又会被当做 false。

like 作为模糊匹配,不要求值完全相等,只满足一部分相等即可。

逻辑运算符


mysql 修改为外面能连接_java_30

2.7.2 基本条件查询示例

示例1:查询 chinese 成绩低于70分的同学

命令格式:

select 列名, 列名 from 表名 where 列名 < 70;

演示:

mysql 修改为外面能连接_数据库_31


NULL 和任何数据进行计算都是 NULL,NULL < 70 被当成 false。

这就是为什么罗志祥没被查到的原因。

示例2:查询 english 成绩好于 chinese 成绩的同学

命令格式:

select * from 表名 where 列名 > 列名;

演示:

mysql 修改为外面能连接_mysql 修改为外面能连接_32

示例3:查询总分大于200的同学

命令格式:

select 列名, 列名 + 列名 + 列名 as total from 表名 where 列名 + 列名 + 列名 > 值;

演示:

mysql 修改为外面能连接_数据库_33


在这条命令中 where 后面的条件不能使用别名来表示。

示例4:查询语文和数学成绩大于70的同学

命令格式:

select 列名, 列名, 列名 from 表名 where 列名 > 值 and 列名 > 值;

演示:

mysql 修改为外面能连接_mysql 修改为外面能连接_34

示例5:查询数学成绩大于80或者语文成绩大于80的同学

命令格式:

select 列名, 列名, 列名 from 表名 where 列名 > 值 or 值 > 值;

演示:

mysql 修改为外面能连接_mysql_35


在条件中如果有 and 和 or 要先计算 and 后计算 or。

示例6:查询语文成绩在70~90之间的同学。

命令格式1:

select 列名, 列名 from 表名 where 列名 >= 值 and 列名 <= 值;

演示:

mysql 修改为外面能连接_数据库_36



命令格式2:

select 列名, 列名 from 表名 where 列名 between 值 and 值;

演示:

mysql 修改为外面能连接_mysql_37


between and 可以查询索引,效率更快。

示例7:查询数学成绩是 72 或者 75 或者 87 或者 76分的同学及数学成绩。

命令格式1:

select 列名, 列名 from 表名 where 列名 = 值 or 列名 = 值 or 列名 = 87 or 列名 = 值;

演示:

mysql 修改为外面能连接_mysql 修改为外面能连接_38

命令格式2:

select 列名, 列名 from 表名 where 列名 in(值, 值, 值, 值);

演示:

mysql 修改为外面能连接_java_39

2.7.3 使用 % 和 _ 来查询任意个字符

1、在 SQL 中 % 可以用来表示任意个字符。

示例:查询名字带张的同学。

命令格式:

select * from 表名 where 列名 like '值%';

演示:

mysql 修改为外面能连接_表名_40


% 在数值的最后面,只能查询到一 ‘张’ 开头的信息,若是 ‘张’ 在末尾或是中间位置则查询不到。

可以看到小张名字也带张,但是没有查询出来。

mysql 修改为外面能连接_mysql 修改为外面能连接_41



如果要查询末尾的字符,将 % 放到开头位置即可。

演示:

mysql 修改为外面能连接_数据库_42



如果将要查询的字符放到中间位置,只要是这个字符就会显示。

演示:

mysql 修改为外面能连接_表名_43

2、SQL 中 _ 表示匹配任意一个字符。

示例:在张后面匹配两个字符

命令格式:

select * from 表名 where 列名 like '值_';

演示:

mysql 修改为外面能连接_表名_44



要匹配几个字符就加几个 _

下图是匹配两个字符的

mysql 修改为外面能连接_表名_45

下划线可以在两端位置,也可以在中间位置。

mysql 修改为外面能连接_mysql 修改为外面能连接_46


模糊查询对数据库来说,查询的开销还是比较大的。

2.7.4 NULL结果查询

示例:查询语文成绩是null的同学

查询空结果的错误命令:

select * from 表名 where 列名 = null;

带入的条件如果是null,比较的结果也会是null,会被当成false。

正确的命令1:

select * from 表名 where 列名 <=> null;

演示:

mysql 修改为外面能连接_java_47

正确的命令2:

select * from 表名 where 列名 is null;

演示:

mysql 修改为外面能连接_数据库_48

is null 只能用来比较一个列是否为空。
<=> 可以用来比较两个列,如果某一个行两列都是null,也能查询出来。

2.7.5 使用 limit 来限制查询结果的数量

示例:查询前三个同学的信息

命令格式:

select * from 表名 limit 值;

演示:

mysql 修改为外面能连接_数据库_49


只查询到了前三个同学的成绩。

limit 后面的数字表示查询的是前n条数据。

2.7.6 搭配 0ffset 指定从第几条开始筛选(0ffset是从0开始计算的)

示例:从第一条数据开始进行筛选

命令格式:

select * from 表名 limit 值 offset 值;

演示:

mysql 修改为外面能连接_mysql_50


第一条数据被筛选掉了。

3.修改

3.1 一行记录的修改

示例:将张三同学的数学成绩改为80分

命令格式:

update 表名 set 列名 = 值 where name = '张三';

演示:

mysql 修改为外面能连接_数据库_51


可以看到张三的数学成绩改为了80分。


set math 表示描述了数学这一个列。

where = ‘张三’ 描述了那些行需要修改,条件如果是真就修改,是假就pass。

3.2 多行记录的修改

使用 like 进行模糊查找

示例:将所有名字带张的同学的数学成绩改为66

命令格式:

update 表名 set 列名 = 值 where 列名 like '%张%';

演示:

mysql 修改为外面能连接_表名_52

3.3 利用表达式进行修改

示例:把所有同学的语文成绩减去10分

命令格式:

update 表名 set 列名 = 列名 - 值;

演示:

mysql 修改为外面能连接_mysql 修改为外面能连接_53

3.4 多个列的修改

示例:将张三同学的三科成绩改为0分

命令格式:

update 表名 set 列名 = 值, 列名 = 值, 列名 = 值 where 列名 = '字符';

演示:

mysql 修改为外面能连接_表名_54

3.5 搭配子句进行修改

update 还可以搭配 order by 和 limit 等子句。

示例:给总成绩倒数第一名的同学的数学成绩设置成100分。

思路:

  • 先求总分并按升序排序。
  • 再设置为100分。

1、求总分的命令格式:

select 列名, 列名 + 列名 + 列名 as 别名 from 表名 order by 别名;

演示:

mysql 修改为外面能连接_数据库_55

2、设置100分的命令格式:

update 表名 set 列名 = 值 order by 列名 + 列名 + 列名 limit 值;

演示:


mysql 修改为外面能连接_java_56


可以看到总分倒数第一张三同志数学成绩被改为了100。

4.删除

示例:删除张三同志的考试成绩

命令格式:

delete from 表名 where 列名 = '字符';

演示:

mysql 修改为外面能连接_mysql_57


可以发现张三被删除了。

delete 是一个永久性的删除。

后面的条件也是和update一样,可以支持where 、order by、limit。

如果没写条件,就把整个表里的记录都删了。