选择数据(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子句操作符

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;

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;

列名为的你的别名,所设置的别名是拼接的名字
别名常见的用途在遇到不符合规定的字符(如 空格)时重新命名它
因为在原来的名字容易弄混导致出错
执行算术计算
SELECT
prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;

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)]

875

被折叠的 条评论
为什么被折叠?



