有帮忙做网站的吗,flash网站 seo,wordpress写技术博客,宿迁公司做网站文章目录 一、数据库简介二、单表三、多表四、等值连接五、内联结六、inner join on、left join on、right join on区别七、模糊查找八、作业 一、数据库简介
数据在内存#xff1a;
优点#xff1a;读写速度快缺点#xff1a;程序结束后数据丢失
保存到文件
优点#… 文章目录 一、数据库简介二、单表三、多表四、等值连接五、内联结六、inner join on、left join on、right join on区别七、模糊查找八、作业 一、数据库简介
数据在内存
优点读写速度快缺点程序结束后数据丢失
保存到文件
优点数据可以永久保存缺点1、频繁的IO操作效率不高 2、数据的管理非常不方便需要把所有的数据整体都读取出来才能操作
数据库
数据永久保存数据管理非常方便
卸载
1、控制面板-程序和功能卸载MySql
2、C:\ProgramData删除MySql目录1、Sql不区分大小写
2、反引号写不写都行理论上自己写的都应该加上反引号二、单表
用SQL语句创建表
CREAT TABLE student(
id int primary key,
name char(10),
age int,
gender char(1)
)也可以直接在页面创建表
PRIMARY KEY 主键不能重复主键作用唯一确定一条记录 uniquenot null唯一非空
表中的任何列都可以作为主键只要它满足一下条件
1、任意两行都不具有相同的主键值
2、每一行都必须具有一个主键值主键列不允许空置NULL
3、主键列中的值不允许修改或更新
4、主键值不能重用如果某行从表中删除它的主键不能赋给以后的新行自己写容易重复写错可以加上
AUTO_INCREMENT 自动增长例如
id int primary key AUTO_INCREMENTvarchar(10) char(10)区别
相同点都可以最大放10个字符
不同点char(10)不管输入的是多少都会占10个字符例如输入名字“张三”只有两个字符
但是使用char(10)在数据库里面还是占10个字符的空间。
使用varchar(10)最大支持是10个字符但是实际长度就是输入字符长度例如输入名字“张三”只有两个字符
那么在varchar(10)里面就只占两个字符。Duplicate entry ‘1’ for key ‘PRIMARY’
select
数据库中以表为组织单位存储数据。
表类似我们的Java类每个字段对应类里面的属性。
那么用我们熟悉的java程序来与关系型数据对比就会发现以下对应关系。
1.类--------------------表
2.类中属性-------------表中字段列
3.对象------------------记录行一定要掌握的基本的增删改查创建表查询类最重要-- 列出所有的数据库
SHOW DATABASES;-- 创建数据库
CREATE DATABASE study DEFAULT CHARACTER SET utf8;-- 删除数据库
DROP DATABASE study;-- ----------------------------------
-- 数据库表的操作-- 切换数据库
USE study;-- 创建表
CREATE TABLE student(id INT,name CHAR(10),age INT,gender CHAR(1)
);-- 查看所有表
SHOW TABLES;-- 查看表的结构
DESC student; -- description-- 删除表
DROP TABLE student;-- 更改表的结构
-- 添加字段
ALTER TABLE student ADD COLUMN address CHAR(10);
-- 删除字段
ALTER TABLE student DROP COLUMN address;
-- 修改表的字段
ALTER TABLE student CHANGE address addr CHAR(20);
-- 修改表的名字
ALTER TABLE student RENAME TO stu;-- 创建表
CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10),age INT,gender CHAR(1)
);-- * 代表查询所有的列
SELECT * FROM student;-- 插入数据
-- Duplicate entry 1 for key PRIMARY
INSERT INTO student(id,name,age,gender) VALUES(1,wangwu,23,男);
INSERT INTO student(id,name,age,gender) VALUES(3,赵六,23,男);
INSERT INTO student VALUES(4,赵六22,33,男);
-- 插入部分字段值(必须把前面的字段名都写上)
INSERT INTO student(name,age,gender) VALUES(小张11,23,男);
-- 一次插入多条数据
INSERT INTO student(name,age,gender) VALUES(小张77,23,男),(小王,22,男);-- 修改数据
UPDATE student SET ageage1;
UPDATE student SET ageage1,namezhangsan WHERE id7;-- 删除数据
DELETE FROM student; -- 删除表中所有数据很少使用是非常危险
DELETE FROM student WHERE age24; -- 所有age是24的数据都被删除了可能有多条数据都是age24
DELETE FROM student WHERE id12; -- 因为id是主键是唯一的所以根据id删除只能删除唯一的一条数据
DELETE FROM student WHERE id1 OR id2;
DELETE FROM student WHERE id IN(1,2);
-- TRUNCATE删除表里面所有数据自增的id会重新初始化为初始值1
TRUNCATE TABLE student;-- 查询数据
-- 显示所有列(字段)数据
-- 学习时候可以写*但是在企业开发中需要什么字段就写什么字段检索不需要的列会降低检索速度和应用程序的性能
SELECT * FROM student;
SELECT id,name,age,gender FROM student;
-- 查询指定列
SELECT name,age FROM student;
-- 查询时候添加常量列通过as可以起别名
SELECT id,name,age AS 年龄,java2403 AS 班级 FROM student;
-- 查询时候合并列字段可以当成java里面的变量来运算
SELECT id,name,(phpjava) AS 总成绩 FROM student;
-- 查询时候去掉重复的记录
SELECT DISTINCT address FROM student;-- 计算字段列
-- 计算字段并不实际存在于数据库表中计算字段是运行时在SELECT语句内创建的。
-- 只有数据库知道SELECT语句中哪些列是实际的列表哪些列是计算字段。
-- 从客户端(如应用程序)来看计算字段的数据与其他列的数据的返回方式相同。-- 条件查询 where ,数据库表一般包含大量的数据很少需要检索表中所有行
SELECT * FROM student WHERE name小王;-- 逻辑条件: and同时成立 or(只要有一个成立)
SELECT * FROM student WHERE name小王 AND address青岛;
SELECT * FROM student WHERE name小王 OR address北京;-- 比较运算: ! 不等于也可以写成
SELECT * FROM student WHERE java70 AND java80;
-- between and (等价于 and )
SELECT * FROM student WHERE java BETWEEN 70 AND 80;
-- 查询地址不是青岛的学生信息
SELECT * FROM student WHERE address ! 青岛;-- 空值NULL无值(no value)它与字段包含0、空字符串或紧紧包含空格不同
SELECT * FROM student WHERE address IS NULL; -- IS NOT NULL-- 聚合查询
-- 聚合查询函数sum(),avg(),max(),min(),count()
-- 统计学生php的总成绩sum求和
SELECT SUM(php) AS php总成绩 FROM student;
-- 统计学生php的平均值
SELECT AVG(php) AS php平均值 FROM student;
-- 统计学生php的最大值
SELECT MAX(php) AS php最大值 FROM student;
-- 统计学生表里面一共有多少学生
SELECT COUNT(*) AS 总人数 FROM student;
SELECT COUNT(id) AS 总人数 FROM student;
SELECT COUNT(address) AS 总人数 FROM student;
-- 注意如果指定列明则COUNT会忽略指定列的值为NULL的行用*则不忽略。-- 查询排序 desc:descending asc:ascending
-- 语法order by 字段 asc/desc 默认是asc升序可以不写
SELECT * FROM student ORDER BY php;
SELECT * FROM student ORDER BY php ASC;
SELECT * FROM student ORDER BY php DESC;
-- 多个条件排序
-- 需求先按照php降序java升序(整体是按照php降序如果php相同的数据再按照java标准排序)
SELECT * FROM student ORDER BY php DESC, java ASC;
-- order by要放在sql语句的最后-- 分组查询(group by)
-- 需求查询男女分别有多少人
-- 性别 人数
-- 男 3
-- 女 2
SELECT gender AS 性别,COUNT(*) AS 人数
FROM student GROUP BY gender;
-- 分组之后的条件筛选用HAVING
SELECT gender AS 性别,COUNT(*) AS 人数
FROM student GROUP BY gender HAVING COUNT(*)1;整理出来数据以后可以复制如上类似的数据表到Excel里面生成饼状图柱状图等。 总结
1、如果分组中包含具有NULL值的行则NULL将作为一个分组返回。
2、GROUP BY字句必须出现在WHERE字句之后ORDER BY字句之前。
3、WHERE过滤行行级过滤而HAVING过滤分组组级过滤WHERE所有技术和选项都适用于HAVING语法使用一样。
分组之后的筛选使用HAVING字段属性设置:
1、not null 不为空表示该字段不能放“null”这个值。不写则默认是可以为空
2、auto_increment: 设定int类型字段的值可以“自增长”即其值无需“写入”而会自动获得并增加
此属性必须随同 primary key 或 unique key 一起使用。primary key unique key not null
3、[primary] key 设定为主键。是唯一键“加强”不能重复并且不能使用null并且可以作为确定任意一行数据的“关键值”最常见的类似where id 8; 或 where user_name ‘zhangsan’;
通常每个表都应该有个主键而且大多数表喜欢使用一个id并自增长类型作为主键。
但一个表只能设定一个主键。
4、unique [key] : 设定为唯一键表示该字段的所有行的值不可以重复唯一性。
Duplicate entry zhangsan for key name
5、default ‘默认值’ 设定一个字段在没有插入数据的时候自动使用的值。
6、comment ‘字段注释’CREATE TABLE teacher(id INT PRIMARY KEY AUTO_INCREMENT,name CHAR(10) NOT NULL,age INT COMMENT 年龄,address CHAR(10) DEFAULT 中国, -- 插入数据时候如果不赋值默认值是中国UNIQUE KEY(name) -- 唯一键代表这个字段不能重复
);-- Duplicate entry zhangsan for key name
INSERT INTO teacher(name) VALUES(zhangsan);三、多表
学生表、班级表、课程表、班级课程表
一对一、一对多、多对多 关系型数据库MySql、SqlServer、Oracle
相同的数据出现多次绝不是一件好事这是关系数据库设计的基础。关系表的设计就是要把信息分解成多个表一个数据一个表各表通过某些共同的值互相连接所以才叫关系数据库。
将数据存储到多个表能更有效的存储更方便的处理但这些好处是有代价的如果数据存储在多个表中怎么用一条SELECT语句就检索出数据呢答案是使用子查询、联结
非关系型数据库Redis MongoDB 速度非常快日志信息可以理解为一个大的Map结构
-- 多对多
-- 班级表
CREATE TABLE banji(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10) NOT NULL
);
INSERT INTO banji(name) VALUES(java1807),(java1812);SELECT * FROM banji;-- 学生表 reference:参考引用
CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10) NOT NULL,age INT,gender CHAR(1),banji_id INT,FOREIGN KEY(banji_id) REFERENCES banji(id)
);
INSERT INTO student(name,age,gender,banji_id)
VALUES(张三,20,男,1),(李四,21,男,2),(王五,20,女,1);
-- Cannot add or update a child row: a foreign key constraint fails (java1812.student, CONSTRAINT student_ibfk_1 FOREIGN KEY (banji_id) REFERENCES banji (id))
INSERT INTO student(name,age,gender,banji_id)
VALUES(张三,20,男,3);SELECT * FROM student;-- 课程表
CREATE TABLE course(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10) NOT NULL,credit INT COMMENT 学分
);
INSERT INTO course(name,credit) VALUES(Java,5),(UI,4),(H5,4);SELECT * FROM course;-- 班级课程表
CREATE TABLE banji_course(-- id int PRIMARY KEY AUTO_INCREMENT,banji_id INT,course_id INT,PRIMARY KEY(banji_id,course_id), -- 联合主键FOREIGN KEY(banji_id) REFERENCES banji(id), -- banji_id既是联合主键又是外键FOREIGN KEY(course_id) REFERENCES course(id) -- course_id既是联合主键又是外键
);
INSERT INTO banji_course(banji_id,course_id) VALUES(1,1),(1,3),(2,1),(2,2),(2,3);SELECT * FROM banji_course;
-- 子查询嵌套查询一个查询语句结果是另一个查询语句的条件
-- 查询班级是Java1812班所有学生信息
SELECT * FROM student WHERE banji_id2;
SELECT id FROM banji WHERE nameJava1812;
SELECT * FROM student WHERE banji_id(SELECT id FROM banji WHERE nameJava1812);-- 班级是Java1807班或者Java1812班所有学生信息
SELECT * FROM student WHERE banji_id1 OR banji_id2;
SELECT * FROM student WHERE banji_id IN(1,2);
SELECT id FROM banji WHERE nameJava1807 OR nameJava1812; -- 1,2
SELECT * FROM student WHERE banji_id IN(SELECT id FROM banji WHERE nameJava1807 OR nameJava1812);-- 计算字段使用子查询班级id 班级名字 班级人数
-- 执行这条查询遵循下面的步骤
-- 1、从banji表检索班级列表
-- 2、对检索出的每个banji统计其在student表中的数量
SELECT id,name,(SELECT COUNT(*) FROM student WHERE student.banji_idbanji.id) AS total_count
FROM banji
ORDER BY name; total_count是一个计算字段它是由括号中的子查询建立的该子查询对检索出的每个banji执行一次
总结
1、要求子查询只有一个结果。 in子查询可以有多个结果。
2、子查询的SELECT语句只能查询单个列企图检索多个列将返回错误。
3、能嵌套的子查询的数目没有限制不过在实际使用时由于性能的限制不能嵌套太多的子查询。
子查询也可以使用下面的联结来实现四、等值连接
从左表中取出每一条记录去右表中与所有的记录进行匹配匹配必须是某个条件在左表中与右表中相同最终才会保留结果否则不保留
笛卡尔积
由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将时第一个表中的行数乘以第二个表中的行数。通俗的说就是查询所得的结果行数是两张表行数的乘积。
返回笛卡尔积的联结也称为叉联结cross join。
等值连接: 注意联结查询非常消耗资源因此应该注意不要联结不必要的表。联结的表越多性能下降越厉害。
五、内联结
内连接有两种写法一种是inner join另一种是join这两种写法都是一样的可以理解为join是inner join的缩写。 等值连接和内连接的效果一样但是开发中建议使用内连接 – 学生姓名 班级名称 课程名称 学分 SELECT * FROM student s,banji b,banji_course bc,course c WHERE s.banji_idb.id AND b.idbc.banji_id AND bc.course_idc.id;
总结多表查询主要是注意下面两点1、整个查询涉及到几张表涉及到几张表就连接这几张表。2、如果涉及到这几张表的关系搞不清楚画一下ER图弄清楚表和表之间的关系就是根据外键建立的关系-- 班级id 班级名字 班级人数
SELECT b.id,b.name,COUNT(*)
FROM student AS s INNER JOIN banji AS b
ON s.banji_idb.id
GROUP BY b.id;六、inner join on、left join on、right join on区别
inner join on 只有左右两个表有关联的才查询出来
left join on 左表中都显示出来右表没有显示空
right join on 右表都显示左表没有显示空
左连接也成为左外连接从左表那里返回所有的行即使在右表中没有匹配的行
右连接也成为右外连接 SELECT *
FROM student as s LEFT JOIN banji as b
on s.banji_idb.id;七、模糊查找
语法形式字段 like ‘要查找字符’
说明
1、like模糊查找用于对字符类型的字段进行字符匹配查找。
2、要查找的字符中有两个特殊含义的字符% , _: 2.1: %含义是代表0或多个的任意字符 2.2: _含义是代表1个任意字符
3、语法like ‘%关键字%’
SELECT * FROM student WHERE name LIKE 张%; -- 以张开头
SELECT * FROM student WHERE name LIKE 张_; -- 以张开头而且名字是两个字
SELECT * FROM student WHERE name LIKE %张%; -- 名字里面只要有张就可以注意: NULL
通配符%看起来像是可以匹配任何东西但有个例外这就是NULL
SELECT * FROM student WHERE name LIKE ‘%’;
不会匹配name为NULL的行
注意
SQL的通配符很有用但这种功能是有代价的即通配符搜索要消耗更长的处理时间使用通配符的技巧
1、不要过度使用通配符。如果其他操作符能达到相同的目的应该使用其他操作符。
2、在确实需要使用通配符时也尽量不要把它们用在搜索模式的开始处 ‘%张’。把通配符置于开始处搜索起来是最慢的。
八、作业
create table goods (goods_id mediumint(8) unsigned primary key auto_increment,goods_name varchar(120) not null default ,cat_id smallint(5) unsigned not null default 0,brand_id smallint(5) unsigned not null default 0,goods_sn char(15) not null default ,goods_number smallint(5) unsigned not null default 0,shop_price decimal(10,2) unsigned not null default 0.00,market_price decimal(10,2) unsigned not null default 0.00,click_count int(10) unsigned not null default 0
);insert into goods values (1,kd876,4,8,ecs000000,1,1388.00,1665.60,9),
(4,诺基亚n85原装充电器,8,1,ecs000004,17,58.00,69.60,0),
(3,诺基亚原装5800耳机,8,1,ecs000002,24,68.00,81.60,3),
(5,索爱原装m2卡读卡器,11,7,ecs000005,8,20.00,24.00,3),
(6,胜创kingmax内存卡,11,0,ecs000006,15,42.00,50.40,0),
(7,诺基亚n85原装立体声耳机hs-82,8,1,ecs000007,20,100.00,120.00,0),
(8,飞利浦99v,3,4,ecs000008,1,399.00,478.79,10),
(9,诺基亚e66,3,1,ecs000009,4,2298.00,2757.60,20),
(10,索爱c702c,3,7,ecs000010,7,1328.00,1593.60,11),
(11,索爱c702c,3,7,ecs000011,1,1300.00,0.00,0),
(12,摩托罗拉a810,3,2,ecs000012,8,983.00,1179.60,13),
(13,诺基亚5320 xpressmusic,3,1,ecs000013,8,1311.00,1573.20,13),
(14,诺基亚5800xm,4,1,ecs000014,1,2625.00,3150.00,6),
(15,摩托罗拉a810,3,2,ecs000015,3,788.00,945.60,8),
(16,恒基伟业g101,2,11,ecs000016,0,823.33,988.00,3),
(17,夏新n7,3,5,ecs000017,1,2300.00,2760.00,2),
(18,夏新t5,4,5,ecs000018,1,2878.00,3453.60,0),
(19,三星sgh-f258,3,6,ecs000019,12,858.00,1029.60,7),
(20,三星bc01,3,6,ecs000020,12,280.00,336.00,14),
(21,金立 a30,3,10,ecs000021,40,2000.00,2400.00,4),
(22,多普达touch hd,3,3,ecs000022,1,5999.00,7198.80,16),
(23,诺基亚n96,5,1,ecs000023,8,3700.00,4440.00,17),
(24,p806,3,9,ecs000024,100,2000.00,2400.00,35),
(25,小灵通/固话50元充值卡,13,0,ecs000025,2,48.00,57.59,0),
(26,小灵通/固话20元充值卡,13,0,ecs000026,2,19.00,22.80,0),
(27,联通100元充值卡,15,0,ecs000027,2,95.00,100.00,0),
(28,联通50元充值卡,15,0,ecs000028,0,45.00,50.00,0),
(29,移动100元充值卡,14,0,ecs000029,0,90.00,0.00,0),
(30,移动20元充值卡,14,0,ecs000030,9,18.00,21.00,1),
(31,摩托罗拉e8 ,3,2,ecs000031,1,1337.00,1604.39,5),
(32,诺基亚n85,3,1,ecs000032,4,3010.00,3612.00,9);-- 分类表
create table category (cat_id smallint unsigned auto_increment primary key,cat_name varchar(90) not null default ,parent_id smallint unsigned
);INSERT INTO category VALUES
(1,手机类型,0),
(2,CDMA手机,1),
(3,GSM手机,1),
(4,3G手机,1),
(5,双模手机,1),
(6,手机配件,0),
(7,充电器,6),
(8,耳机,6),
(9,电池,6),
(11,读卡器和内存卡,6),
(12,充值卡,0),
(13,小灵通/固话充值卡,12),
(14,移动手机充值卡,12),
(15,联通手机充值卡,12);NOT可以否定IN、BETWEEN、EXISTS
-- 1:主键为32的商品
SELECT * FROM goods WHERE goods_id32;
-- 2:不属第3栏目的所有商品category中id为3
SELECT * FROM goods WHERE cat_id!3;
-- 3:本店价格高于3000元的商品
SELECT * FROM goods WHERE market_price3000;
-- 4:本店价格低于或等于100元的商品
SELECT * FROM goods WHERE market_price100;
-- 5:取出第4栏目或第11栏目的商品
SELECT * FROM goods WHERE cat_id4 OR cat_id11;
SELECT * FROM goods WHERE cat_id IN(4,11);
-- 6:取出100价格500的商品
SELECT * FROM goods WHERE market_price100 AND market_price500;
-- BETWEEN AND是能取到开始和结束的值等价于 and
SELECT * FROM goods WHERE market_price BETWEEN 100 AND 500;
-- 7:取出不属于第3栏目且不属于第11栏目的商品(and,或not in分别实现)
SELECT * FROM goods WHERE cat_id!4 AND cat_id!11;
SELECT * FROM goods WHERE cat_id NOT IN(4,11);
-- IS NULL、IS NOT NULL LIKE、NOT LIKE IN、NOT IN
-- 8:取出价格大于100且小于300,或者大于4000且小于5000的商品()
-- 要适当的加括号(括号的优先级比AND和OR优先级高)不加括号数据也正确只是巧合因为AND优先级要高于OR优先级写出有歧义的语句并不能显出你多厉害
-- 任何时候使用AND和OR操作符时候都应该加括号明确的分组操作符不要过分依赖默认求值顺序及时它确实如你希望的那样。使用括号没有什么坏处它能消除歧义。
-- select * from goods where () OR ();
SELECT * FROM goods WHERE (market_price100 AND market_price300) OR (market_price4000 AND market_price5000);-- 9:取出第3个栏目下面价格1000或3000,并且点击量5的系列商品
SELECT * FROM goods WHERE cat_id3 AND (market_price1000 OR market_price3000) AND click_count5;-- 10:取出第1个栏目下面的商品(注意:1栏目下面没商品,但其子栏目下有)
SELECT * FROM goods WHERE cat_id IN(SELECT cat_id FROM category WHERE parent_id1);-- 11:取出名字以诺基亚开头的商品
-- like 模糊匹配
-- % 通配任意字符
-- _ 通配单一字符
SELECT * FROM goods WHERE goods_name LIKE 诺基亚%;-- 12:取出名字为诺基亚nxx的手机
SELECT * FROM goods WHERE goods_name LIKE 诺基亚n__;
-- 13:取出名字不以诺基亚开头的商品
SELECT * FROM goods WHERE goods_name NOT LIKE 诺基亚%;
-- 14:取出第3个栏目下面价格在1000或者3000,并且点击量5 诺基亚开头的系列商品
SELECT * FROM goods WHERE cat_id3 AND (market_price1000 OR market_price3000) AND click_count5
AND goods_name LIKE 诺基亚%;-- 15:把goods表中商品名为诺基亚xxxx的商品,改为HTCxxxx,
-- 提示:大胆的把列看成变量,参与运算,甚至调用函数来处理 .
-- substr(),concat(),trim(),ltrim(),rtrim()
SELECT goods_id,goods_name FROM goods WHERE goods_name LIKE 诺基亚%;
SELECT goods_id,CONCAT(HTC, SUBSTR(goods_name, 4)) FROM goods WHERE goods_name LIKE 诺基亚%;public static void main(String[] args) {String goodsName 诺基亚n85原装充电器;String name HTC goodsName.substring(3);System.out.println(name);
}-- 15:计算指定分类(cat_id3)下面商品的平均价格
SELECT AVG(market_price) FROM goods WHERE cat_id3;-- 16:组合聚集函数SELECT可以根据需要包含多个聚集函数
-- goods_count price_min price_max price_avg
SELECTCOUNT(*) AS gooda_count,MIN( market_price ) AS price_min,MAX(market_price) AS price_max,AVG(market_price) AS price_avg
FROM
goods;-- order by 与 limit
-- 1、按照栏目由低到高排序栏目相同按照价格由高到低排序
SELECT * FROM goods ORDER BY cat_id ASC,market_price DESC;-- 2、取出价格最高的前三名商品
-- LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。
-- LIMIT 接受一个或两个数字参数参数必须是一个整数常量。
SELECT * FROM goods ORDER BY market_price DESC LIMIT 0,3;
-- 初始记录行的偏移量是 0(而不是 1)
-- limit offset,rowcount
-- limit 偏移到那个位置offset往下数多少个rowcount-- 3、取出点击量第三名到第五名的商品
SELECT * FROM goods ORDER BY click_count DESC LIMIT 2,3;group by having:
1、这个店积压的货款
int goods_num 17;
double shop_price 58.0;
System.out.println(goods_num * shop_price);
SELECT goods_name,goods_number*shop_price FROM goods;SELECT SUM(goods_number*shop_price) FROM goods;
– 2、查询该店每个栏目下挤压的货款 SELECT goods_name,cat_id,goods_numbershop_price FROM goods; SELECT cat_id,SUM(goods_numbershop_price) AS total_price FROM goods GROUP BY cat_id;
– 3、查询该店每个栏目下挤压的货款 100 SELECT cat_id,SUM(goods_number*shop_price) AS total_price FROM goods GROUP BY cat_id HAVING total_price100;
备注我们经常发现用 GROUP BY 分组的数据确实是以分组顺序输出的。
但并不总是这样这不是 SQL 规范所要求的。
此外即使特定的 DBMS 总是按给出的 GROUP BY 子句排序数据用户也可能会要求以不同的顺序排序。
应该提供明确的 ORDER BY 子句即使其效果等同于 GROUP BY 子句。SELECT cat_id,SUM(goods_number*shop_price) AS total_price
FROM goods GROUP BY cat_id HAVING total_price100
ORDER BY total_price,cat_id;