[toc]
SHOW命令
显示当前所有的可用数据库
SHOW DATABASE;
显示当前数据库内可用表
SHOW TABLES ;
显示某个表中的所有属性信息
SHOW COLUMNS FORM 表名
SHOW STATUS 显示广泛的服务器状态
SHOW CREATE DATABASE/TABLE 显示创建库或表的SQL语句是啥
SHOW GRANTS 显示授权用户
SHOW ERRORS SHOW WARNINGS 显示服务器错误或警告消息
检索命令
检索单个列
SELECT prod_name
FROM products
检索多个列
SELECT id,name,price
FROM products
检索所有列
SELECT *
FROM products
检索出不重复的行
SELECT DISTINCT id
FROM products
返回某些行
SELECT name
FROM products
LIMIT begin,len //即开始行,和行数
注意: 行从0开始, 故LIMIT1,返回的是第二行
排序命令
按单列排序
SELECT name,age
FROM products
ORDER BY age
找出年龄最小的? 加个LIMIT 1即可
按多个列排序
先按price排,再按name排
SELECT id,price,name
FROM products
ORDER BY price, name
降序排序
按price降序排,再按name升序排
SELECT id,price,name
FROM products
ORDER BY price DEC, name
条件查询
找出price=2的人
SELECT name, price
FROM products
WHERE price = 2
注意: ORDER BY 排序语句应该放在WHERE的后面
SQL做where字符匹配时,不区分大小写。
不匹配检查: 给出id不是1003的人制造的产品
SELECT id,name
FROM products
WHERE id <> 1003; //或者 id != 1003
范围值检查:
SELECT name,price
FROM products
WHERE price BETWEEN 5 AND 10
空值检查
WHERE price IS NULL
多个过滤条件(AND是且, OR是或)
WHERE id=1003 AND price <10 AND age < 18
AND和OR的组合
WHERE id=1002 OR id=1003 AND price>10
根据SQL的规则, AND优先于OR,变成了
WHERE id=1002 OR (id=1003 AND price>10)
所以最好在OR和AND组合时,加上括号
WHERE (id=1002 OR id=1003) AND price>10
取特定值,即id=1002、1003、1004的值皆可
WHERE id IN (1002,1003,1004)
否定条件 NOT 条件, 则取不满足这个条件的行
WHERE id NOT IN (1002,1003,1004)
通配符
配合字符串匹配和LIKE使用
百分号通配符,查找以jet开头的任何名字
WHERE name LIKE ‘jet%’
包含有anvil的名字
WHERE name LIKE ‘%anvil%’
查找以s起头,e结尾的所有名字
WHERE name LIKE ‘s%e’
下划线通配符, 该符号只能代表1个任意字符
不能匹配0个字符,即该处必须有1个字符
WHERE name LIKE ‘_ton anvil’
使用通配符的注意事项
1.不要过度使用通配符
2.不要把通配符用在搜索模式的开始处
3.注意通配符的位置
正则表达式,伴随着REGEXP使用
LIKE匹配的是整个串,REGEXP只要出现了类似的即可,即有子串即可
例如LIKE ‘abc’ ,只能返回abc。
REGEXP ‘abc’, 则可以返回 abcd
.可以匹配任意一个字符
WHERE name REGEXP ‘.000’
搜索2个串, |类似于或OR
WHERE name REGEXP ‘1000|2000’
注意: ‘1|2|3 Ton’ 指代的是1或2或3 Ton, 故不要连续用|后又跟字符,而应该用[]
匹配几个字符中的一个即可
WHERE name REGEXP ‘[123] TON’
则可返回 1 Ton 和 2 Ton
匹配1-9加a-z
WHERE name REGEXP ‘[1-9] [a-z]’
匹配 正则符号模样的特殊字符
用\作为前导
WHERE name REGEXP ‘\.’
则找到匹配.的, 此时.不代表任意字符
匹配某个字符的0个或1个
WHERE name REGEXP ‘sticks?’
则可匹配stick或者sticks
指定匹配数目 {n}
不少于指定数目的匹配 {n,}
匹配n到m数目的匹配 {n,m}
WHERE name REGEXP ‘[[:digit:]]{4}’
则匹配4个任意数字
^定位为文本的开始,$定位为文本的结束
注意: ^有另外一个用途,可以用来否定集合[]
特殊UDF
在SQL中测试自己写的正则表达式对不对
SELECT ‘hello’ REGEXP ‘abc’
若正确,则返回1,否则返回0。 显然这个例子返回0
计算字段
SELECT Concat(name, ‘(’ , country, ‘)’ )
则返回的行里的每个值为
LSX(CHINA)
CRISTINA(USA)
RTrim(name)可以删除name中多余的右边空格,常可以用在拼接中
给计算字段取别名
SELECT Concat(name, ‘(’ , country, ‘)’ ) AS newtitle
则列名叫newtitle
执行算数计算
SELECT id, num, price, num*price AS sumProfit
则多返回一个列,叫做总利润
测试拼接字段
SELECT 3*2+5, 则返回11
SELECT Now(), 则返回数据库的当前时间
数据处理函数
Select name, Upper(name) AS upcase_name 都转为大写
分组+聚合
返回价格的平均值
SELECT AVG(price) AS avg_price
FROM products
WHERE id = 1003
计算的数量,包括NULL
SELECT COUNT(*) AS num_cust
计算num的数量,不包括NULL
SELECT COUTN(num) AS num_cust
还有MAX,MIN,SUM
指定不同元素的统计
SELECT AVG(DISTINCT price) AS avg_price
分出5个id,计算各id对应产品的数量
SELECT id, COUNT(*) AS id_num
FROM products
GROUP BY id
1.除了聚集计算语句外, SELECT中出现的每个列都必须出现在GROUP BY中
2.GROUP BY 必须出在 ORDER BY 之前
过滤分组
SELECT id, COUNT() AD orders
FROM orders
GROUP BY id
HAVING COUNT() >= 2
列出具有2个以上价格为10的产品
SELECT id, COUNT() AS num
FROM products
WHERE price >= 10
GROUP BY id
HAVING COUNT() >=2
顺序:先WHERE过滤, 在COUNT过滤
语句使用顺序
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
子查询
找出订购了物品TNT2的所有客户id
SELECT cus_id
FROM orders
WHERE sail_id IN (SELECT sail_id
FROM orderitem
WHERE prod_id = ‘TNT2’)
即先从产品表中,找到产品id为INT2的所有订单
再从订单表中,找到订单id匹配的所有客户。
检索出上述客户id的所有信息
SELECT cus_name, cus_age
FROM customer
WHERE cus_id IN (SELECT cus_id
FROM orders
WHERE sail_id IN (SELECT sail_id
FROM orderitem
WHERE prod_id = ‘TNT2’))
显示每个客户的订单总数
SELECT name, state, (SELECT COUNT(*)
FROM orders
WHERE orders.cus_id = cus.cus_id ) AS orders
FROM customers
ORDER BY name
对于customer中的每一个客户id, 都从订单表中进行检索,找出每个id的订单数量。
DDL
创建表:
CREATE TABLE 表名
(
列名 数据类型 列属性
……
PRIMARY KEY (主键列1,主键列2……)
)ENGINE=InnoDB
添加列:
ALTER TABLE 表名
ADD 列名 数据类型
删除列:
ALTER TABLE 表名
DROP COLUMN 列名
删除表:
DROP TABLE 表名
重命名表:
RENAME TABLE 旧表名 TO 新表名
插入行:
INSERT INTO 表名(
列名1
列名2
……
)
VALUES(
数据1
数据2
……
),
(
数据3
数据4
);
这样就插入了2行
更新数据:
UPDATE 表名
SET 列名1=数据1
列名2=数据2
WHERE 查询条件
删除数据:
DELETE FROM 表名
WHERE 查询条件
表中删除主键为:
alert table table_test drop primary key;
表中增加主键为:
alert table table_test add primary key(id);