您的位置:金沙游乐场85155 > 大数据库 > 《mysql必知必会》学习_第六章_20180730_欢

《mysql必知必会》学习_第六章_20180730_欢

发布时间:2019-10-08 12:32编辑:大数据库浏览(113)

    第六章《过滤数据》

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

    P35

    1.数据库

    1. select prod_name,prod_price from products where prod_price=2.5;

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

    2.select prod_name,prod_price from products where prod_price='2.5';

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

    #两个语句得到的结果一样,因为指定的是数值。

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

    金沙85155登入 1

    2.表

    P36

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

    select prod_name,prod_price from products where prod_name='fuses'; #当指定的是文字时候,则要用引号(‘ ’)。

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

    金沙85155登入 2

    3.列和数据类型

    select prod_name,prod_price from products where prod_price <10; #检索prod_price小于或等于10(<=不是=<)的,读取prod_name,prod_price列。

    列:表中的一个字段

    金沙85155登入 3

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

     select prod_name,prod_price from products where prod_price <10; #检索prod_price小于10的,读取prod_name,prod_price列。

    4.行

    金沙85155登入 4

    表中的一条记录

    P37 不匹配检查(不等于某个值)

    5.主键

    1. select vend_id,prod_name from products where vend_id <>1003; #vend_id不等于1003# 

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

    2.1. select vend_id,prod_name from products where vend_id !=1003; #vend_id不等于1003# 1和2的表达的意思是一样的# 

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

    金沙85155登入 5

    6.外键

    P38

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

     select prod_name,prod_price from products where prod_price between 5 and 10; #检索prod_price在范围5到10之内的。注意:数值加上引号与否并不会影响结果#

    (二)mysql使用方法

    金沙85155登入 6

    1.mysql是什么?

    select prod_name from products where prod_price is null ; #表示检索prod_price是空值的#返回没有结果,因为prod_price没有空值#

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

    金沙85155登入 7

    2.mysql的优点:

    P39

    (1)因为开源,成本低

    select cust_id from customers where cust_email is null ;#检索cust_email是空值#

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

    金沙85155登入 8

    (3)可信赖

     

    (4)易于安装和使用

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

    (1)use + database name;

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

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

    (2)show database;

          返回数据库的列表

    (3)show tables;

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

    (4)show columns from customers;

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

    (三)用select检索数据

    1.select:

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

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

    2.检索单列

    例如:select prod_name from products;

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

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

    3.检索多列

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

    4.检索所有列

    select * from product;

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

    5.distinct关键字

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

    例如:select distinct vend_id from products;

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

    6.limit

    作用:返回结果的前几行

    例如:select prod_name from products limit 5;

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

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

    7.完全限定的表名

    select products.prod_name from product;

    (四)用where进行数据过滤

    1、where子句

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

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

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

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

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

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

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

    例子2:空值检查

    select cust_id from customers where cust_email is null;

    2.组合where子句

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

    and例子:

    select prod_id,prod_price,prod_name

    from products

    where vend_id =1003 and prod_price <=10;

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

    or例子:

    select prod_id,prod_price,prod_name

    from products

    where vend_id =1003 or vend_id =1002;

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

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

    3、in操作

    作用:指定条件范围

    例子:select prod_name,prod_price

    from products

    where vend_id in (1002,1003);

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

    另一种写法:

    select prod_name,prod_price

    from products

    where vend_id = 1002 or vend_id = 1003;

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

    (1)清楚只管

    (2)计算次序容易理解

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

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

    4、not操作符:

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

    例如:select prod_name,prod_price

    from products

    where vend_id not in (1002,1003);

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

    (五)通配符过滤

    1、应用场景

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

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

    2、什么是通配符

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

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

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

    (一)百分号通配符%

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

    例子:

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

    select prod_id,prod_name

    from products

    where prod_name like 'jet%';

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

    select prod_id,prod_name

    from products

    where prod_name like '%anvil%';

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

    select prod_name

    from products

    where prod_name like 's%e';

    注意:

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

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

    (二)下划线通配符_

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

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

    4、小结:

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

    (六)正则表达式匹配

    1、啥是正则表达式

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

    2、like与regexp的区别

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

    (一)like统配符

    select prod_name

    from products

    where prod_name like '1000'

    order by prod_name;

    结果:不返回数据

    (二)正则表达式

    select prod_name

    from products

    where prod_name regexp '1000'

    order by prod_name;

    结果:返回一行

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

    3、有哪几种匹配呢?

    (一)基本字符匹配

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

    select prod_name

    from products

    where prod_name regexp '1000'

    order by  prod_name;

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

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

    select prod_name

    from products

    where prod_name regexp '.000'

    order by  prod_name;

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

    (二)or匹配

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

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

    select prod_name

    from products

    where prod_name regexp '1000|2000'

    order by prod_name;

    (三)匹配几个字符之一

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

    例1:

    select prod_name

    from products

    where prod_name regexp '[123] Ton'

    order by prod_name;

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

    例2:

    select prod_金沙85155登入,name

    from products

    where prod_name regexp '[^123] Ton'

    order by prod_name;

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

    (三)匹配范围

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

    例1:

    select prod_name

    from products

    where prod_name regexp '[1-5] Ton'

    order by prod_name;

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

    (四)匹配特殊字符

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

    例如:

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

    (2) 匹配用\

    (五)匹配字符类

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

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

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

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

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

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

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

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

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

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

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

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

    (六)匹配多个实例

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

    例1:

    select prod_name

    from products

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

    order by prod_name;

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

    例2:

    select prod_name

    from products

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

    order by prod_name;

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

    同理,可以写成:

    select prod_name

    from products

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

    order by prod_name;

    扩展:

    *表示0个或者过个匹配

    +表示1个或者多个匹配

    ?表示0个或者1个匹配

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

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

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

    (七)定位符

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

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

    select prod_name

    from products

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

    order by prod_name;

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

    扩展:

    (1)^ 文本的开始

    (2)$ 文本的结尾

    (七)计算字段

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

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

    注意:

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

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

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

    1、拼接字段

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

    例子:

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

    from vendors

    order by vend_name;

    2、执行算数计算

    例子:

    select prod_id,

              quantity,

              item_price,

              quantity*item_price as expanded_price

    from orderitems

    where order_name = 20005;

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

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

    本文由金沙游乐场85155发布于大数据库,转载请注明出处:《mysql必知必会》学习_第六章_20180730_欢

    关键词:

上一篇:Setup CentOS selenium headless env

下一篇:没有了