首先准备一张表:
---准备表
CREATE TABLE ExamResult(
id INT PRIMARY KEY auto_increment,
name VARCHAR (20),
JS DOUBLE ,
Django DOUBLE ,
OpenStack DOUBLE
);
INSERT INTO ExamResult VALUES (1,"yuan",98,98,98),
(2,"xialv",35,98,67),
(3,"alex",59,59,62),
(4,"wusir",88,89,82),
(5,"alvin",88,98,67),
(6,"yuan",86,100,55);
增加表数据
-- 插入一条数据
INSERT [into] tab_name (filed1,filed2...) VALUES (value1,value2..);
-- 插入多条数据
INSERT [into] tab_name VALUES (value1...),
(value1...),
(value1...);
-- set插入:通过键值对插入
INSERT [into] tab_name SET filed1=value1,filed2=value2...;
注解
filed(字段)和values(属性值)一一对应!
若省略filed,则values后面得属性值必须和表中字段一一对应得写全。
修改表记录
-- WHERE语句指定更新那些行,如果没有WHERE子句,则更新所有行。
UPDATE tab_name SET filed=value1 [WHERE 语句];
删除表记录
-- WHERE语句指定删除哪些记录,不指定则删除整张表数据
DELETE FROM tab_name [WHERE 语句];
注意:
DELETE语句只能删除表内容,不能删除表本身。
TRUNCATE TABLE tab_name;
TRUNCATE语句删除表中所有得数据,此语句先摧毁表,再建立一个新表。(此种方式删除得数据不能在事务中恢复)。
查询表记录(单表查询)
学习各种数据库,最最最最重要得来了。表数据得查询!
-- 普通得查询语句
-- 其中from指定从哪张表筛选,*表示查找所有列,也可以指定一个列
-- 表明确指定要查找的列,distinct用来剔除重复行。
SELECT [DISTINCT] *|filed1,filed2.... FROM tab_name
上面的是最普通的查询语句,在tab_name后面还可以跟:
1.WHERE语句(筛选,过滤,必须放在分组前使用)(最常用的)
2.GROUP BY(分组)
3.HAVING(筛选,过滤,一般放在分组之后使用,并且可以使用聚合函数)
4.ORDER BY (排序)
5.LIMIT (限制条数)
注:select查询的字段还可以通过关键字as赋予别名。
1.
使用where子句进行过滤查询:
-- 查询姓名为XXX的学生成绩
select * from ExamResult where name='yuan';
-- 查询英语成绩大于90分的同学
select id,name,JS from ExamResult where JS>90;
-- 查询总分大于200分的所有同学
select name,JS+Django+OpenStack as 总成绩 from ExamResult where JS+Django+OpenStack>200 ;
2.
Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的别名。
-- select *|field1,field2... from tab_name order by field [Asc|Desc]
-- Asc 升序、Desc 降序,其中asc为默认值 ORDER BY 子句应位于SELECT语句的结尾。
-- 对JS成绩排序后输出。
select * from ExamResult order by JS;
-- 对总分排序按从高到低的顺序输出
select name,(ifnull(JS,0)+ifnull(Django,0)+ifnull(Database,0)) as 总成绩 from ExamResult order by 总成绩 desc;
3.
group by 分组查询:
注意,按照分组条件分组后,每一组只会显示第一条记录。
group by字句,其后可以接多个列名,也可以跟having子句,对group by 的结果进行筛选。
创建购物表:
CREATE TABLE order_menu(
id INT PRIMARY KEY auto_increment,
product_name VARCHAR (20),
price FLOAT(6,2),
born_date DATE,
class VARCHAR (20)
);
INSERT INTO order_menu (product_name,price,born_date,class) VALUES
("苹果",20,20170612,"水果"),
("香蕉",80,20170602,"水果"),
("水壶",120,20170612,"电器"),
("被罩",70,20170612,"床上用品"),
("音响",420,20170612,"电器"),
("床单",55,20170612,"床上用品"),
("草莓",34,20170612,"水果");
-- 练习:对购物表按类名分组后显示每一组商品的价格总和
select class,SUM(price)from order_menu group by class;
-- 练习:对购物表按类名分组后显示每一组商品价格总和超过150的商品
select class,SUM(price)from order_menu group by class HAVING SUM(price)>150;
having 和 where两者都可以对查询结果进行进一步的过滤,差别有:
<1>where语句只能用在分组之前的筛选,having可以用在分组之后的筛选;
<2>使用where语句的地方都可以用having进行替换
<3>having中可以用聚合函数,where中就不行。
4.
limit用法:
SELECT * from ExamResult limit 1;
SELECT * from ExamResult limit 2,5;--跳过前两条显示接下来的五条纪录
SELECT * from ExamResult limit 2,2;
聚合函数
聚合函数: 先不要管聚合函数要干嘛,先把要求的内容查出来再包上聚合函数即可。-- (一般和分组查询配合使用)
– COUNT(列名):统计行的个数
-- 统计一个班级共有多少学生?先查出所有的学生,再用count包上
select count(*) from ExamResult;
– SUM(列名):统计满足条件的行的内容和
-- 统计一个班级JS总成绩?先查出所有的JS成绩,再用sum包上
-- 注意:sum仅对数值起作用,否则会报错。
select sum(JS) as JS总成绩 from ExamResult;
– AVG(列名):求平均值
-- 求班级最高分和最低分(数值范围在统计中特别有用)
select Max((ifnull(JS,0)+ifnull(Django,0)+ifnull(OpenStack,0)))
最高分 from ExamResult;
select Min((ifnull(JS,0)+ifnull(Django,0)+ifnull(OpenStack,0)))
最低分 from ExamResult;
重点:Select from where group by having order by
– Mysql在执行sql语句时的执行顺序:
– from where select group by having order by
– 分析:
select JS as JS成绩 from ExamResult where JS成绩 >70; ---- 不成功
select JS as JS成绩 from ExamResult having JS成绩 >90; --- 成功