基础知识
使用MySQL基本指令
- use database1; 切换数据库
- SHOW DATABASES; 显示所有数据库
- SHOW TABLES;
- SHOW COLUMNS FROM customers ; === DESCRIBE CUSTOMERS;
limit关键字:
- Limit 3,4 ==LIMIT 4 OFFSET 3; 从行3开始,返回4行;检索出来的第一行是行0
ORDER BY
- 通常ORDER BY子句中使用的列将是为显示所选择的列。但是,实际上并不一定,用非检索的列排序数据是完全合法的。
- 默认是升序
- 对于文本性的数据进行排序时,A被视为与a相同,这是MySQL(和大多数数据库管理系统)的默认行为。但是,许多数据库管理员能够在需要时改变这种行为。
使用IN操作的优点
- 语法更清楚且直观
- 一般比OR操作符清单执行更快
- 最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。
MySQL中NOT
- 支持对IN、BETWEEN和EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件取反有很大的差别。
SQL中的谓词
谓词与函数的区别:对于通常的函数来说,返回值有可能是数字、字符串或者日期等,但是谓词的返回值都是真值(true/false/unknown)。
LIKE、BETWEEN、IS NULL、IS NOT NULL、IN、EXISTS
LIKE——字符串的部分一致查询(模糊查询)
1
2
3
4
5
6
7①前方一致select * from user where username like 'aaa%';
②中间一致select * from user where username like '%aaa%';
③后方一致select * from user where username like '%aaa';
%可以匹配0个字符。BETWEEN(and)——范围查询
用通配符的技巧
- 不要过度使用通配符,注意通配符的位置。
MySQL的正则表达式
REGEXP和LIKE的区别:LIKE匹配整个串而REGEXP匹配子串
不区分大小写,为区分大小写,可使用BINARY关键字
1
WHERE prod_name REGEXP BINARY 'JetPack .000'
进行OR匹配 ‘|’
匹配几个字符之一 [123] 表示匹配1或2或3,与1|2|3不同,前者是[1|2|3]的缩写
1
2
3
4SELECT prod_name
From products
WHERE prod_name REGEXP '[123] Ton'
ORDER BY prod_name;匹配范围 [1-3]
1
2
3
4SELECT prod_name
From products
WHERE prod_name REGEXP '[1-3] Ton'
ORDER BY prod_name;匹配特殊字符,如 . [] | () ,用\\为前导,如\\.表示查找. \\也用来引用元字符
匹配字符类
匹配多个实例
创建计算字段
拼接:
多数DBMS使用+或者||来实现拼接,MySQL则使用Concat()函数来实现。
1
2
3
4
5Select Concat(vend_name,'(',vend_country,')')
From vendors
ORDER BY vend_name;
Return: ACME(USA)RTrim()函数: 删除数据右侧多余的空格。如RTrim(vend_name)
LTrim()函数:去掉串左边的空格
Trim()函数:去掉串左右两边的空格
取列的别名
使用数据处理函数
- 以下的函数都是大多数SQL实现支持的。
文本处理函数:
- 其中SOUNDEX()考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。
日期和时间处理函数
- MySQL使用的日期格式,不管是插入或更新表值还是用WHERE子句进行过滤,日期必须为格式yyyy-mm-dd。
数值处理函数
在主要DBMS的函数中,数值函数是最一致最统一的函数
汇总数据
聚集函数
- Distinct关键字:后面必须使用列名。
分组数据
使用WITH ROLLUP关键字,可以得到每个分组以及每个分组汇总级别(针对每个分组)的值
1
2
3SELECT vend_id,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id WITH ROLLUP;WHERE过滤行,HAVING过滤分组
联结表
笛卡尔积:由没有联结条件的表关系返回的结果
内部联结,也称为等值联结
ANSI SQL规范首选INNER JOIN语法,而不是=
1
2
3SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
乱七八糟
- 没有主键,更新或删除表中的特定行很困难,因为没有安全的方法保证只涉及相关的行。
- MySQL在执行匹配时默认不区分大小写。根据MySQL的配置方式,搜索可以是区分大小写的。
- 可移植的:能运行在多个系统上的代码
- 可伸缩性:能够适应不断增加的工作量而不失败。