mysql

MYSQL

一.使用mysql

返回数据库列表

show databases;
//返回可用数据的一个列表。包含这个列表中的可能是mysql内部使用的数据库

返回当前选择数据库的可用表

SHOW TABLES;

返回选中表的所有字段信息

SHOW COLUMNS FROM 表名;

显示服务器状态

SHOW STATUS;

显示创建数据库或创建表的sql语句

SHOW CREATE DATABASE; SHOW CREATE TABLE;

显示授权用户

SHOW GRANTS;

用来显示服务器错误或者警告

SHOW ERRORS;SHOW WARNINGS;

二.检索数据

1.select语句

  1. 检索单个列

    select 列名 from 表名;
    
  2. 检索多个列

    select 列名1,列名2,列名3... from 表名
    
  3. 检索所有列

    select * from 表名;
    
  4. 检索不同的行(去重)

    select distinct 列名 from 表名;
    

    注意不能部分使用distinct,distinct关键字应用于所有列而不仅是前置它的列。如果给出

    select distinct 列名1,列名2 ;除非两个列都不同,否则所有行都被检索出来

  5. 限制结果(limit)

    select 列名 from 表名 limit 行数;
    
    select 列名 from 表名 limit 开始行数,结果数;
    //第一个是开始位置,第二个是要检索的行数,默认是从0开始
    

三.排序检索数据

1.排序数据

select 列名 from 表名  order by 列名;

为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。

2.按多个列排序

select 列名1,列名2,列名3 from 表名 order by 列名1,列名2;

检索三个列并对其中两个结果进行排序(有先后顺序)

3.指定排序方向(升序排序和降序排序)

升序排序(asc)

select 列名1,列名2,列名3 from 表名 order by 列名1 asc ;//升序,默认

降序排序(desc)

select 列名1,列名2,列名3 from 表名 order by 列名1 desc;//降序

四.过滤数据

1.使用where子句

数据库表一般包含大量的数据,很少需要检索表中所有行。通常只会根据特定操作或报告的需要提取表数据的子集。只检索所需数据需要指定搜索条件( search criteria) ,搜索条件也称为过滤条件( filtercondition) 。

select 列名1,列名2,列名3... from 表名 where 条件

注意:同时使用order by和where的时候应该让order by 位于where之后,否在会产生错误

2.where子句操作符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dp8rd5k3-1620468448742)(MYSQL.assets/image-20210508090847495.png)]

2.1不匹配检查
select * from 表名 where 列名 <> 值;

或者

select * from 表名 where 列名 != 值;
2.2范围值检查(between)
select 列名1,列名2,列名3 from 表名 where 列名1 between 值1 and 值2;
2.3空值检查(IS NULL)
select 列名1,列名2,列名3 from 表名 where 列名1 IS NULL;
select 列名1,列名2,列名3 from 表名 where 列名1 IS NOT NULL;

五.数据过滤

1.组合使用where子句

1.1AND操作符
select 列名1,列名2,列名3 from 表名 where 列名1=值1 AND 列名2=值2;
1.2or操作符
select 列名1,列名2,列名3 from 表名 where 列名1=值1 or 列名2=值2;
1.3计算次序

and操作符的优先级比or高

需要列出价格为10美元(含)以上且由1002或1003制造的所有产品。下面的SELECT语句使用AND和OR操作符的组合建立了一个WHERE子句:

select name,pricce from products where id=1002 or id=1003 and price>=10;

返回的值有小于十美元的,原因and的优先级比or高,sql理解的意思是供应商1003制造的任何价格为10美元以上的产品,或者由供应商1002制造的任何产品,而不管其价格如何。

解决方法:使用括号明确的分组响应操作符

select name,pricce from products where (id=1002 or id=1003) and price>=10

注意:任何时候使用具有and和or操作符的where子句,都应该明确地分组操作符。不能过分依赖默认计算次序。

2.in操作符

圆括号在WHERE子句中还有另外一种用法。 IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。 IN取合法值的由逗号分隔的清单,全都括在圆括号中。

select 列名1,列名2,列名3 from 表名 where 列名1 in (值1,值2);

作用大致跟or操作符一样。

使用IN操作符的优点如下:

在使用长的合法选项清单时,in操作符的语法更清楚且直观。

在使用in时,计算的次序更容易管理

in操作符比or操作符执行更快

in的最大优点是可以包含其他的select语句,使得能够更动态的建议where语句

3.not操作符

功能:where子句中的not操作符有且只有一个功能,那就是否认它之后所跟的任何条件。

六.用通配符进行过滤

1.like操作符

通配符:用来匹配值的一部分的特殊字符

搜索模式:由字面值、通配符或两者组合构成的搜索条件。

1.1百分号(%)通配符

最常使用的通配符是百分号%。在搜索串中,%表示任何字符出现任意次数。例如,为了找出所有以jet起头的产品,可使用如下的select语句

select * from products where name like 'jet%';

通配符可以在搜索模式中任意位置使用,并且可以使用多个通配符。

select * from products where name like '%anvi%';

搜索模式’%anvi%'表示匹配任何位置包含文本anvi的值,而不论它之前或者之后出现什么字符。

通配符也可以出现在搜索模式的中间,虽然这样做不太有用。下面的例子找出以s起头以e结尾的所有产品:

 select * from products where name like 's%e';

注意:除了一个或多个字符串外,%还可以匹配0个字符。%代表搜索模式中给定位置的0个、1个或者多个字符。

虽然%似乎可以匹配任意东西,但有一个例外,即null。

1.2下划线_通配符

下划线_用途与%一样,但下划线只匹配单个字符而不是多个字符。

与%能匹配0个字符不一样,_总是能匹配一个字符,不能多也不少。

使用通配符的技巧
  1. 不要过度使用通配符。如果其他操作符能够达到相同的目的,应该使用其他操作符
  2. 在确定需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式开始处。把通配符至于搜索模式的开始处,搜索起来是最慢的。
  3. 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据

七.正则表达式介绍(regexp)

正则表达式是用来匹配文本的特殊的串(字符集合)。 如果你想从一个文本文件中提取电话号码,可以使用正则表达式。如果你需要查找名字中间有数字的所有文件,可以使用一个正则表达式。如果你想在一个文本块中找到所有重复的单词,可以使用一个正则表达式。如果你想替换一个页面中的所有URL为这些URL的实际HTML链接, 也可以使用一个正则表达式 。

regexp

例子:检索name包含文本1000的所有行:

select name from products where name regexp '1000' order by name;

例子二:检索所有000结尾的行

select name from products where name regexp '.000' order by name;

like匹配整个列。regexp在列值只内进行匹配。

匹配不区分大小写(BINARY)

为了区分大小写可以使用binary关键字

where name regexp binary 'jetpack.000';

进行or匹配

为搜索两个串之一(或者为这个串,或者为另一个串),使用|,如下所示:

select name from products where name regexp '1000|2000' order name;

语句使用了正则表达式1000|2000。|为正则表达式的or操作符。它表示匹配其中之一,因此1000和2000都会匹配并返回。使用|从功能上类似于在SELECT语句中使用OR语句, 多个OR条件可并入单个正则表达式。

两个以上的OR条件 可以给出两个以上的OR条件。例如,
'1000 | 2000 | 3000'将匹配1000或2000或3000。

匹配几个字符之一

匹配任何单一字符。可通过指定一组用[ ]括起来完成。

select name from products where name regexp '[123]Ton' order name;

这里,使用了正则表达式[123] Ton。 [123]定义一组字符,它的意思是匹配1或2或3。

正如所见,[]是另一种形式的or语句。事实上,正则表达式[123]Ton为[1|2|3]Ton的缩写。

字符集也可以被否定,他们将匹配指除指定外的任何东西。为否定一个字符集,在集合的开始放置一个^即可

[^123]匹配这些字符以外的任何东西。

匹配范围

集合可用来定义要匹配的一个或多个字符。例如,下面的集合将匹配数字0到9:[0123456789]

为了简化可以使用-来定义一个范围。下面的式子功能等同于上述的数字列表[0-9]

范围不限于完整的集合,[1-3]和[6-9]也是合法范围。此外范围不一定是数值,[a-z]匹配任意字母字符

匹配特殊字符(\\)

为了匹配特殊字符,必须使用\\为前导号。\\ -表示查找-,\\ .表示查找.。

select name from vendors where name regexp '\\.' order by name;

这种给处理就是所谓的转义,正则表达式具有也是意义的所有字符必须以这种方式转义。这包括

. | [] 以及迄今为止使用过的其他特殊字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RLKup2EO-1620468448743)(MYSQL.assets/image-20210508111212069.png)]

匹配字符类

字符类以及他们的含义

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z9ex2dZm-1620468448745)(MYSQL.assets/image-20210508111328599.png)]

匹配多个实例

重复元素符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tk0u81Ko-1620468448746)(MYSQL.assets/image-20210508111925982.png)]

select name from products where name regexp ’\\([0-9]sticks?\\)‘ order by name;

正则表达式 ’\\([0-9]sticks?\\)‘解释说明。\\(匹配),[0-9]匹配任意数字,sticks?匹配stick和sticks(s后面的?使得s可选,因为?匹配它前面的任何字符的0次或1次出现,\\匹配)。

定位符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aXwHSy7y-1620468448747)(MYSQL.assets/image-20210508112835571.png)]

如果你想找出以一个数(包括以小数点开始的数)开始的所有产品,怎么办?简单搜索[0-9\\.](或[[:digit:]\\.])不行,因为它将在文本内任意位置查找匹配。解决办法是使用^定位符, 如下所示:

select name from products where name regexp '^[0-9\\.]' order by prod_name;

^的双重用途:有两种用法。在集合中(用[] 定义),用它来否定集合,否在用来指串的开始处

使用regexp起类似like的作用 like和regexp的不同在于,like匹配整个川而regexp匹配子串。利用定位符,通过用^开始每个表达式,用$结束每个表达式,可以起到和like一样的作用。

八.创建计算字段

1.拼接字段(concat)

将两个列拼接起来。多数的dbms使用+或者||来实现拼接,mysql则使用Concat()函数;来实现。

select Concat(name,'(',country,')') from vendors order by name;

concat()拼接串,即把多个串连接起来形成一个较长的串。concat()需要一个或多个指定的串,各个串之间用逗号分隔。上面的select语句包含四个元素

  1. 存储在name列中的名字。
  2. 包含一个空格和一个(的串。
  3. 存储在country列中的国家。
  4. 包含一个)的串。

在第8章中曾提到通过删除数据右侧多余的空格来整理数据,这可以使用MySQL的RTrim()函数来完成,如下所示:

select Concat(RTrim(name),'(',RTrim(country),')') from vendors order by name;

2.使用别名(as)

select Concat(RTrim(name),'(',RTrim(country),')') as title from vendors order by name;

别名还有其他用途。常见的用途包括在实际的表列名包含不符合规定的字符(如空格)时重新命名它,在原来的名字含混或容易误解时扩充它,等等。

别名有时也称为导出列( derived column),不管称为什么,它们所代表的都是相同的东西

3.执行算术计算

select id,quantity,price,quantity*price as expanded_price from orderitems where num =2005

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IKgWAu1X-1620468448747)(MYSQL.assets/image-20210508135544331.png)]

九.使用数据处理函数

1.函数

函数一般是在数据上执行的,他给数据的转换和处理提供了方便。

在前一章用来去掉串尾空格的Rtrim()就是一个函数的例子。

函数没有sql的可移植性强

2.使用函数

大多数sql支持以下类型的函数

  1. 用于处理文本串(如删除或填充值,转换值为大小写)的文本函数
  2. 用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数。
  3. 用于处理日期和时间值并从这些值中提取特定成分(返回两个日期之差,检查日期有效性等)的日期和时间函数。
  4. 返回dbms正在使用的特殊信息(如返回用户登录信息,检查版本细节)的系统函数
2.1文本处理函数

RTrim()函数用来出去列值右边的空格。Upper()函数将文本转换为大学

select name,Upper(name) as name_upcase from vendors order by name;

常用的文本处理函数

left()		返回串左边的字符
length()	返回串的长度
locate()	找出串的第一个子串
lower()		将串转化为小写
LTrim()		去掉左边的空格
Right()		返回串右边的字符
RTrim()		去掉右边的空格
soundex()	返回串的SOUNDEX值
SubString()	返回子串的字符
Upper()		将串转换为大写
2.2日期和时间处理函数

日期和时间采用相应的数据类型和特殊的格式存储,以便快速和有效地排序或过滤,并且节省物理存储空间。

常用的日期和时间处理函数

AddDate() 增加一个日期(天、周等)
AddTime() 增加一个时间(时、分等)
CurDate() 返回当前日期
CurTime() 返回当前时间
Date() 返回日期时间的日期部分
DateDiff() 计算两个日期之差
Date_Add() 高度灵活的日期运算函数
Date_Format() 返回一个格式化的日期或时间串
Day() 返回一个日期的天数部分
DayOfWeek() 对于一个日期,返回对应的星期几
Hour() 返回一个时间的小时部分
Minute() 返回一个时间的分钟部分
Month() 返回一个日期的月份部分
Now() 返回当前日期和时间
Second() 返回一个时间的秒部分
Time() 返回一个日期时间的时间部分
Year() 返回一个日期的年份部分

日期格式:无论你什么时候指定一个日期,不管是插入或更新表值还是用where子句进行过滤,日期必须为格式yyyy-mm-dd。

如果你想检索出2005年9月下的所有订单,怎么办?简单的相等测试不行,因为它也要匹配月份中的天
数。有几种解决办法,

select id,num from orders where date(order_date) between '2005-09-01' and '2005-09-30'; 
select id,num from orders where year(order_date)=2005 and month(order) =9;
2.3数值处理函数
Abs() 返回一个数的绝对值
Cos() 返回一个角度的余弦
Exp() 返回一个数的指数值
Mod() 返回除操作的余数
Pi()  返回圆周率
Rand() 返回一个随机数
Sin() 返回一个角度的正弦
Sqrt() 返回一个数的平方根
Tan()  返回一个角度的正切

十.汇总数据

1.聚集函数

我们经常需要汇总数据而不用把它们实际检索出来,为此MySQL提供了专门的函数。使用这些函数, MySQL查询可用于检索数据,以便分析和报表生成。这种类型的检索例子有以下几种。

  1. 确定表中的行数
  2. 获得表中的行组的和
  3. 找出表列的最大值、最小值和平均值

mysql给出五个聚集函数,如下

AVG() 返回某列的平均值
COUNT() 返回某列的行数
MAX() 返回某列中的最大值
MIN() 返回某列中的最小值
SUN() 返回某列值之和

avg()只适用于单个列。为了获得多个列的平均值,必须使用多个avg()函数。

count()函数有两种使用方式

1.使用count(*)对表中行的数目进行计算,不管表列中包含的是空值还是非空值

2.使用COUNT(column)对特定列中具有值的行进行计数,忽略null值。

如果指定列名,则指定列的值为空的行被count()函数忽略,但如果COUNT()函数用的是星号(*),则不忽略。

max()函数

max()返回指定列中的最大值。max()要求指定列名,如下所示

select max(price) as max_price from products;

对非数值的数据使用max(),在用于文本数据时,如果数据按照相应的列排序,则max()返回最后一行。

min()函数

min()的功能正好与max()的功能相反

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值