在没有子查询情况下,各个关键字的顺序,即分组排序同时出现会先分组再排序

SELECT [distinct] 列名 FROM 表1 join 表2 on 表1.Key=表2.Key 
where 条件1 group by 列名 having 条件2 order by 列名 limit 参数;


数据查询语言 一

  • 练习的数据
  • 1. 简单查询
  • 语法规则:
  • 代码演示:
  • 补充知识点:
  • 2. 条件查询
  • 语法规则:
  • 查询条件:
  • ① 逻辑符号
  • ② 比较符号
  • 范围查询:
  • 查询范围之内的记录
  • 查询范围之外的记录
  • 判空条件:
  • 3. 模糊查询
  • 语法规则:
  • 代码演示:


查询的用法较多,需要重点掌握!!!

sql server 查询所有并根据条件去重_语法规则

练习的数据

  直接在WorkBench的数据库中,将下列语句复制过去运行即可添加完成

-- 创建goods表
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' ) 
engine=myisam default charset='utf8';
// 添加数据
insert into `goods` values (1,'kd876',4,8,'ecs000000',1,1388.00,1665.60,9), 
(3,'诺基亚原装5800耳机',8,1,'ecs000002',24,68.00,81.60,3),
(4,'诺基亚n85原装充电器',8,1,'ecs000004',17,58.00,69.60,0),
(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,'飞利浦9@9v',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);

1. 简单查询

  作用:将数据库中所有记录查询出来

语法规则:

-- 从表名为A的表将所有记录的所有列都取出
SELECT * FROM A 
-- 从表名为A的列表中将所有记录中列名为col1,列名为col2,……的数据取出
SELECT col1,col2,…… FROM A

代码演示:

SELECT * FROM goods;

  上面代码的运行结果如下图所示,可以看到这条语句将goods所有记录的所有列都查询出来了,并且顺序是表定义的顺序。但是有时候我们可能只需要其中几个列即可,这时就需要将*换成我们需要的列名即可。

sql server 查询所有并根据条件去重_SQL_02

SELECT goods_id,goods_name,cat_id,goods_sn FROM goods;

  可以看到这段代码只将goods_id,goods_name,cat_id,goods_sn这4个列取出来

sql server 查询所有并根据条件去重_数据_03

补充知识点:

  1. 别名。起别名的方法:表/字段 AS 别名,其中AS可省略,其中别名用不用单引号括起来都可以。在多表查询的select语句中经常给表起别名。

SELECT goods_id AS 货物id, goods_name '货名' ,goods_sn sn FROM goods;

  可以看到查询出来的数据的字段名变成我们起的别名了

sql server 查询所有并根据条件去重_SQL_04


  2. 在1中提到了多表查询,在多表查询时,使用列名的时候必须用表名.列名,不能像现在单表查询这样省略表名,直接使用列名。

  3.自定义列。希望额外指定一列的时候需需要用到自定义列的用法。可以通过对表中其他列的一些操作得到。

SELECT goods_id,goods_name, 'abc' 自定义列 FROM goods;

sql server 查询所有并根据条件去重_数据_05


  可以用于对某几个列进行运算。比如,对market_price大于shop_price的记录,添加个差值的列,这里用到了马上要讲的条件查询,其实也不难,就是where这个关键字在select中的应用,和在修改update和删除delete中一样都是表示筛选条件。

  下面的SQL查询语句表示从goods表中查询market_price比shop_price大的记录的goods_id,goods_name以及自定义了一个差值列,差值列的值是market_price - shop_price

SELECT goods_id, goods_name, (market_price - shop_price) 差值 
FROM goods WHERE market_price>shop_price;

sql server 查询所有并根据条件去重_SQL_06


  4.DISTINCT。distinct的作用可以简单理解为去重,这个关键字在使用的时候要求特别多,比较难用好,现在只需要记住一种简单的使用方式即可——对某一个列进行去重。在日常开发中,除了想要知道某个列有那些值的时候可以用这个,其他情况下最好不要用DISTINCT

SELECT DISTINCT cat_id FROM goods;

sql server 查询所有并根据条件去重_语法规则_07

2. 条件查询

  将数据库中符合where后面查询条件的记录查询出来。
  select语句最难的地方就在条件查询这里,本身难度不大,但是它可以和后面的一些查询嵌套起来,理解起来会有些难度。

语法规则:

SELECT col1,col2,…… FROM A WHERE 条件
  • 条件查询的过程:把A表中每一条记录逐条与查询条件匹配,如果匹配结果为真,将这条记录指定列查询出来

PS:每一条记录都会和查询条件进行匹配。

查询条件:

  where后面的查询条件中可以使用逻辑符号、比较符号

① 逻辑符号

  AND(同时成立)——Java中的 &&;OR(只要一个成立)——Java中的 ||

-- 查询goods表中cat_id为3并且brand_id为6的记录的所有列
SELECT * FROM goods WHERE cat_id=3 AND brand_id=6;
-- 查询goods表中cat_id为3或者brand_id为6的记录的所有列
SELECT * FROM goods WHERE cat_id=3 OR brand_id=6;

  MySQL中带有逻辑符号的查询语句,在和查询条件匹配的过程中,是从左往右进行的,拿SELECT * FROM goods WHERE cat_id=3 AND brand_id=6;这条语句来说明,先将goods表中所有记录和cat_id=3这个条件匹配,然后从匹配后的结果集中进行后一个查询条件的匹配。
  了解了匹配顺序,我们就可以将能大批量筛选记录的条件放到前面,来提高查询效率了。这属于SQL优化部分的知识,Java开发了解即可。详细请看这里PS:不同的数据库执行的顺序可能不同,MySQL从左往右,Oracle从右往左。

② 比较符号

比较符合

作用

=

等于

>

大于

<

小于

>=

大于等于

<=

小于等于

<>或者!=

不等于

  配合逻辑符号可以查询在某个范围的记录

范围查询:

查询范围之内的记录

-- 查询goods表中shop_price在[1000,2000]之内的记录
SELECT * FROM goods WHERE shop_price>=1000 AND shop_price<=2000;
-- 查询范围之内记录的另一种写法 between……and……
SELECT * FROM goods WHERE shop_price BETWEEN 1000 AND 2000;

PS:第一种写法是两个条件,可以包含边界,也可以不包含(具体有无边界需要看有没有等号);第二种写法是一个条件,并且一定包含边界。

查询范围之外的记录

-- 查询goods表中shop_price在小于等于100或者大于4000的记录(-∞,100]∪(4000,+∞)
SELECT * FROM goods WHERE shop_price<=100 OR shop_price>4000;
-- 查询goods表中小于100或者大于4000的记录(-∞,100)∪(4000,+∞)
SELECT * FROM goods WHERE shop_price NOT BETWEEN 100 AND 4000;

PS:可以看到第一种方法可以自由控制有无边界,而第二种方法只能是不包含边界的

判空条件:

  和Java相似的是,SQL中也有NULL字串和空字串,判断NULL字串的语句是IS NULL或者IS NOT NULL,判断空字符串的语句是=或者!=或者<>

-- 从goods表中查询goods_name为空的字串
SELECT * FROM  goods WHERE goods_name = ''
-- 从goods表中查询goods_name为NULL的字串
SELECT * FROM  goods WHERE goods_name IS NULL;

PS:判断NULL用的是IS,判断空字符串用的是=

3. 模糊查询

  使用单纯的条件查询只能查询某个字段值为某个字符串时的情况,比如name=‘柚咖’,而有时我们希望查找某个字段中包含某些字符,比如姓李的人(以李开头的字符串),这时需要用到模糊查询。
 &emsp作用:;模糊查询用于对字符类型的字段进行字符匹配查找。需要使用关键字like和常用的通配符%、_

通配符

作用

%

代表任意个的任意字符

_

只代表一个任意字符

PS:这里的字符都是现实中可见的一个符号,而不是字节

语法规则:

SELECT 列名列表 FROM 表名 WHERE 列名A LIKE '%需要匹配的字符%';

  通配符位置不同匹配规则有区别

通配符位置

匹配规则

例子

%需要匹配的字符

以需要匹配的字符结尾

http%,检索以http开头的数据

需要匹配的字符%

以需要匹配的字符开头

%com,检索以com结尾的数据

%需要匹配的字符%

任何位置包含需要匹配的字符

%柚咖%,包含柚咖的数据(任意位置都可)

代码演示:

-- 从goods表中查询goods_name以'诺基亚'开头的记录
SELECT * FROM goods WHERE goods_name LIKE '诺基亚%';
-- 从goods表中查询goods_name以'充值卡'结尾的记录
SELECT * FROM goods WHERE goods_name LIKE '%充值卡';
-- 从goods表中查询goods_name中包含'原装'的记录
SELECT * FROM goods WHERE goods_name LIKE '%原装%';
-- 不使用通配符的like和=相同
SELECT * FROM goods WHERE goods_name LIKE '诺基亚';
SELECT * FROM goods WHERE goods_name = '诺基亚';

PS:如果要查询的字符中包含’%‘和’_'需要用\转义