新增数据(create)
insert into table_name values (value1),(value2)...;
insert into
: 关键字table_name
:需要插入的表的名字values
: 后面跟所需要插入不同数量的数据,每一个括号就代表的时插入表的一行数据,其中的数据需要对应表的数据类型
查询数据(Retrieve)
全列查询
select * from table_name;
select
:查询的关键字*
:通识符,表示当前表的所有的列from
:表示从什么表查询
查询结果是一个二维表,包含了列名和每一行的数据
同时select也可以不带from
这种用法常用于判断当前数据库是否链接有效
select 1;
投影查询(指定列查询)
在某系情况下,我们不需要将所有的列显示,只需要指定的列展示就ky,此时就可以指定列名,来选择显示
我们创建一个学生表,包含(id,name,score);
select id,name from student;
而且我们还可以给没一列起一个别名,这样结果集的列名就与原表名不同。
select id,name as studnetName from student;
当一这个此sql语句运行后,name将变成studentName
其中as可以省略。
条件查询
我们很多时候并不希望查询所有的数据,而是希望查询一些满足特定条件的数据,例如,查询分数在80及以上的学生数据。当获取几百万的数据记录,十分耗时,而查询满足条件的数据量将会降低很多。
select * from student where score>=80;
where
条件来设定查询条件,查询结果都是满足查询条件的。
条件表达式可以用<条件1> AND <条件2>
表达满足条件1并且满足条件2
例如我们要查询分数大于80的,且还叫“王二”的同学
- 条件一:
score>=80
; - 条件二:
name=“王二”
;
select * from student where score>=80 and name="王二";
第二种条件是<条件1> OR <条件2>
,表示满足条件1或者满足条件2。
例如我们要查询大于等于80分或者叫“王二”的同学
select * from student where score>=80 or name="王二";
第三种条件是NOT <条件>
,表示“不符合该条件”的记录。
例如我们查询不是“王二”的同学
select * from student where not name="王二";
如果不加括号,条件运算按照NOT、AND、OR
的优先级进行,即NOT
优先级最高,其次是AND
,最后是OR
。加上括号可以改变优先级。
范围查询
1.BETWEEN … AND …
查询语文成绩在 [80, 90] 分的同学及成绩
select name, score from student where score between 80 and 90;
使用 AND 也可以实现
select name, score from student where score >=80 and score<= 90;
2.IN
查询成绩在59或者60的同学以及成绩
select name ,score from student where score in (59,60);
也可以用or来实现
select name ,score from studnet where score=59 or score=60;
3.模糊查询:like
-- % 匹配任意多个(包括 0 个)字符
select name from studnt where name like '孙%';-- 匹配到孙悟空、孙权
-- _ 匹配严格的一个任意字符
select name from studnt where name like LIKE '孙_';-- 匹配到孙权
去重查询
当不需要重复的数据时,可以用以下关键字进行去重操作
select distinct name from student;
关键字distinct
将可以对某列进行去重。
排序
如果不进行排序操作,那么当查询结果出来时,数据时按照插入顺序显示,当需要某一列有顺序时,需要在查询的时候进行对某列排序。
例如,现在将找出学生中分数最低的同学。
select * from student order by score;
order by
就是进行排序的关键词,默认情况是升序,但是也可以在order by
后加上desc
,让其变成降序。
也可以对多个列进行排序,排序优先级随书写顺序
如果有WHERE
子句,那么ORDER BY
子句要放到WHERE
子句后面。这样,结果集仅包含符合WHERE
条件的记录,并按照ORDER BY
的设定排序。
分页查询
如果数据量十分巨大,那么查询出来的数据放在一个页面上的话数量十分大,不方便越大;
此时将其分页显示的话就会十分合适。而分页功能,就是是将数据分成指定条数作为一页。
我们将结果分页,每页10条数据。
select * from student order by score limit 10 offset 0;
limit 10 offset 0
表示,对结果从第0条数据开始,最多取10条(可能数据量小于设定的分页数量)。
当想跳过第一页时,我们只需limit 10 offset 10
就可以查询到第二页。
聚合查询
聚合函数
聚和函数就是sql在面对一些简单的数学计算,如:求平均、总数等,而专门提供的函数。
函数 | 结果 |
---|---|
COUNT([DISTINCT] expr) | 返回查询到的数据的 数量 |
SUM([DISTINCT] expr) | 返回查询到的数据的 总和,不是数字没有意义 |
AVG([DISTINCT] expr) | 返回查询到的数据的 平均值,不是数字没有意义 |
MAX([DISTINCT] expr) | 返回查询到的数据的 最大值,不是数字没有意义 |
MIN([DISTINCT] expr) | 返回查询到的数据的 最小值,不是数字没有意义 |
要特别注意:如果聚合查询的WHERE
条件没有匹配到任何行,COUNT()
会返回0,而SUM()
、AVG()
、MAX()
和MIN()
会返回NULL
:
分组
SELECT 中使用 GROUP BY
子句可以对指定列进行分组查询。需要满足:使用 GROUP BY
进行分组查
询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函
数中。
select column1, sum(column2), .. from table group by column1,column3;
案例:
-
准备测试表及数据:职员表,有id(主键)、name(姓名)、role(角色)、salary(薪水)
-
查询每个角色的最高工资、最低工资和平均工资
- create table emp( - id int primary key auto_increment, - name varchar(20) not null, - role varchar(20) not null, - salary numeric(11,2) - ); - insert into emp(name, role, salary) values - ('马云','服务员', 1000.20), - ('马化腾','游戏陪玩', 2000.99), - ('孙悟空','游戏角色', 999.11), - ('猪无能','游戏角色', 333.5), - ('沙和尚','游戏角色', 700.33), - ('隔壁老王','董事长', 12000.66);
-
查询每个角色的最高工资、最低工资和平均工资
select role,max(salary),min(salary),avg(salary) from emp group by role;
Having
GROUP BY
子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE
语句,而需要用
HAVING
-
显示平均工资低于1500的角色和它的平均工资
select role,max(salary),min(salary),avg(salary) from emp group by role having avg(salary)<1500;
联合查询(多表查询)
在实际开发中,往往需要处理来自不同表的数据,所以需要进行联合查询。联合查询就是对多张表的笛卡儿积;
查询多张表的语法是:SELECT * FROM <表1> <表2>
。
select * from aaa,bbb;
!
使用笛卡尔查询时要非常小心,由于结果集是目标表的行数乘积,假如表一有m行,表二有n行,那么它们的笛卡尔查询将返回n*m行,当n和m较大时,返回的数据量将十分大。
连接查询
连接查询是另一种类型的多表查询。连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。
内连接
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
外连接
外连接分为左外连接和右外连接。
如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。
-- 左外连接,表1完全显示
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;
外连接的特点是当我们选择了完全显示一侧后,即使另一侧没有对应数据,需要完全显示的一侧也会显示,没有的数据则用null来填充。
修改和删除(Update and Delete)
修改
当需要在数据库表的数据进行修改是,可以使用关键词update
来将对应数据修改;
update <表名> set 字段1=值1,字段2=值2 ... where ...
--将一班,姓名为张三的同学,分数改为90;
update students set score=90 where name='张三' and classid=1;
删除
delete from 表名 where ....;
--删除一班,姓名为张三的同学;
delete from student where name='张三' and classid=1;
总结
以上就是mysql中简单的crud,希望我的文章能够给你带来帮助。