当前位置: 凤凰彩票官方app > MySQL数据库 > 正文

mysql基础整理,MySQL自学笔记_联结

时间:2019-11-21 01:18来源:MySQL数据库
4. 联结多个表 在一条SQL语句中可以联结任意多张表。但是要注意:联结表非常消耗数据库系统资源,所以一定要注意控制联结的使用。 一个例子: select prod_name, vend_name, prod_price, qua

4. 联结多个表

在一条SQL语句中可以联结任意多张表。但是要注意:联结表非常消耗数据库系统资源,所以一定要注意控制联结的使用。

一个例子:

select prod_name, vend_name, prod_price, quantity
from products, vendors, orderitems
where products.prod_id = orderitems.prod_id
and vendors.vend_id=products.vend_id
and orderitems = 20005;

 

                                                              from orderitems

5. 联结的类型

1). 内联结和外联结

内联结:查找出的行是通过两个表的相等测试的数据。inner join on

外联结:在联结是指定一个表,并反回其中所有行,无论是否通过相等测试。外联结包括左联结右联结。left/right outer join on

一个例子:检索系统中所有下了订单的客户id和订单数量

内联结:

select customers.cust_id, orders.order_num
from customers inner join orders
  on customers.cust_id= orders.cust_id;

只有下了订单的客户信息会被检索到。

外联结:

select customers.cust_id, orders.order_num
from customers left outer join orders
  on customers.cust_id= orders.cust_id;

left outer join左边的customers表中所有的行都会被检索到。不论客户是否下单。

左联结和右联结的区别:

左联结关键字的左边的表会被检索出所有行,右联结关键字右边的表会被检索出所有行。所以左联结和右联结可以轻易转换,在实现功能上没有区别。

2).自联结

在一些特定情况下,需要让一张表自己和自己做联结,就需要用到自联结。例如需要查出生产了产品ID为DTNTR的供应商的所有产品。

使用子查询:

select prod_id, prod_name
from products
where vend_id in (select vend_id
                          from products
                          where prod_id="DTNTR");

使用自联结:

select p1.prod_id, p2.prod_name
from products as p1 inner join products as p2
on p1.vend_id=p2.vend_id
and p2.prod_id="DTNTR";

3).自然联结

所有查找出的列都是唯一的,不会有一个行被输出两次。自然联结需要通过人工手动实现,没有公式或关键字能制定自然联结。

六、使用不同类型的联结:

{n,}表示不少于指定数目的匹配

3. 两种联结方法

除了上面的在where字句中创建联结,还可以使用关键字join ... on...

例如上面的语句还可写成:

select vend_name, prod_name, prod_price #select fields
from vendors inner join products  #from tables
on vendors.vend_id=products.vend_id #how to join tables;

此处注意,在指定联结字段时,需要使用完全限定列名,既table.column的格式。

笛卡儿积:当没有制定联结字段时会出现笛卡儿积。既,被联结的两个表中任意一行都和另一个表中所有行联结。

  1、对每个客户下了多少订单进行计数,包括那些至今尚未下订单的客户。

目的:为了进行更强的过滤控制,mysql允许给出多个where自居,以逻辑操作符and或者or的方式使用。

2. 表的联结

 由于以上原因,在调出多个表中信息时,就需要将多个表通过主键和外键联结。

 联结的基本方法:1. 指出需要联结的表;2. 指出通过哪个字段联结。

 例子:

需要供应商和所提供产品信息:

select vend_name, prod_name, prod_price #select fields
from vendors, products  #from tables
where vendors.vend_id=products.vend_id #how to join tables;

  select cust_name,cust_contact from customers as c,orders as o,orderitems as oi where c.cust_id = o.cust=id and oi.order_num=o.cust_id and oi.order_num=o.order_num and prod_id ='TNT2';

(八)数据处理函数

1.  背景及原因

关系型数据库的一个基本原则是将不同细分数据放在单独的表中存储。这样做的好处是:

1).避免重复数据的出现

2).方便数据更新

3).避免创建重复数据时出错

例子:

有供应商信息和产品信息两部分。如果将他们放在一个表中。弊端有:

1). 同一供应商的所有数据所在行的供应商信息相同,即产生重复数据。

2). 在供应商信息变更时,如果更换联系方式或地址,需要在所有包含此供应商信息的行更新。

3). 在录入同一供应商的多个产品时,有可能会供应商信息不同,导致调取数据时无法使用。

通过将供应商和产品信息分别放在不同的表中,可以避免以上弊端。

1). 一个供应商只需一条记录,省时省空间。

2). 变更供应商信息时,只需变更一次。方便快捷不易出错。

3). 录入信息时,不会出错。

DB中存在如下几张表:

orders:

order_num, order_date, cust_id

venders:

vend_id, vend_name, vend_address, vend_contact

products:

prod_id, prod_name, vend_id, prod_price

customers:

cust_id, cust_name, cust_address, cust_city, cust_state

orderitems:

order_num, order_item, prod_id, quantity, item_price

  不仅仅可以对列起别名,也可以对表起别名。

涉及的表:orderitems、orders、customers

6. 有聚合函数的联结

联结可以和聚合函数一起使用。例如,需要检索出所有客户的订单数:

内连接:

select customers.cust_id, customers.cust_name,
count(orders.order_num) as num_ord
from customers inner join orders
on customers.cust_id inner join orders.cust_id
group by customers.cust_name;

检索出所有已下单客户的订单数。

外联结:

select customers.cust_id, customers.cust_name,
count(orders.order_num) as num_ord
from customers left outer join orders
on customers.cust_id inner join orders.cust_id
group by customers.cust_name;

检索出所有客户的订单数,包括没有订单数为0的客户。

 

2、like与regexp的区别

  2、外键(foreign key):外键为某个表中的一列,它包含另一个表中的主键值,定义了两个表之间的关系。

--为什么需要计算字段?

  联结是一种机制,用来在一条select语句中关联表,因此称为联结。使用特殊的语法,可以联结多个表返回一组输出。

(3)curdate():返回当前日期

  我们在前面使用了内部联结和等值联结,其实还有更复杂的联结

注意:

  2、列出所有产品以及订购数目,包括没有人订购的产品

那么为什么使用in操作符呢,优点是什么呢?

  也可以使用别名:  

select prod_name

  外链接不包含在相关表中没有关联行的行,这种类型的联结称为外部联结,例如:

select prod_name

  联结是利用SQL的select能执行的最重要的操作。

解释:[:digit:]匹配任意数字,{4}确切的要求它前面的数字出现4次,所有正则表达式匹配连在一起的任意4位数字。

  

      显示每列的信息,后面用的比较多的是 desc customers;

  inner join on性能比where好。

            where orders.cust_id = customers.cust_id) as orders

  聚集函数也可以与联结一起使用。

意义:之前的正则表达式师徒匹配单词出现。但是有的时候需要对匹配书目进行更强的控制

  我们在之前使用的子查询其实也可以使用联结语句。如下:

4、not操作符:

  3、计算平均销售规模,包括那些至今尚未下订单的客户。

外键为某个表的一列,它包含另一个表的主键值。

  1、自联结:假如你发现某物品(ID为DTNTR)存在问题,因此想知道该物品的供应商生产的其他物品是否也存在这些问题,因此,你需要先查到生产ID为DTNTR的物品供应商,然后找出这个供应商生产的其他物品。自连接的速度非常好:

表示:下划线只匹配单个字符而不是多个字符

 

select cust_id, count(※)  as orders

    由于相同数据出现多次违背了范式设计原则,因此在这个例子中,可以建立两个表,一个存储供应商信息vendors,另一个存储产品信息products。产品信息表中除了存储供应商ID外不存储其他供应商信息。因此vendors表的主键又叫做products的外键。他将vendors与products关联。

如何使用:为了在搜索子句中使用通配符,必须使用like操作符。

三、内部联结

select prod_name

  为了匹配两个列以vender.vend_id和products.vend_id指定,需要使用完全限定名,防止引起歧义。

如果是 select prod_name from products limit 5,5;则表示从行5开始,检索5行.

  select vend_name,prod_name,prod_price from vendors,products where vendos.vend_id=products.vend_id order by vend_name,prod_name;

2.组合where子句

  select p1.prod_id,p1.prod_name from products as  p1, products as  p2 where p1.vend_id=p2.vend_id and p2.prod_id='DTNTR';

扩展:

  外部联结,把没下订单的客户也查出来了。

select prod_id,prod_price,prod_name

  inner join on:

from products

  七、使用带聚集函数的联结

(12)second():返回一个时间的秒部分

  select customers.cust_id,orders.order_num form customers right outer join orders on (orders.cust_id=customers.cust_id);

扩展:删除右侧的所有空格,可以用rtrim()函数,如果是删除左侧的所有空格,可用ltrim(),去掉两边的空格是trim(),在拼接字段有时候会用到。例如:

  如果要检索所有客户及每个客户所下的订单数:

(九)汇总数据

一、联结

(1)我们需要直接从数据库中检索出转换、计算或者格式化过的数据,而不是检索出数据,然后再在客户机应用程序或者报告程序中重新格式化。

  select customers.cust_name,customers.cust_id,count(orders.order_num) as num_ord from customers left outer orders on customers.cust_id = orders.cust_id group by customers.cust_id ;

where soundex(cust_contact) = soundex('Y Lie');

而子查询中可以这样写:select cust_name,cust_contact form customers where cust_id in (select cust_id from orders where order_num in(select order_num from orderitems where prod_id='TNT2'))

(2)avg()函数忽略列值为NULL的行

  

如果按照多个列进行排序的话,只要列出列名,列名之间用逗号分隔。例如下面的例子,首先按照价格排序,再按照商品名字排序。

  select vend_name,prod_name,prod_price from vendors inner join products on vendors.vend_id = products.vend_id;

(三)匹配几个字符之一

  聚集函数也可以分方便的与其他联结一起使用。

select

 

9、组合聚集函数,看到这个例子就会秒懂~

  等值联结:它基于两个表之间的相等测试。可以使用:

(4)min:返回某列的最小值

二、创建联结

数据类型:每个列都有相应的数据类型

  许多连接将一个表中的行与另一个表中的行向关联,但有时候会需要包含没有关联行的那些行。

select prod_name

  以上语句我们使用了左外连接,目的是也关联左表并没有被查询关联数据。当然我们也可以使用右连接。

解释:其中expanded_price是一个计算字段,计算为quantity*item_price。在执行算数计算的时候,加减乘除都可以甲酸,并且用圆括号来确定计算顺序。

  以上语句以inner join指定,在使用这种语法时,联结条件用特定的on子句而不是where子句给出。传递给on实际条件与传递给where相同。

order by prod_name;

  联结的表越多,性能下降的越厉害。

例子:按照价格降序,最贵的在前面。

 

(二)正则表达式

  select prod_id,prod_name from products where vend_id=(select vend_id form products where prod_id ='DTNTR');

1、什么是分组?

  select customers.cust_name,customers.cust_id,count(orders.order_num) as num_ord from customers inner join orders on customers.cust_id = orders.cust_id group by customers.cust_id;

(1)adddate() :增加一个日期(天、周)

    现在假如有由同一供应商生产的多种物品,那么在何处存储供应商信息(如供应商名、地址、联系方式等)。

1、如何用order by

四、联结多个表

使用:它必须放在列名前面

  1、关系表:假如有一个包含产品目录的数据库表,其中每个类别的物品占一行。对于每种物品要求存储的信息包括产品描述和价格,以及生产该产品的供应商信息。

(1)清楚只管

  select prod_name,vend_name,prod_price,quantity from orderitems,products,vendors where products.vend_id=vendor.vend_id and orderitems.prod_id = products.prod_id and order_num=20005;

where prod_price >10

  SQL对一条select语句中可以联结的数目没有限制。创建联结基本规则也相同。首先列出所有表,然后定义表之间的关系。

(七)计算字段

 

from customers

  select customers.cust_id,orders.order_num from customers left outer join orders on(customers.cust_id=orders.cust_id);

表示:匹配任何一个单一字符,当想匹配特定字符的时候,可通过制定一组用[]括起来的字符来完成。

  笛卡尔积:由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行数目将是第一个表中的行数乘以第二个表中的行数。

子查询的优缺点:

五、使用表别名

where vend_id = 1002 or vend_id = 1003;

  2、外部连接

from products

  select vend_name,prod_name,prod_price from vendors,products order by vend_name,prod_name;

(2)如果在group by子句中嵌套了分组,数据将会在最后规定的分组上进行汇总。

  select cust_name,cust_contact from customers,orders,orderitems where customers.cust_id=orders.cust_id and orderitems.order_num=orders.order_num and prod_id='TNT2';

            from orders

where vend_id = 1003;

子查询经常出现的场景:

(3)[:blank:]  --  空格和制表

                            where order_num in (select order_num

select prod_id,prod_name

(5)locate():找出串的一个子串

from products

扩展:根据这些操作符,可以做单个值匹配(=)、不匹配检查(!=或者<>)、范围值检查(between)、空值检查(is null)

解释:检索除了1002和1003之外的所有。

(10)month():返回一个时间的月份部分

order by prod_name;

例子2:空值检查

举例:列出订购物品TNT2的所有客户。

order by

group by指定要被分组的目标(vend_id),并做统计。

解释:正则表达式是[123] Ton,[123]定义了一组字符,即匹配1或者2或者3,这么看,其实[ ]是另一种形式or语句,也可以看做是[1|2|3]的缩写。

(二)mysql使用方法

(5)sum:返回某列值之和

from products

(11)now():返回当前日期的时间

3、下面从两个部分介绍分组:

select语句中需要体现两种信息:选什么,从什么地方选。

from orderitems

{n}表示指定书目的匹配

(4)show columns from customers;

(2)虽然对嵌套的子查询的数目没有限制,不过在实际使用中由于性能的限制,不能嵌套太多的子查询。

(一)like统配符

例如:select prod_name from products;

(5)[:digit:]  --  任意数字

3、日期和时间处理函数

举个例子来看两者的差别:

where vend_id in (1002,1003);

概念:

用途:从表中检索一个或者多个数据列。

列:表中的一个字段

例2:

(2)avg可以用来返回所有列的平均值,也可以用来范数特定列或行的平均值。

from orders

得到的结果是:order_num:20005和20007

select cust_id,order_num

+表示1个或者多个匹配

order by vend_name;

表具有一些特性,定义了数据在表中如何的存储,存储什么样的数据,数据如何分解,各部分信息如何命名等。描述这组信息叫做模式(schema),它是关于数据库和表的布局及特性信息。

*表示0个或者过个匹配

1、where子句

(9)[:punct:]  --  既不在[:alpha:]也不在[:cntrl:]中的任意字符

(4)易于安装和使用

总结:

对vend_id分组,并且统计个数。

表示:任何字符出现任意次数,也可以是0次

order by vend_name;

(1)avg:返回某个列的平均值

select prod_id,prod_price,prod_name

select cust_id

3、in操作

select cust_name,cust_contact

5.主键

(1)use + database name;

where prod_name regexp '1000|2000'

(四)用where进行数据过滤

order by prod_name;

参考:mysql必知必会样例表

(1)rtrim():去除列值右边的空格

and例子:

例如:select prod_id,prod_name,prod_price from products;

(2)count:返回某列的行数

          quantity,

(14)year():返回一个日期的年份部分

1、啥是正则表达式

(五)匹配字符类

(4)[:cntrl:]  --  ascii控制字符

where

(十一)分组数据

select count(※) as orders

注意:

where cust_id in (10001,10004);

from customers

(1)先过滤某个特定用户的订单数量,再推广到每个用户。

拼接:将值联结到一起构成一个单个值。在select语句中,使用concat()函数来拼接两个列,待拼接的各个串用逗号分隔。

(1)可以用‘**%’的形式进行尾空格处理,也可以用trim函数进行处理

(1)在用于文本数据的时候,如果数据是按相应的列排序,则max()返回的是最后一行。

(3)show tables;

select cust_id,order_num

7、sum

          cust_state,

概念:max()返回指定列的最大值,但是max()需要制定列名

select * from product;

引入:having进行过滤分组,事实上,所有类型的where子句都可以用having来代替。

where order_num = 20005;

where year(order_date) =2005 and month(order_date)=9;

group by cust_id

注意:不管是插入表还是更新表还是用where子句进行过滤,日期必须为yyyy-mm-dd的格式,虽然其他的日期格式可能可行,但是这是首选的日期格式,它排除了多意义性。

解释:匹配的是除这些字符意外的任何东西。

from customers

(2)addtime() :增加一个时间(时、分)

from products

from products

from orders

(二)下划线通配符_

结果:不返回数据

3.检索多列

from

or例子:

作用:where子句中用来否定后跟条件的关键字。

2、执行算数计算

(2)show database;

扩展:使用order by和limit的组合,能够找出一个列的最高和最低的值。

where prod_name like 'jet%';

group by

例1:

      表示切换使用哪个数据库。

例如:select distinct vend_id from products;

(2) 匹配用\

from products

order by cust_name;

(5)datediff():计算两个日期之差

2.mysql的优点:

where prod_name regexp '^[0-9\.]'

(6)day():返回一个日期的天数部分

select prod_name

例子:

表中的一条记录

例如:select prod_name,prod_price

select cust_id from customers where cust_email is null;

order by prod_name;

          min(prod_price) as price_min,

group by子句和having子句

注意:

from orders

(8)substring():返回子串的字符

例子:

(2)对每个用户进行count计算

from customers;

where date(order_date) = '2015-09-01';

例子:select prod_name,prod_price from products where prod_price = 2.50

where order_num in (20005,20007);

在where子句中使用子查询能够编写出功能很强并且很灵活的SQL语句

select prod_id,prod_name

(2)使用count(column)对特定的具有值的行进行计数,忽略null

(3)可信赖

      用use打开数据库,才能读取其中的数据。

正则表达式的作用是匹配文本,将一个正则表达式与一个文本串进行比较,mysql用where子句对正则表达式提供了初步的支持,允许指定正则表达式,过滤select检索出的数据。

1.mysql是什么?

(7)[:print:]  --  任意可打印字符

作用:指定搜索条件,因为一般数据库表都包含大量的数据,很少我们需要所有的行,通常会根据特定需要来提取数据的子集。where语句就是来指定搜索条件(过滤条件)

from products

解释:返回products表中最贵的物品。

解释:其中\是用来匹配括号的,[0-9]用来匹配任意数字,sticks?匹配stick和sticks,因为?匹配他前面任何字符的0次或者1次出现。

from products;

(2)用于在数值数据上进行算数计算,比如说:返回绝对值以及代数运算

(2)max()函数忽略列值为null的行

注意:

1、在这里举一个例子,就知道子查询是什么,以及子查询如何使用了。

2、涉及的子句

(1)[:alnum:]  --  任意字符和数字

概念:

(1)包含子查询的select语句难以阅读和调试。

                            from orders

select cust_id,order_num

降序:desc

(2)匹配任何位置包含anvil,不论在之前还是之后出现什么字符。

概念:max()返回指定列的最小值,但是max()需要制定列名,使用方法与max同理

          max(prod_price) as price_max,

本文主要介绍mysql支持什么样的函数,以及如何使用这些函数。

例如:select prod_name from products limit 5;

where prod_name regexp '\([0-9] sticks?\)'

2、文本处理函数

一列或者一组列,能够唯一区分表中的每个行。

where prod_name like '1000'

(一)百分号通配符%

(1)用于处理文本串的文本函数。比如说:删除或者填充值,转化大小写

select vend_id, count(※) as num_prods

          item_price,

将这三个查询合并为一个:

order by prod_name;

3.连接好数据库后,就可以访问数据库并做操作,其中use是用来选择数据库的,show是用来查看mysql数据库、表、每部信息的。

解释:满足任意一个条件即可

原因:like匹配的是整个列,只有使用通配符的时候才会返回。而regexp是在列值中匹配,如果被匹配的文本在列值中出现regexp将会找到他,相应的行将被返回。

(一)创建分组

from products

select concat(vend_name,' (',vend_country,') ')

4.检索所有列

4、数值处理函数:

4、count

方法一:

例1:检索列prod_name包含文本1000的所有行

(8)[:lower:]  --  任意小写字母

          avg(prod_price) as price_avg

(十)排序检索数据

例子:

例如:如何找出最昂贵物品的值

select sum(quantity) as items_ordered

select prod_price

(6)[:graph:]  --  与[:print:]相同,但是不包含空格

select子句的顺序:

(9)minute():返回一个时间的分钟部分

order by prod_name;

我们通过数据库软件DBMS来创建和操纵容器。

(2)利用count()确定表中行的数目,以及符合特定条件的行的数目

(3)用于处理日期和时间值,并且从这些值中提取特定的成分的日期和时间函数,比如说返回这两个值的日期之差,检查日期的有效性。

from orders

(4)在in中可以包含其他的select语句

目的:为了匹配特定位置的文本。

from products

注意:在集合^[123]中表示否定该集合,在此处表示的是文本的开始。

(1)使用count(*)对表中行的数目进行统计,不管是表列中包含的是null和非null

{n,m}表示匹配数目的范围

(2)执行速度快,性能好

                                                              where prod_id = 'TNT2'));

from products

(4)返回DBMS正使用的特殊信息的系统函数。比如返回用户登录信息、检查版本细节。

(2)过滤分组 --having

select prod_name

4、小结:

where date(order_date) between '2005-09-01' and '2015-09-30';

6.外键

where prod_name regexp '[123] Ton'

意义:规定了包括哪些分组,排除哪些分组

(1)distinct只能用于count()

select avg(distinct prod_price) as avg_price

作用:指示mysql只返回不同的值的行

数据的所有存储、检索、管理和处理实际上是有数据库软件DBMS完成的。

(4)date():返回日期时间的日期部分

from products

(3)在group by中列出的列不能是聚集函数

分组就是汇总表内容的子集,分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。

例子:

where prod_name regexp '[[:digit:]]{4}'

注意:返回结果是未排序的。

数据库: 保存有组织数据的容器。

where prod_id = 'TNT2';

from products

select prod_name

where和having的区别:where过滤行,having过滤分组

          (select count(※)

(七)定位符

from orderitems

例子:select prod_name,prod_price

作用:返回结果的前几行

2、指定排序方向

如果我想检索出2005年9月下的所有订单:

group by vend_id;

from products

注意:sum()会忽略列值为null的行。

where vend_id =1003 and prod_price <=10;

where prod_name like '%anvil%';

where prod_name regexp '[1-5] Ton'

      返回数据库的列表

检索的步骤:

(五)通配符过滤

例子:

order by prod_name;

习惯上:不更新主键列中的值,不重用主键列的值,不在主键列中使用可能更改的值。

select prod_id,prod_price,prod_name

where prod_name like 's%e';

例如:

(7)group by必须在where语句之后,order语句之前。

  之前说的数据过滤都是对已知值进行过滤的,比如说匹配一个值或者多个值,大于某个值或者是小于某个值,或者是检查某个范围的值。

解释:

2、什么是通配符

from products

(2)upper():将文本转换大写

      获取一个数据库内的表的列表

where cust_id in (select cust_id

得到的结果是:cust_id:10001和10004

where prod_name regexp '1000'

同理,sum也可以用来合计计算值。例如下面的例子,可以得到总的订单金额,where子句同样保证只统计某个物品订单中的物品。

select prod_name

涉及的表:customers,orders(存储订单与相应的客户id)

(1)avg只能确定特定数值列的平均值,而且列名必须作为函数的参数给出。如果说我们想获得更多列的平均值,要使用多个avg()函数。

注意:.是正则表达式语言中的一个特殊的字符,它表示的匹配任意一个字符,所以1000和2000都符合条件。

order by prod_name;

(11)[:upper:]  --  任意大写字母

from orders

举例:

(二)or匹配

(1)因为开源,成本低

缺点:

abs、cos、exp、mod、pi、rand、sin、sqrt、tan

select prod_name

举例1:

from products

where order_date = '2015-09-01';

4.行

举例2:

where order_name = 20005;

注意:where过滤指定的是行而不是分组。where没有分组的概念。

order by prod_name;

目的:为了明确的排序用select语句检索出来的数据,可以用order by子句,order by往往取一个或者多个列的名字,根据此对输出进行排序。

(3)max:返回某列的最大值

order by prod_name;

select prod_name

(4)如果在select中使用表达式,则必须在group by子句中指定相同的表达式,不能使用别名。

(1)创建分组 --group by

概念:用来匹配值得一部分的特殊字符

注意:

from products

select prod_name

位置:放在from之后,order by之前

select prod_id,prod_price,prod_name

注意:计算次序用圆括号界定,要不容易混淆。

解释:返回customers表中客户的总数,这里利用count(*)对所有的行进行计数,不管各行中有什么值,计数值将在num_cust中返回。

例子1:between用法,它需要两个值。

select prod_name,prod_price from products where prod_price between 5 and 10;

select count(cust_emial) as num_cust

vend_title

(2)%通配符不能匹配null

from products

(2)$ 文本的结尾

6.limit

(十二)子查询

3、有哪些通配符以及如何使用呢?

where cust_id = 10001;

5.distinct关键字

from orders

select prod_name

注意:

where vend_id =1003 or vend_id =1002;

1.数据库

(3)不能用distinct count(*)

(1)找到以jet开头的产品,接受jet后面为任意多个字符

这也是与%的区别,这里就不举例赘述了。

from orderitems

(2)查询具有订单20005和20007的客户

注意:检索出来第一行是行0。如果行数不够,能返回多少就返回多少。

8、在聚合函数中用distinct

解释:只对有点子邮件的客户进行计数。

同理,可以写成:

2.检索单列

where order_num = 20005;

order by prod_price desc,prod_name;

(1)group by子句可以包含任意数目的列

1、应用场景

即得到了最后的结果

?表示0个或者1个匹配

mysql是一种DBMS,即是一种数据库软件。它是一种基于客户机-服务器的数据库。

最后注意:

(1)通过对表中的行数计数病计算特定列值之和。求得该列的平均值。

order by  prod_name;

例子:

方法二:

例1:

          quantity*item_price as expanded_price

本文主要介绍两个知识点,一个是拼接字段,一个是执行算数计算。

(2)用来填充计算列

它一般用于代数、三角或几何运算。

优点:

因为存储在数据库表中的数据一般不是应用程序所需要的格式,有的时候我们需要对原始数据做一些变换等需求。这就是计算字段发挥作用的时候了。

例子:

order by prod_price desc;

select order_num

(1)^ 文本的开始

7.完全限定的表名

from orders

select sum(item_price*quantity) as total_price

1、使用函数,那么主要有哪些种类的函数呢?

比如:我想列出至少有两个订单的所有顾客,此时,必须基于完整的分组进行过滤,而不是根据个别的行进行过滤。

where prod_name regexp '[0-9][0-9][0-9][0-9]’

from products

例子:找出以一个数或者小数点开始的所有产品,这里需要定位符^,表示文本的开始。

结果:返回一行

5、max()

from products

from products

注意:对于上述例子,仅仅在多个行具有相同的prod_price值时才对prod_name进行排序。如果prod_price列中所有的值都是唯一的,那么就不会按照prod_name排序。

select cust_name,cust_contact

例如:

select vend_id, count(※) as num_prods

from customers

select concat(rtrim(vend_name),' (',rtrim(vend_country),')') as

where prod_name regexp '[^123] Ton'

为了匹配特殊字符,必须使用\为前导

  但是如果我要搜索产品名中包含anvil的所有产品呢,这时候通配符就可以大显身手了,我们可以利用通配符搜索模式,找出产品名中任何位置出现anvil的产品。

(2)计算字段并不实际存在于数据库表中,计算字段是运行时在select语句内创建的。

(三)用select检索数据

(6)lower():转换为小写

select cust_id,order_num

(12)[:xdigit:]  --  任意十六进制数字

优点:不明确列名的时候使用。

selelct avg(prod_price) as avg_price

from vendors

(7)soundex():返回串的soundex值,发音相似

group by vend_id

2、mysql主要的聚集函数有哪些?

where prod_name regexp '.000'

(3)left():返回串左边的字符

select products.prod_name from product;

from orderitems

解释:以降序排序产品,然后再对产品名排序。

(2)[:alpha:]  --  任意字符

1、聚集函数的概念:运行在行组上,计算和返回单个值的函数。

3、有哪几种匹配呢?

例子:

一般在使用group by子句的时候,应该给出order by子句,这是保证数据正确排序的唯一方法。千万不要依赖group by的排序数据。

(一)几个数据库相关的概念

from products

select prod_name

2、再举一个例子:现在需要显示customers表中每个客户的订单总数。

解释:从products表中检索出来prod_name列

(1)where子句的in操作符中

(6)如果分组列中具有null,则它们将会作为一个分组返回。

使用:当我想搜索两个串之一时,使用|

例子:加了distinct参数之后,平均值只考虑各个不同的价格

注意:这里只对prod_price降序了,如果想在多个列上进行姜旭排序,必须对每个列指定desc关键字。

如果按照多个列进行排序呢?例如:

(5)除了聚集计算语句之外,select语句中的没个列都必须在group by子句中给出。

解释:必须同时满足两个条件

集合可以用来定义要匹配的一个或者多个字符,如果想匹配0到9,可以用[0123456789],也可以用[0-9],并且范围不一定是数值,也可以匹配字符,[a-z]匹配任意的字母字符。

(1)count()主要是用来计数

where vend_id not in (1002,1003);

order by  prod_name;

(3)找到以s起头、以e结尾的所有产品:

例1:

如果日期的形式是‘2015-09-01 00:00:00’,那么就检索不出来,所以更加可靠的形式为:

解释:指定特定行或者特定列求平均值,它返回的是特定供应商1003所提供产品的平均价格。

作用:指定条件范围

(3)检索客户id为10001和10004的客户信息

select prod_name,prod_price

(10)[:space:]  --  包括空格在内的任意空白字符

(三)匹配范围

解释:检索供应商1002和1003制造的所有产品。in操作符后面跟着的是合法值得清单。

select prod_id,

(7)dayofweek():对应一个日期返回对应星期几

这部分主要介绍聚集函数以及如何利用它们来汇总表的数据。

解释:sum(quantity)用来返回订单中所有物品的数量之和,where子句值统计某个物品订单中的物品。

from vendors

(1) \-匹配-,\.匹配.

select cust_name,

from products;

(2)不能用count(distinct)

解释:订单数大于2的用户

from products

from customers;

select prod_id,prod_price,prod_name

where prod_name regexp '1000'

例2:检索列prod_name包含000的所有行

(二)过滤分组

from products

备注:该子查询对检索出的每个客户执行一次

例子:匹配prod_name为1000或者2000的情况

解释:返回products表中所有产品的平均价格

from products

select count(*) as num_items

3.列和数据类型

(六)正则表达式匹配

from products

6、min()

(13)time():返回一个日期时间的时间部分

select cust_name,cust_contact

解释:同时用了where和having,表示具有2个以上,价格10以上的产品的供应商。

having

select max(prod_price) as max_price

例2:

(3)in执行比or执行的快

2.表

having count(※)>2;

order by prod_price desc

(六)匹配多个实例

limit

另一种写法:

解释:这里采用了相等测试,只返回prod_price为2.5的行,还可以有等于、不等于、小于、小于等、大于、大于等、between操作符。

select count(*) as num_cust

(一)基本字符匹配

按照单个列排序的例子:

from product;

order by prod_name;

from products

having count(※)>2;

概念:用来返回指定列值的和(总计)

limit 1;

(1)检索包含物品TNT2的所有订单号

3、avg

1、拼接字段

扩展:

(4)length():返回串的长度

通配符是一种非常有用的搜索工具,但是不能过度使用,否则搜索时间会很长。

from products

1.select:

注意:

注意:regexp后所跟的东西作为正则表达式处理。

(2)计算次序容易理解

例如:

(8)hour():返回一个日期的小时部分

升序:asc,默认的

解释:这个表达式的意思是匹配1到5,例如.5 Ton也会返回。

order by prod_price,prod_name;

某种特定类型数据的结构化清单。表名是唯一的,用来标识自己。

select prod_name

where vend_id = 1003;

(四)匹配特殊字符

from products

select avg(prod_price) as avg_price

编辑:MySQL数据库 本文来源:mysql基础整理,MySQL自学笔记_联结

关键词: