MySQLの笔记

选择数据(SHOW)

所有的语法的结尾需要加上分号

对所有关键字使用大写,而对所有列和表名使用小写,这样做使得代码更易于阅读和调试

将语句按照板块分行也更容易阅读和调试

选择数据库

输入

USE crashcourse;

输出

Database change

查看内部表中的信息

输入

SHOW TABLES;

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

SHOW 也可以用于显示表列

SHOW COLUMNS FROM customers;

对每个字段返回一行,行中包含字段名、数据类型、是否允许NULL、键信息、默认值以及其他信息

自动增量

某些表列需要唯一值,MySQL可以自动为每一行自动分配下一个可用编号,不需要手动分配唯一值,但是这样做必须记住最后一次使用的值

如果需要使用自动增量需要在用CREAT语句创建表时把它作为表定义的组成部分

DESCRIBE

DESCRIBE作为 SHOW COLUMNS FROM 的一种快捷方式

检索数据(SELECT)

检索单个列

SELECT prod_name
FROM products;

SELECT 语句从products表中检索一个名为prod_name的列。

未排序数据

在查询的时候如果没有明确排序查询的结构,则返回的数据的顺序没有特殊意义,返回数据的顺序可能是数据被添加到表中的顺序(也可能不是),只要返回相同数目的行,就是正常的

检索多个列

SELECT  prod_id,prod_name,prod_price
FROM products;

使用SELECT语句从表products中选择指定的列,列与列之间用逗号隔开

检索所有列(*)

SELECT *
FROM products;

如果给定一个通配符( * ),则返回表中所有列。列的顺序一般是列在表定义中出现的顺序,但除了一般情况下,表的模式的变化(如添加或删除列)可能会导致顺序的变化

检索不同的行(DISTINCT)

SELECT DISTINCT vend_id
FROM products;

DISTINCT 关键字,指示MySQL只返回不同的值

如果需要使用DISTINCT关键字,它必须直接放在列名的前面

限制结果

SELECT prod_name
FROM products
LIMIT 5;

LIMIT N指示MySQL返回不多于N行

限制结果的行数

SELECT prod_name
FROM products
LIMIT 5 ,5;

指示mysql返回从行5开始的5行,第一个数未开始的位置,第二个数为要检索的行数

行0

检索出来的第一行为行0而不是行1,所以LIMIT 1,1 将检索出第二行而不是第一行

在行数不够时

在指定要检索的行数为检索的最大行数。如果没有足够的行,那就有多少行就返回多少行

LIMIT 10,5 但是只有13行,那就返回到第13行

完全限定的表名

SELECT products.prod_name
FROM products;

列名和表名都可以完全限定

SELECT products.prod_name
FROM crashcourse.products;

这两份语句是等价的

排序检索数据

排序检索

为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY

SELECT prod_name
FROM products
ORDER BY prod_name;

按多个列排序

SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price,prod_name;

仅在多行具有相同的 prod_price值时才对产品按prod_name进行排序,如果prod_price列中所有的值都是唯一的,则不会按照prod_name排序

指定排序方向

SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price DESC;

order by默认是升序排序

要使用降序排序,必须指定DESC关键字

SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price DESC,prod_name;

DESC关键字只应用到直接位于其前面的列名.

prod_price列指定DESC,对prod_name列不指定。

ASC

与DESC相反的关键字是ASC(ASCENDING),在升序排序时可以指定它。

但实际上,ASC没有多大用处,因为升序是默认的(如果既不指定ASC也

不指定DESC,则假定为ASC)。

最大 OR 最小值

SELECT prod_price
FROM products
ORDER BY prod_price DESC
LIMIT 1;

prod_price DESC保证行是按照由最昂贵到最便宜检索的,而
LIMIT 1告诉MySQL仅返回一行。

过滤数据(WHERE)

使用WHERE语句

SELECT prod_name,prod_price
FROM prodocts
WHERE prod_price = 2.50;

products表中检索两个列,但不返回所有行

只返回prod_price值为2.50的行

同时使用ORDER BY 和 WHERE ,应该让ORDER BY 位于WHERE之后

WHERE子句操作符

image-20230804193919823

SELECT prod_name,prod_price
FROM products
WHERE prod_name = 'fuses';

检查WHERE prod_name=‘fuses’语句,它返回prod_name的值为Fuses的一行。

MySQL在执行匹配时默认不区分大小写,所以fuses与Fuses匹配

SELECT prod_name,prod_price
FROM products
WHERE prod_price < 10;

检索价格小于等于10美元的所有产品

不匹配检查

SELECT vend_id,prod_name
FROM products
WHERE vend_id <> 1003;
SELECT vend_id,prod_name
FROM products
WHERE vend_id != 1003;

空值检查

NULL

无值(no value),它与字段包含0、空字符串或仅仅包含空格不同

SELECT prod_name
FROM products
WHERE prod_price IS NULL;

如果在文件中没有某位顾客的电子邮件地址,则cust_email列将包含NULL值

SELECT cust_id
FROM customers
WHERE cust_email IS NULL

数据过滤

AND操作符

SELECT prod_id ,prod price,prod_name
FROM products
WHERE vend_id = 1003 AND prod_price <=10;

​ OR操作符

SELECT prod_name,prod_price
FROM products
WHERE vend_id = 1002 OR vend_id = 1003;

计算次序

SELECT prod_name,prod_name
FROM products
WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;

DBMS首先过滤圆括号内的OR条件

SELECT prod_name,prod_name
FROM products
WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;

IN 操作符

SELECT prod_name,prod_price
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name;

检索供应商1002和1003制造的所有产品

NOT操作符

SELECT prod_name,prod_price
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;

NOT使找出与条件列表不匹配的行

用通配符进行过滤

LIKE操作符

通配符(wildcard)

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

搜索模式(search pattern)

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

为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,

后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。

百分号(%)通配符

最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现
任意次数。

SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE 'jet%';

此例子使用了搜索模式’jet%'。在执行这条子句时,将检索任意以jet起头的词。

%告诉MySQL接受jet之后的任意字符,不管它有多少字符

SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE '%anvil%';

搜索模式’%anvil%'表示匹配任何位置包含文本anvil的值,而

不论它之前或之后出现什么字符。

SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE 's%e';

%还能匹配0个字符。%

代表搜索模式中给定位置的0个、1个或多个字符。

注意尾空格

尾空格可能会干扰通配符匹配。例如,在保存词anvil 时,如果它后面有一个或多个空格,则子句WHERE prod_name LIKE '%anvil’将不会匹配它们

因为在最后的l后有多余的字符。解决这个问题的一个简单的办法是在搜索模式最后附加一个%。一个更好的办法是使用函数(第11章将会介绍)去掉首尾空格。

注意NULL

虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL。即使是WHERE prod_name LIKE '%'也不能匹配用值NULL作为产品名的行。

下划线(_)通配符

SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE '_ ton anuvil';

下划线只匹配单个字符

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

使用正则表达式进行搜索

基本字符匹配

SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;

LIKE与REGEXP

在LIKE和REGEXP之间有一个重要的差别。

请看以下两条语句:

如果执行上述两条语句,会发现第一条语句不返回数据,而第二条语句返回一行。为什么?

正如第8章所述,LIKE匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)。

而REGEXP在列值内进行匹配,如果被匹配的文本在

列值中出现,REGEXP将会找到它,相应的行将被返回。这是一个非常重要的差别。

那么,REGEXP能不能用来匹配整个列值(从而起与LIKE相同的作用)?答案是肯定的,使用^和$定位符(anchor)即可

匹配不区分大小写

MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即,大写和小写都匹配)。

为区分大小写,可使用BINARY关键字,如

WHERE prod_name REGEXP BINARY 'JetPack .000'

匹配几个字符之一

SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] Ton'
ORDER BY prod_name;

正则表达式[123] Ton。[123]定义一组字符,它的意思是匹配1或2或3,因此,1 ton和2 ton都匹配且返回(没有3 ton)

[]是另一种形式的OR语句。事实上,正则表达式[123]Ton

为[1|2|3]Ton的缩写

SELECT prod_name
FROM products
WHERE prod_name REGEXP '1|2|3 Ton'
ORDER BY prod_name;

‘1’或’2’或’3 ton’。除非把字符|括在一个集合中,否则它将应用于整个串。

即’1’ ‘2’ '3 Ton’这三个字符串

匹配范围

SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5] Ton'
ORDER BY prod_name;

[1-5]定义了一个范围,这个表达式意思是匹配1到5

匹配特殊字符

SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\.'
ORDER BY prod_name;

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

这种处理就是所谓的转义(escaping),正则表达式内具有特殊意义的所

有字符都必须以这种方式转义(这包括.、|、[])

匹配字符类

存在找出你自己经常使用的数字、所有字母字符或所有数字字母字符等的匹配。为更方便工作,可以使用预定义的字符集,称为字符类(character class)。表9-2列出字符类以及它们的含义。

[:alnum:] 任意字母和数字(同[a-zA-Z0-9])

[:alpha:] 任意字符(同[a-zA-Z])

[:blank:] 空格和制表(同[\t])

[:cntrl:] ASCII控制字符(ASCII 0到31和127)

[:digit:] 任意数字(同[0-9])

[:graph:] 与[:print:]相同,但不包括空格

[:lower:] 任意小写字母(同[a-z])

[:print:] 任意可打印字符

[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符

[:space:] 包括空格在内的任意空白字符(同[\f\n\r\t\v])

[:upper:] 任意大写字母(同[A-Z])

[:xdigit:] 任意十六进制数字(同[a-fA-F0-9])

匹配多个实例

创建计算字段

计算字段

字段(field)

基本上与列(column)的意思相同,经常互换使

用,不过数据库列一般称为列,而术语字段通常用在计算字段的

连接上。

拼接字段 Concat( )

SELECT Concat(vend_name,'(',vend_country,')')
FROM vendors
ORDER BY vend_name;

image-20230809023802831

Concat()

拼接串,即把多个串连接起来形成一个较长的串。

Concat() 需要一个或多个指定的串,各个串之间用逗号分隔。

Concat(vend_name,'(',vend_country,')')

上面的SELECT语句连接以下4个元素:

 存储在vend_name列中的名字;

 包含一个空格和一个左圆括号的串;

 存储在vend_country列中的国家;

 包含一个右圆括号的串。

删除数据右侧多余的空格 RTrim()

SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')')
FROM vendors
ORDER BY vend_name;

RTrim()函数去掉值右边的所有空格。通过使用RTrim(),各个列都进行了整理。

使用别名

SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')') AS
vend_title
FROM vendors
ORDER BY vend_name;

image-20230809024235635

列名为的你的别名,所设置的别名是拼接的名字

别名常见的用途在遇到不符合规定的字符(如 空格)时重新命名它

因为在原来的名字容易弄混导致出错

执行算术计算

SELECT
	prod_id,
	quantity,
	item_price,
	quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;

image-20230809024914982


mysql
SELECT Concat(RTrim(vend_name),‘(’,RTrim(vend_country),‘)’)
FROM vendors
ORDER BY vend_name;


> RTrim()函数去掉值右边的所有空格。通过使用RTrim(),各个列都进行了整理。

## 使用别名

```mysql
SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')') AS
vend_title
FROM vendors
ORDER BY vend_name;

[外链图片转存中…(img-aw0a0kzP-1691522077811)]

列名为的你的别名,所设置的别名是拼接的名字

别名常见的用途在遇到不符合规定的字符(如 空格)时重新命名它

因为在原来的名字容易弄混导致出错

执行算术计算

SELECT
	prod_id,
	quantity,
	item_price,
	quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;

[外链图片转存中…(img-6vnWueQ3-1691522077811)]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值