SQL(Structured Query Language)结构化查询语言
主键(Primary Key): 一列或一组列,其值能够唯一区分表中的每个行.
主键的好习惯:
不更新主键列中的值;
补充用主键列中的值
不在主键列中使用可能会更改的值
数据库和表:
关键字:
-
SHOW
USE crashcourse; SHOW DATABASES; SHOW TABLES; SHOW COLUMNS FROM customers; 等于 DESCRIBE customers; DESCRIBE: 作为SHOW COLUMNS FROM的快捷方式 SHOW STATUS;
-
SELECT 检索数据:
搭配关键字: DISTINCT LIMIT
SELECT prod_id, prod_name, prod_price FROM products; 列名之间用逗号: SELECT * FROM products; 检索所有列 DISTINCT关键字: 返回唯一的值 用于检索不同的行 SELECT DISTINCT vend_id FROM products; LIMIT: 限制匹配的行 SELECT prod_name FROM products LIMIT 5; SELECT prod_name FROM products LIMIT 5,5; 从第5行开始的5行 使用完全限定的表名:
-
排序检索数据
ORDER BY字句
默认升序(ASC), DESC降序.SELECT prod_name FROM products ORDER BY prod_name; SELECT prod_name, prod_price, prod_id --> FROM products ORDER BY prod_price, prod_name; 多列排序 DESC降序 SELECT prod_name, prod_price, prod_id -->FROM products ORDER BY prod_price DESC, prod_name; 降序 搭配LIMIT(注意字句的次序): SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
-
过滤数据
SELECT语句中的WHERE子句
WHERE 字句操作符(= , != , < , <=, >, >= , BETWEEN, <>不等于)
匹配时候默认不区分大小写SELECT prod_name, prod_price --> FROM products WHERE prod_price = 2.50 结合ORDER BY 字句,需要在WHERE之后,不然会报错 SELECT id, name FROM security_groups --> WHERE name = 'default' ORDER BY id; 操作符示例: SELECT prod_name, prod_price, prod_id -->FROM products WHERE prod_price < 10; 列出不是由 供应商1003制作的所有产品 SELECT prod_name, prod_price, vind_id -->FROM products WHERE vind_id <> 1003; SELECT prod_name, prod_price, vind_id -->FROM products WHERE vind_id != 1003; 开始值和结束值之间用AND连接 SELECT prod_name, prod_price, prod_id -->FROM products WHERE prod_price BETWEEN 5 AND 10; 空值检查: SELECT prod_name FROM products WHERE prod_price IS NULL;
-
高级过滤:
AND, OR, NOT, IN 操作符AND: SELECT prod_name, prod_price, prod_id -->FROM products WHERE prod_id = 100 AND prod_price < 10; OR: SELECT prod_name, prod_price, prod_id -->FROM products WHERE prod_price = 25 OR prod_price = 28; 结合(假如不用括号会先处理AND): SELECT prod_name, prod_price, prod_id -->FROM products WHERE (prod_price = 25 OR prod_price = 28) AND vend_id = 1003; IN(功能与OR相似,但是比OR简短易懂): SELECT prod_name, prod_price, prod_id -->FROM products WHERE vend_id IN (1002, 1003) ORDER BY prod_name; NOT(否定跟在后面的任何条件): 匹配1002和1003之外的供应商 SELECT prod_name, prod_price, prod_id -->FROM products WHERE vend_id NOT IN (1002, 1003) ORDER BY prod_name;
-
使用通配符进行过滤:
LIKE操作符,在搜索字句中使用通配符,必须使用LIKE操作符%通配符:表示任何字符出现任意次数 SELECT prod_name, prod_price, prod_id -->FROM products WHERE prod_name LIKE 'jet%' ; 找出jet起头的产品 SELECT prod_name, prod_price, prod_id -->FROM products WHERE prod_name LIKE '%jet%' ; 任何位置包含jet的产品 SELECT prod_name, prod_price, prod_id -->FROM products WHERE prod_name LIKE 'j%t' ; 找出j起头,t结尾的产品 下划线(_) 通配符: 用途和%一样,但是匹配单个字符(有且仅匹配一个字符) SELECT prod_name, prod_price, prod_id -->FROM products WHERE prod_name LIKE '_ ton anvil' Note: 2 ton anvil能匹配上,但是.5 ton anvil匹配不了
-
用正则表达式进行搜索
正则表达式对SELECT检索出来的内容进行过滤
关键字: REGEXP, BINARY
REGEXP:
SELECT prod_name FROM products
--> WHERE prod_name REGEXP '1000' ORDER BY prod_name; 检索prod_name列包含文本1000的所有行
正则表达式中的(.),表示匹配任意一个字符
SELECT prod_name FROM products
--> WHERE prod_name REGEXP '.000' ORDER BY prod_name; 检索prod_name列包含文本x000的所有行
BINARY 区分大小写:
WHERE prod_name REGEXP BINARY 'JetPack .000'
进行OR匹配(|):
SELECT prod_name FROM products
--> WHERE prod_name REGEXP '1000 | 2000 | 3000' ORDER BY prod_name;
匹配几个字符之一[]:
SELECT prod_name FROM products
--> WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name; 匹配1 ton和2 ton等
匹配除这几个字符外[^]
SELECT prod_name FROM products
--> WHERE prod_name REGEXP '[^123] Ton' ORDER BY prod_name;
匹配范围[-]:
SELECT prod_name FROM products
--> WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;
匹配特殊字符(\\)
SELECT prod_name FROM products
--> WHERE prod_name REGEXP '\\.' ORDER BY prod_name; 包含.的产品名字
Note: 匹配\需要写成\\\
\\也用来引入元字符:
\\f 换页 \\n 换行 \\r 回车 \\t 制表 \\v 纵向制表
匹配字符类:
[: alnum:] 任何字母和数字
[:alpha:] 任何字符
[:blank:] 任何空格和制表 同[\\t]
[:digit:] 任何数字
[:lower:] 任何小写
[:upper:] 任何大写
[:space:] 包括空格在内的任意空白字符
匹配多次:
* 0个或多个匹配
+ 等同于 {1,}
? 0个或1个{0,1}
{n} 指定数目匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围
SELECT prod_name FROM products
--> WHERE prod_name REGEXP '\\([0-9] sticks?\\)'; 其中sticks?匹配stick和sticks
SELECT prod_name FROM products
--> WHERE prod_name REGEXP '[[:digit:]]{4}'; 4位数的
定位符:
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾
SELECT prod_name FROM products
--> WHERE prod_name REGEXP '^[0-9\\.]'; 以一个数包括.开头的产品名