查看数据库
SHOW DATABASES;
使用数据库
USE DATABASESNAME;
#和\q一样,USE命令最后可以不跟分号
查看数据库中的表单
SHOW TABLES;
显示表列
SHOW COLUMNS FROM 表列名;
显示表列快捷方式
DEXCRIBE 表列名;
SHOW显示表列
SHOW COLUMNS FROM 表列名;
显示广泛的服务器状态信息
SHOW STATUS;
显示创建特定数据库或表的MySQL语句
SHOW CREATE DATABASE;
SHOW CREATE TABLE;
显示授予用户(所有用户或特定用户)的安全权限
SHOW GRANTS;
显示服务器错误或警告消息
SHOW ERRORS;
SHOW WARNINGS;
show命令
1. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称。
2. show databases; -- 显示mysql中所有数据库的名称。
3. show columns from table_name from database_name; 或show columns from database_name.table_name; -- 显示表中列名称。
4. show grants for user_name; -- 显示一个用户的权限,显示结果类似于grant 命令。
5. show index from table_name; -- 显示表的索引。
6. show status; -- 显示一些系统特定资源的信息,例如,正在运行的线程数量。
7. show variables; -- 显示系统变量的名称和值。
8. show processlist; -- 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。
9. show table status; -- 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间。
10. show privileges; -- 显示服务器所支持的不同权限。
11. show create database database_name; -- 显示create database 语句是否能够创建指定的数据库。
12. show create table table_name; -- 显示create database 语句是否能够创建指定的数据库。
13. show engines; -- 显示安装以后可用的存储引擎和默认引擎。
14. show innodb status; -- 显示innoDB存储引擎的状态。
15. show logs; -- 显示BDB存储引擎的日志。
16. show warnings; -- 显示最后一个执行的语句所产生的错误、警告和通知。
17. show errors; -- 只显示最后一个执行语句所产生的错误。
18. show [storage] engines; --显示安装后的可用存储引擎和默认引擎。
检索数据SELECT语句
检索单个列
SELECT 列名 FROM 表名;
检索多个列
SELECT 列名1,列名2,...列名N FROM 表名;
检索所有列
SELECT * FROM 表名;
检索不同行
SELECT DISTINCT 列名 FROM 表名;
#返回列中所有不重复的值
#不能部分使用DISTINCT,应用于所有列
SELECT DISTINCT 列名1, 列名2...列名N FROM 表名
#所有列都会被检索
限制结果
SELECT 列名 FROM 表名 LIMIT 5;
#返回不多于5行
#指定检索开始行和结束行
SELECT 列名 FROM 表名 LIMIT 开始行, 要检索的行数;
#检索第一行为0,不是1
#行数不够的时候,只返回它有的那么多行
使用OFFSE替代LIMIT语法
SELECT 列名 FROM 表名 LIMIT 要检索的行数 OFFSET 开始行;
#注意,这里开始行和要检索的行数位置不同
使用完全限定的表名
SELECT products.prod_name FROM products;
表名也可以完全限定
SELECT products.prod_name FROM crashcourse.products;
排序搜索数据
排序数据
SELECT 列名 FROM 表名 ORDER BY 排序列名;
排列多个序
SELECT 列名 FROM 表名 ORDER BY 排序列名1,排序列名2...;
#先进行列名1排序,再进行列名2排序...
指定排序方向
SELECT 列名 FROM 表名 ORDER BY 排序列名1 DESC;
#以降序排列
SELECT 列名 FROM 表名 ORDER BY 排序列名1 DESC, 排序列名2;
#只会对列名1进行降序
#与DESC相反的是ASC,以升序排序,系统默认是升序的。
通过ORDER BY 和LIMIT 找出列中价值最高的
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
#得到价值最高的
注意:ORDER BY 必须在LIMIT之前,FROM之后
过滤数据
SELECT 列名1,列名2 FROM 表名 WHERE 条件;
SELECT prod_name,prod_price FROM products WHERE prod_price = 2.50;
WHERE子句在ORDER BY之前
WHERE子句操作符
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 在指定两个值之间
检查单个值
SELECT prod_name.prod_price FROM products WHERE prod_name = 'fises';
SELECT prod_name.prod_price FROM products WHERE prod_price < 10;
不匹配检查
SELECT vend_id,prod_name FROM products WHERE vend_id <> 1003;
等于
SELECT vend_id,prod_name FROM products WHERE vend_id != 1003;
范围值检查
SELECT prod_name.prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
空值检查
SELECT prod_name FROM products WHERE prod_price IS NULL;
数据过滤
#AND操作符
SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id = 1002 AND prod)price <= 10;
#OR操作符
SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id = 1002 OR prod_price <= 10;
注意:AND操作符的优先级比OR的高,所以如果需要可以对优先级高的部分括号括起来
SELECT prod_id,prod_price,prod_name FROM products WHERE (vend_id = 1003 OR vend_id = 1002) OR prod_price <= 10;
IN操作符
#输出1002和1003的所有数据
SELECT prod_name,prod_price FROM products WHERE vend_id IN (1002, 1003) ORDER BY prod_name;
#IN操作符比OR操作符清单执行更快
#IN操作符可以包含其他SELECT语句
NOT操作符
SELECT prod_name, prod_price FROM products WHERE vend_id NOT IN(1002, 1003) ORDER BY prod_name;
#只支持对IN, BETWEEN, EXISTS子句取反
用通配符进行过滤
#LIKE操作符
#百分号通配符
#搜索jet开头的任意字符,百分号代表给定位置0个,一个或多个字符
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE 'JET%';
#下划线通配符
#表示给定位置一个字符
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '_TON ANVIL';
正则表达式
#REGEXP后面跟的作为正则表达式
SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
#输出所有最后跟000的数据
SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;
LIKE和REGEXP之间的差别:LIKE搜索的是整个列,如果被匹配的文本在列值中出现,LIKE将不会找到它。REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它
匹配不区分大小写,如果要区分大小写,用BINARY关键字
WHERE prod_name REGEXP BINARY '...';
进行OR匹配
#匹配两个串之一
SELECT prod_name FROM products WHERE prod_name REGEXP '1000 | 2000' ORDER BY prod_name;
#WHERE prod_name REGEXP '1000 | 2000 | 3000 | ...'
匹配多个字符之一
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Tom' ORDER BY prod_name;
字符集也可以被否定
SELECT prod_name FROM products WHERE prod_name REGEXP '[^123] Tom' ORDER BY prod_name;
匹配范围
[1-9]代表1,2,3,4,5,6,7,8,9
[a-z]代表abcdefghijklmnopqrstuvwsyz
匹配特殊字符
#匹配有点号的数据,但实际会返回所有数据
SELECT prod_name FROM products WHERE prod_name REGEXP '.' ORDER BY prod_name;
#这个实际需要前导\\
SELECT prod_name FROM products WHERE prod_name REGEXP '\\.' ORDER BY prod_name;
\f 换页
\n 换行
\r 回车
\t 制表
\v 纵向制表
格式:[:字符类名:]
字符类名:
alnum 文字数字字符
alpha 文字字符
blank 空白字符
cntrl 控制字符
digit 数字字符
graph 图形字符
lower 小写文字字符
print 图形或空格字符
punct 标点字符
space 空格、制表符、新行、和回车
upper 大写文字字符
xdigit 十六进制数字字符
匹配多个实例
* 0个或多个匹配
+ 1个或多个匹配
? 0个或1个匹配
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目范围(m小于255)
SELECT prdo_name FROM products WHERE prod_name REGEXP '\\([0-9] STICKS?\\)' ORDER BY prod_name;
SELECT prod_name FROM products REGEXP '[[:digit:]]{4}'
定位符
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾
SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\\.]' order by prod_name;
创建计算字段
拼接字段
#使用Cancat()函数拼接
SELECT Concat(vend_name, '(', wend)country,')') FROM products ORDER BY vend_name;
使用RTrim()函数来删除数据右侧多余空格
#使用Cancat()函数拼接
SELECT Concat(RTrim(vend_name, '(', wend)country,')')) FROM products ORDER BY vend_name;
使用别名
SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country), ')') AS vend_title FROM vendors ORBER BY vend_name;
执行算术计算
SELECT id, qu, item, id * qu * item AS iqi FROM products WHERE num = 20005;
使用函数
数学函数
ABS(x) 返回x的绝对值
SELECT ABS(-1) -- 返回1
CEIL(x),CEILING(x) 返回大于或等于x的最小整数
SELECT CEIL(1.5) -- 返回2
FLOOR(x) 返回小于或等于x的最大整数
SELECT FLOOR(1.5) -- 返回1
RAND() 返回0->1的随机数
SELECT RAND() --0.93099315644334
RAND(x) 返回0->1的随机数,x值相同时返回的随机数相同
SELECT RAND(2) --1.5865798029924
SIGN(x) 返回x的符号,x是负数、0、正数分别返回-1、0和1
SELECT SIGN(-10) -- (-1)
PI() 返回圆周率(3.141593)
SELECT PI() --3.141593
TRUNCATE(x,y) 返回数值x保留到小数点后y位的值(与ROUND最大的区别是不会进行四舍五入)
SELECT TRUNCATE(1.23456,3) -- 1.234
ROUND(x) 返回离x最近的整数
SELECT ROUND(1.23456) --1
ROUND(x,y) 保留x小数点后y位的值,但截断时要进行四舍五入
SELECT ROUND(1.23456,3) -- 1.235
POW(x,y).POWER(x,y) 返回x的y次方
SELECT POW(2,3) -- 8
SQRT(x) 返回x的平方根
SELECT SQRT(25) -- 5
EXP(x) 返回e的x次方
SELECT EXP(3) -- 20.085536923188
MOD(x,y) 返回x除以y以后的余数
SELECT MOD(5,2) -- 1
LOG(x) 返回自然对数(以e为底的对数)
SELECT LOG(20.085536923188) -- 3
LOG10(x) 返回以10为底的对数
SELECT LOG10(100) -- 2
RADIANS(x) 将角度转换为弧度
SELECT RADIANS(180) -- 3.1415926535898
DEGREES(x) 将弧度转换为角度
SELECT DEGREES(3.1415926535898) -- 180
SIN(x) 求正弦值(参数是弧度)
SELECT SIN(RADIANS(30)) -- 0.5
ASIN(x) 求反正弦值(参数是弧度)
COS(x) 求余弦值(参数是弧度)
ACOS(x) 求反余弦值(参数是弧度)
TAN(x) 求正切值(参数是弧度)
ATAN(x) ATAN2(x) 求反正切值(参数是弧度)
COT(x) 求余切值(参数是弧度)
字符串函数
Left() 返回串左边的字符
Length() 返回串的长度
Locate() 找出串的一个子串
Lower() 将串转换为小写
LTrim() 去掉左边的空格
Right() 返回串右边的字符
RTrim() 去掉右边的空格
Soundex() 返回串的SOUNDEX值
SubString() 返回子串的字符
Upper() 将串转换为大写
日期和时间函数
CURDATE()或CURRENT_DATE() 返回当前的日期
CURTIME()或CURRENT_TIME() 返回当前的时间
DATE_ADD(date,INTERVAL int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:> > SELECTDATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);
DATE_FORMAT(date,fmt) 依照指定的fmt格式格式化日期date值
DATE_SUB(date,INTERVAL int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:> > SELECTDATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);
DAYOFWEEK(date) 返回date所代表的一星期中的第几天(1~7)
DAYOFMONTH(date) 返回date是一个月的第几天(1~31)
DAYOFYEAR(date) 返回date是一年的第几天(1~366)
DAYNAME(date) 返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
FROM_UNIXTIME(ts,fmt) 根据指定的fmt格式,格式化UNIX时间戳ts
HOUR(time) 返回time的小时值(0~23)
MINUTE(time) 返回time的分钟值(0~59)
MONTH(date) 返回date的月份值(1~12)
MONTHNAME(date) 返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
NOW() 返回当前的日期和时间
QUARTER(date) 返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
WEEK(date) 返回日期date为一年中第几周(0~53)
YEAR(date) 返回日期date的年份(1000~9999)
SELECT cust_id,order_num FROM ordre_num WHERE Date(order date) = '2005 - 1 - 2';
聚合函数
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的个数
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果
对以上聚合函数对执行行计算,指定ALL参数或不给参数(ALL是默认行为,只包含不同的值,指定DISTINCT参数,如果不指定,则假定为ALL)
SELECT AVG(DISTINCT prod_price) AS AVG_PRICE FROM products WHERE vend_id = 1003;
#如果指定列名,则DISTINCT只能用于COUNT(),不能用于COUNT(*),因此不允许使用COUNT(DISTINCT),DISTINCT必须使用列名,不能用于计算或表达式
分组数据
创建分组
#使用GROUP BY子句中建立
SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id;
过滤分组
SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id HAVING count(*) >= 2;
FROM 子句, 组装来自不同数据源的数据
WHERE 子句, 基于指定的条件对记录进行筛选
GROUP BY 子句, 将数据划分为多个分组
使用聚合函数进行计算
使用 HAVING 子句筛选分组
计算所有的表达式
使用 ORDER BY 对结果集进行排序
LIMIT
外键
外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
创建联结
SELECT vend_name,prod_name,prod_price FROM vendors,products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name,prod_name;
内部联结
SELECT vend_name,prod_name,prod_price FROM vendor INNER JOIN products ON vendors.vend_id = products.vend_id;
联结多个表
SELECT prod_name,vend_name,prod_price,quantity FROM orderitems, products, vendors WHERE products.vend_id = vendors.vend_id AND orderitems.prod_id = products.prod_id AND order_num = 20005;
使用AS关键字可以给表起别名
创建组合查询
#使用UNION操作符来组合数条SQL查询
SELECT vend_id,prod_id,prod)price FROM products WHERE prod_price <= 5
UNION
SELECT SELECT vend_id,prod_id,prod)price FROM products WHERE prod_id IN (1002, 1003);
#每个查询必须具有相同的列、表达式或聚集函数,不过各个列不需要以相同的次序列出
#UNION操作符会自动去除重复的行,所以使用UNION ALL取消这种默认
SELECT vend_id,prod_id,prod)price FROM products WHERE prod_price <= 5
UNION ALL
SELECT SELECT vend_id,prod_id,prod)price FROM products WHERE prod_id IN (1002, 1003);
对查询结果进行排序
SELECT vend_id,prod_id,prod)price FROM products WHERE prod_price <= 5
UNION
SELECT SELECT vend_id,prod_id,prod)price FROM products WHERE prod_id IN (1002, 1003);
ORDER BY
vend_id,prod_price;
全文本搜索
创建支持全文本搜索的表
CREATE TABLE product_notes
(
note_id int NOT NULL AUTO_INCREMENT,
note_date datetime NOT NULL,
note_text text NULL,
PRIMARY KEY(note_id),
FULLTEXT(note_text)
) ENGINE=MyISAM;
#ENGINE=MyISAM表示支持全文本搜索
进行全文本搜索
#假设product_notes表中已经有了数据,现在我们来使用全文本查询:
SELECT note_text FROM product_notes WHERE Match(note_text) Against(‘rabbit’);
#这条语句检索出note_text字段包含rabbit的行。类似于:
SELECT note_text FROM product_notes WHERE note_text like ‘%rabbit%’;
#两者的区别在于使用like查询仅仅只返回包含‘rabbit’的行,而使用全文本会按’rabbit’在文本中出现的顺序排序
查询扩展
SELECT note_text FROM product_notes WHERE Match(note_text) Against('rabbit' WITH QUERY EXPANSION);
布尔文本搜索
布尔操作符 描述
+ 包含指定值
- 排除指定值
> 包含指定值,并且增加优先级值
< 包含指定值,并且减少优先级值
() 把词组成表达式
~ 取消一个词的排序值
* 词尾的通配符
“” 定义一个短语
SELECT note_text FROM product_notes WHERE Match(note_text) Against('+rabbit +fat' IN BOOLEAN MODE);
#返回的行必须同时包含关键字 rabbit 和 fat
SELECT note_text FROM product_notes WHERE Match(note_text) Against('rabbit -fat' IN BOOLEAN MODE);
#没有指定操作符,搜索包含rabbit或good的行(其中的一个或两个)
SELECT note_text FROM product_notes WHERE Match(note_text) Against('"fat rabbit"' IN BOOLEAN MODE);
插入数据
使用关键字INSERT用来插入数据库表
INSSERT INTO Customers VALUES(...);
INSERT更安全的方式
INSSERT INTO Customers(...列名...) VALUES(...列值...);
插入多个列
INSSERT INTO
Customers(...列名...)
VALUES(...列值...);
INSSERT INTO
Customers(...列名...)
VALUES(...列值...);
#或者
INSSERT INTO
Customers(...列名...)
VALUES(...列值...),
VALUES(...列值...);
#这里插入顺序必须一致
插入检索出来的数据
INSERT INTO customers(...)
SELECT ...
FROM 表名;
更新或删除数据
#UPDATE以WHERE结尾,告诉更新哪一行
UPDATE custerom SET cust_email = '..' WHERE cust_id = 10005;
更新失败取消任务
#使用IGNORE关键字
UPDATE IGNORE custerom SET cust_email = '..' WHERE cust_id = 10005;
删除某个列的值
#删除某个列的值设置为NULl就可以
UPDATE custerom SET cust_email = NULL WHERE cust_id = 10005;
删除数据
DELETE FROM custerm WHERE cust_id = 10006;
#DELETE删除的是整行,不是整列
创建表
CREATE TABLE customers(
cust_id int NOT NULL,
...
) ENGINE=InnoDB
创建主键
PRIMARY KEY (vend_id)
#主键可以有多个值
CREATE TABLE customers(
cust_id int NOT NULL,
PRIMARY KEY (vend_id)
...
) ENGINE=InnoDB
AUTO_INCREMENT
#AUTO_INCREMEN代表MySQL会对其自动增量,,每个表只允许一个AUTO_INCREMENT列,必须被索引,一般被用于主键
CREATE TABLE customers(
cust_id int NOT NULL AUTO_INCREMENT,
PRIMARY KEY (vend_id)
...
) ENGINE=InnoDB
指定默认值
#DEFAULT指定默认值
CREATE TABLE customers(
cust_id int NOT NULL DEFAULT 1,
PRIMARY KEY (vend_id)
...
) ENGINE=InnoDB
更新表
#使用ALTER TABLE语句
ALTER TABLE 表名 ADD 列名 类型;
ALTER TABLE vendors ADD vend_phone CHAR(20);
删除列
ALTER TABLE vendors DROP COLUMN vend_phone;
删除表
DROP TABLE custers2;
重命名表
#RENAME TABLE 新名 TO 旧名;
RENAME TABLE custerom2 TO custerms;
对多个表进行重命名
RENAME TABLE custerom2 TO custerms,
custerom2 TO custerms
custerom2 TO custerms
custerom2 TO custerms;
创建视图
#CREATE VIEW关键字用来创建视图
CREATE VIEW 视图名 AS SELECT语句;
SELECT 列名 FROM 视图名 WHERE ..;
用视图格式化结果
CREATE VIEW 视图名 AS SELECT Concat(...) FROM...ORDER BY...;
使用视图过滤不想要的数据
SELECT 列名 FROM 视图名 WHERE 条件语句;
使用视图与计算字段
CREATE VIEW 视图名 AS SELECT A, B, C, A + B = c FROM 表名 WHERE 条件语句;
执行存储过程
CALL 存储过程名字(...);
或者
CALL 存储过程名字();
创建存储过程
#创建存储过程名可以传入变量,在执行的时候使用@ + 变量
CREATE PROCEDURE 存储过程名()
BEGIN
SELECT语句
END;
删除存储过程
DROP PROCEDURE 存储过程名;
使用游标
创建游标
CREATE PROCEDURE pro()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM ORDER
END;
打开游标
OPEN 游标名;
关闭游标
CLOSE 游标名;
创建触发器
#只有表才能创建触发器
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added';
删除触发器
DROP TRIGGER 触发器名;
使用ROLLBACK用来撤销MySQL语句
查看用户
USER databasename;
SELECT user FROM user;
创建用户账号
CREATE USER ben IDENTUFUED BY 'p@$$word';
重命名账号
RENAME USER ben FOR bfora;
删除用户
DROP USER bfora;
设置访问权限
#查看访问权限
SHOW GRANTS FOR bfora;
GRANT SELECT ON crashcourse.* TO bfora;
允许对crashcourse所有表使用SELECT访问权限
撤销访问权限
REVOKE SELECT ON crashcourse.* FROM bfotra;
GRANT ALL, REVOKE ALL 对整个服务器进行设置
整个数据库 ON 数据库名.*
整个表 ON 数据库名.表名;
更改密码
SET PASSWORD FOR bftora = Password('new password');
设置自己的密码
SET PASSWORD = PASSWORD('newpassword');
检查数据库表键是否完整
ANALYZE TABLE 表名;
CHECK TABLE orders,orderitems;