0%

MYSQL常用命令集合

[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);