增删改查的前提,是已经把数据库创建好,并且选中了,表也创建就绪了~
1.新增元素
在上图这个表里新增
- insert into 表名 values(值,值,值...); 此处的值的个数要和表的列数相匹配.值的类型也要和列的类型匹配~ 如果不匹配就报错捏~(字符串要加单引号)
在SQL中可以使用双引号也可以用单引号,SQL里没有"字符类型"
其他的没有字符类型的编程语言,Python,JS,也是单双引号都能表示的字符串~
- 不一定把这一行的所有列都插入数据.
- 也可以一次插入三个数据(多次 插入 多条 记录会慢很多)
指定name这一列进行插入; 其他未被指定的列(id),填入的值就是这一列的默认值,也就是null.
2.查询
查询操作比较复杂,先介绍一些比较简单的查询~
1.select语句全列查询.直接把整个表里面的数据都查出来
- select*from 表名; (*是通配符,表示匹配任意列)
select*表名;在数据量大的情况下任意把磁盘IO,或网络宽带吃满,出现卡顿,影响外面用户体验.
我们可以按Ctrl+c 来中断.
- 指定列查询select 列名,列名,列名......form 表名;
- 当我们省略一些不必要的列就节省大量磁盘IO和网络带宽了~
3) 查询的时候带有表达式,让查询结果进行一些计算~
我们重新写一个表来举例子(如下):
//注:decimal(3,1)是数据有三位有效数字,小数点后一位数.
对这个表的查询结果 做一些 计算操作如下:
我们试着加了20,结果是超出前面定义的3位有效数字也不会报错.
4)查询的时候起别名
5)去重查询
select distinct 列名 from 表名;会把查询结果相同的行,合并成一个;
这个表里面第一行的 [唐三藏] [98.0]这个数据和最后一行的[唐三藏] [98.0]这些数据一样,所以用去重查询,两个记录变成一个记录了.
6)排序order by(默认升序)
select*from exam order by chinese;
asc为升序(从小到大)
desc为降序(从大到小)(descending order)
应用:
select name,chinese+english+math as total from exam order by total desc;
也可以指定多个列排序,先以第一个列为优先标准进行比较.如果第一列不分胜负,再按照第二列比较~
运算符
SQL里没有==,=就是等于不是赋值
下面对运算符的运用
1.查询英语不及格的同学,及英语成绩(<60)
select*from 表名 where 列名<60;
下面这个是原表,null是false所以没有被选出来.
取别名:查询语文数学英语加起来小于200,取别名叫total,的同学和total.
select 列名,列名+列名+列名 as total from 表名 where 列名+列名+列名<200;
但是注意不能这样,直接用别名进行运算符的使用.
select 列名,列名+列名+列名 as total from 表名 where total<200;
2.and运算符(&&),两个条件都要满足
select*from 表名 where 列名>80 and 列名>80;
查询语文成绩大于80分,且英语成绩大于80分的同学
3.or运算符(||),两者任意一个成立就可以
select*from 表名 where 列名>80 or 列名>80;
注意:如果一个条件中同时有and 和or,优先计算and.
但是加上括号就是先算括号里的
4.between a0 and a1
查询语文成绩在[80,90]分的同学及语文成绩(下面这两种方法都可以)
select*from 表名 where 列名 >=80 and chinese <=90;
select*from 表名 where 列名 between 80 and 90;这种between and 更加高效.
5. in(....)如果是括号里的任意一个则返回括号里的
select*from 表名 where 列名 in(58,59,98,99);
6.like 通过like来完成模糊查找
需要用到通配符.可以用 百分号 来代替任意个字符;用 _ 来代替一个任意字符
匹配以孙开头的数据
select*from 表名 where 列名 like '孙%' ;
%孙 匹配以 孙 结尾的数据
%孙% 匹配包含 孙 的数据
% 匹配任意数据
匹配两个任意字符
匹配一两个任意字符
虽然数据库支持模糊匹配,但是慎重使用,因为效率很低
7.null 和 <=>
不能直接用=来进行匹配,运行之后说空.
要用到<=>
select* from 表名 where 列名 <=> null ;(sql不区分大小写)
也可以用is null 也可以和null进行比较
8.分页查询
使用limit关键字来进行限制返回的结果条数~用offset来确定从第几条开始进行返回~
select 列名 from 表名 limit N offset M;(此处offer也可以省略,如果省略表示从第0条记录开始返回)
select 列名 from 表名 limit M,N
从第M条开始查询,最多返回N条记录~
limit可以和order by,where 等子句搭配使用
查询总成绩前三名的同学信息~
注:加上where条件筛选和limit,用select*才不会把数据库弄挂了.
注释:
-- (两个横线一个空格)
修改Update
此处的修改是针对服务器进行~这里的修改是持续有效的~
update 表名 set 列名 = 值,列名 = 值....where 子句;
把孙悟空的数学成绩改成80 ;
update exam_result set math = 80 where name = '孙悟空';
我们查看一下
总成绩倒数前三的三位同学的数学成绩加上30分.
update exam_result set math = math+30 order by chinese+math+english limit 3;
超出范围了(数学超出一百分了).就报错了.
给他们都-30,就不会超出范围了.
update操作也是比较危险的操作,只能靠备份的副本.
delete操作 只是把表的内容清空了表还在
总结
insert into 不能插入中文,我们要修改配置文件使用UTF-8字符集
步骤1.查看自己的 字符集 输入 show variables like 'character%';
下图中database 和server都要是utf8
步骤2.找到配置文件
步骤3.右击选择属性
步骤4.复制目标里的
步骤5.复制到记事本上,再单独复制这段蓝色框起来的部分
步骤6.把这段路径复制到文档的搜索框
步骤7.点开my.ini 有的电脑可能叫 my没有扩展名
步骤8.修改下面红色框框的位置,改成图上的内容;然后保存即可
步骤9.重启MySQL服务器;开始菜单里搜索服务打开服务,找到MySQL右击,点[重新启动]
步骤10.删除掉之前的库.结束.
最后:所有查询结果 都是临时表~
不会对数据库服务器上的数据造成影响~