在劫

吾生也有涯,而知也无涯 。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

查看数据库

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;
posted on 2017-07-10 05:21  长嘴大耳怪  阅读(112)  评论(0编辑  收藏  举报