MYSQL数据库相关操作---读书笔记分享

===================
数据库软件: <DBMS,DataBase Management System >
数据库: 保存特定类型数据的容器<DB,database>
表: 特定类型数据的结构化清单<Table>
模式: 关于数据库和表的布局及特性的信息<schema>
列: 表中的一个字段,<column>
行: 表中的一个字段,表中的数据都是按行存储的,<row>,一行表示一条记录。
数据类型: 所容许的数据的类型。不同列具有不同的数据类型。
数据类型: 数据类型可限制存储在列中的数据类型,防止出错。
主键: 表中的每一行都应该有唯一标识自己的一行/一列。
主键: 一列/一组列,其值能够唯一标识表中的每一行记录<primary key>
主键: 任意两行都不能具有相同的主键;
主键: 每行都必须具有一个主键值,主键值列不允许NULL值。
SQL: 结构化查询语言,<Structured Query Language>
MYSQL: 是一种DBMS,数据库管理软件。
DBMS分两类: 1.基于共享文件系统的DBMS,2.基于客户机-服务器的DBMS.

MYSQL Administrator 是一个图形交互客户机
Server Information(服务器信息): 显示客户机和被连接的服务器的状态和版本信息。
Server Control(服务控制): 允许停止/启动Mysql以及指定服务器特性。
User Administration(用户管理): 用来定义MYsql用户/登陆和权限。
Catalogs(目录): 列出可用的数据库并允许创建数据库和表。
MYSQL Query Browser: 图形交互机,用来编写和执行mysql命令。

/////////=操作数据库命令=\\\\\\\\\\
显示所有数据库: SHOW DATABASES;
显示所有数据表: SHOW TABLES;
显示某个数据表的所有列记录: SHOW COLUMNS FROM db_tables;
显示广泛的服务器状态信息: SHOW STATUS;
显示授予用户的安全权限: SHOW GRANTS;
显示错误: SHOW ERRORS;
显示警告: SHOW WARNINGS;
显示show 更多命令帮助: HELP SHOW;

第4章
多条sql语句以分号;分隔。
SQL语句不区分大小写。
所有空格都被忽略。
检索多个列,使用相同的select语句,必须在select关键字后面给出多个列名,以逗号分隔。
检索所有列:SELECT * FROM db_table;
检索列中不重复的值,使用distinct(不同的)。distinct不能部分使用。
select distinct user_name from db_tables;
限制结果:limit子句;SELECT user_name from db_table LIMIT 5; 限制不多于行。
limit 3,4; 从第三行开始返回4行数据。
使用完全限定的表名:
//数据库:league, 数据表:db_table, 列字段:user_name,legends
SELECT db_table.user_name FROM db_table;
SELECT db_table.user_name FROM league.db_table;

第5章
排序数据 oerder by子句
子句(clause):SQL语句由子句构成
order by子句可以取一个列或多个列的名字,据此对输出进行排序
SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price,prod_name;
//先根据价格,后根据名称排序。
指定排序方向:
默认是升序排序:ASC
还可以降序排序:DESC
SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price DESC,prod_name;
//按价格降序,名称没有指定,所以默认升序。

SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price DESC,prod_name LIMIT 1;
//只返回一行数据。
order by 子句位于from子句之后;
limit子句必须位于order by之后。
where子句位于from子句之后,order by子句之前。

第6章
过滤数据 where子句
搜索条件(search criteria)
过滤条件(filter condition)
SELECT prod_name,prod_price
FROM product
WHERE prod_price = 2.50;
//只返回价格为2.50的数据。

where子句的操作符:
= 等于
<> 不等于
!= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于
between 在指定的两个值之间
检查单个值:
SELECT prod_name,prod_price
FROM products
WHERE prod_name = 'apple';

检查价格小于10的产品:
SELECT prod_name, prod_price
FROM products
WHERE prod_price < 10;

不匹配检查:
SELECT prod_id,prod_name,prod_price
FROM products
WHERE prod_id <>1001;
如果将值与字符串进行比较,字符串需要加引号。

范围值检查:
BETWEEN 子句
SELECT prod_name,prod_price
FROM products
WHERE price BETWEEN 5 AND 10;

空值检查:
NULL 无值(no value) 它不是0,空字符串,也不是空格
SELECT pro_name FROM products WHERE prod_price IS NULL;

第7章
数据过滤
mysql允许给出多个where子句。
以and子句或者or子句的方式使用。
操作符(operator):用来联结或改变where子句中的关键字。
AND操作符:同时满足and 两边
SELECT prod_id,prod_name,prod_price
FROM products
WHERE prod_id = 100 AND prod_price <=10;
OR操作符:只需满足条件之一即可
SELECT prod_name,prod_price
FROM products
WHERE prod_id =100 OR prod_id =101;

计算次序
WHERE 子句可包含任意数量的AND和OR操作符。
AND和OR联合同时使用时,优先处理AND子句。
在WHERE子句中使用()圆括号。
IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。
IN取合法值的由逗号分隔的清单,全部在圆括号中。
WHERE pro_name,pro_price
FROM products
WHERE prod_id IN (1001,1015)
ORDER BY prod_price DESC;

IN操作符 和OR操作符具有相同的功能。
IN操作符执行速度比OR更加的快速。
IN操作符可以包含其他的SELECT语句,
能够更加动态的建立WHERE子句。

NOT操作符
where子句中用来否定后面跟的条件的关键字NOT.
SELECT prod_name,prod_price
FROM products
WHERE prod_id NOT IN (1001,1015)
ORDER BY prod_name;
第8章
用通配符进行过滤
LIKE操作符
通配符(wildcard):用来匹配值的一部分的特殊字符。
搜索模式(search pattern):由字面值、通配符或着两者组合构成的搜索条件。
为了使用通配符,必须使用LIKE操作符。

百分号(%)通配符
% 百分号表示任何字符出现任意次数。
SELECT pro_id, prod_name, FROM products
WHERE pro_name LIEK 'app%';
//表示以app开头的单词,app后%表示可以接收任意字符。
%百分号可以在开头,结尾,中间。

下划线_通配符
_ 下划线与%百分号用法相同,但下划线只匹配单个字符而不是多个字符。
SELECT pro_id,prod_name
FROM products
WHERE pro_name LIKE '_app';
// _只匹配一个字符,不能多也不能少。

不要过渡使用通配符,通配符使用会导致搜索变慢。
在确实必须使用通配符,才可使用通配符。
第9章
正则表达式,进行搜索
正则表达式,就是用来匹配文本。
mysql正则表达式,仅为正则表达式。
基本字符匹配
regexp正则表达式
匹配不区分大小写
进行OR匹配 |
为了搜索两个字符串之一,使用管道符|
SELECT prod_name
FROM products
WHERE pro_name REGEXP 'apple|huawei'
ORDER BY pro_name;
两个以上的OR条件,可以多次使用管道符|

匹配几个字符之一:指定一组[]括起来的字符完成。
SELECT pro_name
FROM pro_name REGEXP '[123]apple'
ORDER BY prod_name;
[123]apple 等价与 [1|2|3]apple

匹配范围
可以是[012345],[1-5],[6-9],[a-z]
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5]apple'
ORDER BY prod_name;

匹配特殊字符,必须用\\双斜杠为前导。
REGEXP '\\.' 匹配点.
\\f 换页
\\n 换行
\\t 回车
\\v 纵向制表符
\\\ 匹配 \

匹配字符类
[:alnum:] --- 匹配任意字母数字(a-zA-Z0-9)
[:alpha:] --- 任意字母(a-zA-Z)
[:blank:] --- 空格和制表([\\t])
[:cntrl:] --- 匹配ASCII控制符
[:digit:] --- 匹配任意数字
[:graph:] --- 匹配任意可打印字符,不包括空格
[:lower:] --- 匹配任意小写字母
[:print:] --- 匹配任意可打印字符
[:punct:] --- 匹配不在[:alnum:]和[:cntrl:]
[:space:] --- 匹配空格在内的任意空字符(\\f\\n\\r\\t\\v)
[:upper:] --- 匹配大写字母
[:xdigit:] -- 匹配16进制数字

匹配多个实例
* 匹配0个或多个字符
+ 匹配1个或多个字符
? 匹配0个或1个字符
{n} 匹配指定数目的字符
{n,} 匹配不少以指定数目的字符
{n,m} 匹配数目范围的字符
SELECT prod_name
FROM products
WHERE pro_name REGEXP '\\([0-9] sticks?\\)'
ORDER BY pro_name;
解释:
\\( 表示匹配开始
[0-9] 任意数字
sticks? 表示stick或者sticks ;
s后的?表示 s可以有0个,也可以有1个
\\) 表示匹配结束

SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name;
注:[:digit:] 表示匹配任意数字;{4} 确切的要求它前面的字符出现4次

定位符:匹配特定位置的文本
^ 匹配文本开始
$ 匹配文本结尾
[[:<:]] 匹配词的开始
[[:>:]] 匹配词的结尾
SELECT prod_price
FROM prod_price REGEXP '^[0-9\\.]'
ORDER BY prod_price;
匹配以小数点开头的数
第10章
创建计算字段
字段(field):基本上与列(column)的意思相同。
连接字段
连接(concatenate):将值联接到一起构成单个值。
多数DBMS使用+或||来实现拼接,
而Mysql则使用函数Concat()连接。
SELECT Concat(city_name,'(',country_name,')')
FROM tb_country
ORDER BY country_name;

RTrim()函数去掉值右边的所有空格
LTrim()函数去掉值左边的所有空格

别名(alias):是一个字段或值的替换名
对于未命名的列,客户机无法引用它,就需要使用别名
别名使用AS关键字赋予。
SELECT Concat(RTrim(city_name),'(',LTrim(country_name),')')
AS city_country_name
FROM tb_country;
ORDER BY country_name;

执行算术计算
+ 加
_ 减
* 乘
/ 除
第11章
使用函数处理数据
处理文本字符串
数值进行算术运算
处理日期和时间
返回DBMS特定信息

文本处理函数
RTrim() 去掉文本右边的所有空格
LTrim() 去掉文本左边的所有空格
Upper() 将字母全部转换为大写
Lower() 将字母全部转换为小写
Left() 返回字符串左边的字符
Right() 返回字符串右边的字符
Length() 返回字符串的长度
Locate() 找出字符串的一个子字符串
Soundex() 返回字符串的SOUNDEX值
SubString() 返回字符串的子字符

SOUNDEX 是一个将任何文本字符串转换为描述其语音表示的字母数字模式的算法
SOUNDEX 可以进行发音比较而不是字母比较。

日期和时间处理函数
addDate() 添加一个日期(天、周等)
addTime() 添加一个时间(时、分等)
CurDate() 返回当期日期
CurTime() 返回当前时间
Date() 返日期时间的日期部分
DateDiff() 计算两个日期之差
Date_Add() 高度灵活的日期运算函数
Date_Format() 返回一个格式化的日期或时间
Day() 返回一个日期的天数部分
DayOfWeek() 返回格式日期的对应的星期几
Hour() 返回一个时间的小数部分
Minute() 返回一个时间的分钟部分
Month() 返回一个日期的月份部分
Now() 返回当期日期时间
Second() 返回一个时间的秒钟部分
Time() 返回一个日期时间的时间部分
year() 返回一个日期的年份部分

日期格式必须是yyyy-mm-dd
SELECT cust_id,order_num
FROM orders
WHERE order_date = '2015-05-25';

SELECT cust_id,order_num
FROM orders
WHERE Date(order_date) BETWEEN '2015-05-05' AND '2015-05-25';

数值处理函数
Abs() 返回一个数的绝对值
Cos() 返回一个角度的余弦
Exp() 返回一个数的指数值
Mod() 返回除操作的余数
Pi() 返回圆周率
Rand() 返回一个随机树
Sin() 返回一个数的正弦
Sqrt() 返回一个数的平方根
Tan() 返回一个角度的正切

第12章
聚合函数(aggregate):运行在行组上,计算和返回单个值的函数。
AVG() 返回某列的平均值
COUNT() 返回某列的行数
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和
AVG()函数会自动忽略值为NULL的行

聚合不同值
DISTINCT 不同的,差别的
SELECT AVG(DISTINCT pro_price) AS avg_price
FROM products
WHERE vend_id = 101;

SELECT COUNT(*) AS num_items,
MAX(prod_price) AS price_max,
MIN(prod_price) AS price_min,
AVG(prod_price) AS price_avg
FROM products;

第13章
分组数据
group by子句 (GROUP BY)
having子句 (HAVING)

SELECT COUNT(*) AS num_prods
FROM products
WHERE vend_id =110;

创建分组:group by
SELECT vend_id,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;

过滤分组:having
SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;

分组和排序
分组:group by
排序:order by
SELECT order_num,SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >= 50;
ORDER BY ordertotal;

select……as……from……where……group by……having……order by…… limit……
子句
SELECT 要返回的列或表达式
FROM 要检索的数据表
WHERE 行级过滤
GROUP BY 分组说明
HAVING 分组过滤
ORDER BY 输出排序
LIMIT 要检索的行数
ASC 升序
DESC 降序

第14章
子句查询
查询(Query):任何sql语句都是查询。
sql还允许创建子查询(subquery),即嵌套在其他查询中的查询。
可以利用子查询进行过滤数据操作
子查询总是从内向外处理。
SELECT prod_price
FROM products
WHERE
可以利用子查询进行计算字段操作

相关子查询(correlated subquery):设计到外部查询的子查询。

第15章
联结(join):用于把来自两个或多个表的行结合起来
关系表
外键(foreign key):定义了两个表之间的关系,一个表的中的列,包含另一个表的主键值。
可伸缩性(scale):能够适应不断增加的工作量而不失败。
当数据存储在多个表中,使用联结的方式就可以实现查询出多个表中的数据。
创建联结:
SELECT prod_name,prod_price,vend_name
FROM products,vendors
WHERE vendors.vend_id = products.prod_id
ORDER BY vend_name,prod_name
使用完全限定列名:表名.列名

等值联结(equijoin):基于两个表之间的相等测试。 也称:内部联结
第16章
聚集函数的联结:
SELECT customers.cust_name,customers.cust_id,COUNT(orders.order_num)
FROM customers INNER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;

第17章
组合查询union
执行多个查询语句,并将结果作为单个查询返回
使用UNION,在SELECT 语句之间放关键字UNION
SELECT vend_id,prod_id,prod_price
FROM products
WHERE prod_price <= 5;
UNION
SELECT vend_id,prod_id,prod_price
FROM products
WHERE vend_id IN (1001,1002)

UNION必须由两条以上的SELECT语句组词,语句之间用关键字UNION
UNION中的每个查询必须包含相同的列,表达式或集合函数
列数据类型必须兼容,但不必完全相同

第18章
全文本搜索

第19章
数据的插入insert
插入完整的行
插入行的一部分数据
插入多行
插入某些查询的结果
INSERT INTO Students VALUES(
100,
"小明",
"一班");
完整的插入方式
INSERT INTO Students(
stu_id,
stu_name,
stu_class)
VALUES(
100,
"小明",
"一班");

第20章
更新和删除数据update
UPDATE Students
SET stu_class = '二年级1班'
WHERE stu_id = '100';
如果要删除某列的特定行的值,可以使用UPDATE更新为NULL.

删除表中的数据delete
DELETE FROM students WHERE stu_id = '100';
删除表中的全部数据:truncate table 语句

第21章
创建表
CREATE TABLE tb_name(
cust_id INT NOT NULL AUTO_INCREMENT,
cust_name CHAR(50) NOT NULL,
cust_addr CHAR(50) NULL DEFAULT '1',
PRIMARY KEY(cust_id)
) ENGINE = InnoDB;

NULL 可以为空值(没有任何)
NOT NULL 不能为空值
PRIMARY KEY 表示主键,主键必须唯一。
AUTO_INCREMENT 自动生成创建
DEFAULT 这种默认值

引擎类型:ENGINE = InnoDB 是一个可靠的事务处理引擎,不支持全文搜索。

更新表(插入列/删除列)
为了更新表定义,可以使用ALERT TABLE语句。
插入列:ALERT TABLE tb_name ADD cust_phone CHAR(20);
删除列:ALERT TABLE tb_name DROP COLUMN cust_phone;
alert table的常见用途是定义外键。

删除表:DROP TABLE tb_name;
重命名:RENAME TABLE tb_old_name to tb_new_naem;

第22章
视图
视图是基于 SQL 语句的结果集的可视化的表
视图是虚拟的表,视图只包含使用时动态检索数据的查询结果.
视图并不在数据库中以存储的数据值集形式存在.
视图必须唯一命名
视图可以嵌套,不能被索引,也不能有关联的触发器或默认值

视图用create view 语句来创建
使用SHOW CREATE VIEW viewname;查看创建视图的语句.
使用DROP删除视图,其语法为DROP VIEW viewname;
CREATE VIEW productcustomers AS
SELECT cust_name,cust_contact,prod_id
FROM customers, orers,orderitems
WHERE customers.cust_id = orders.cust_id
AND orderitems.order_num = order.order_num;
以上创建一个名为productcustomers的视图,它联结3个表.
视图如果进行了:
分组,联结,子查询,并,聚集函数,DISTINCT,导出,则不能进行更新

第23章
存储过程
经常需要执行多条语句才能完成一个完整的操作,就需要存储过程.
存储过程:就是为了以后的使用而保存的一条或多条sql语句的集合.
1.通过吧处理封装在容易使用的单元中,简化操作.
2.保证数据完整性,简化对变动的管理,提供性能.
MYSQL执行存储过程的语句为CALL
CALL productpricing(@pricelow,
@pricehigh,
@priceaverage);
其中执行名为productpricing的存储过程,
计算并返回产品的最低,最高,平均价格.

创建存储过程:create procedure
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products;
END;
删除存储过程:drop procedure
DROP PROCEDURE productpricing;
检查存储过程: SHOW CREATE PROCEDURE productpricing;
获得创建的详细信息存储过程列表:show procedure status;

第25章
触发器
当某个表发生更改时自动处理.
触发器是mysql响应一下任意语句(DELETE,INSERT,UPDATE)而自动执行的一条语句
触发器位于BEGIN和END语句之间的一组语句.
创建触发器:
1.唯一的触发器名;2.触发器关联的表;3.触发器响应的活动(insert,delete,update)
4.触发器何时执行.
触发器仅仅支持表,不支持视图
INSERT 触发器:
CREATE TRIGGER neworder AFTER INSERT ON orders
FOR EACH ROW SELECT NEW.order_num;

DELETE触发器:
CREATE TRIGGER deleteorder BEFORE DELETE ON orders
FOR EACH ROW
BEGIN
INSERT INTO archive_orders(order_num,order_date,cust_id)
VALUES(OLD.order_num,OLD.order_date,OLD.cust_id);
END;

UPDATE触发器
CREATE TRIGGER updatevender BEFORE UPDATE ON venders
FOR EACH ROW SET NEW.vend_state = Uppder(NEW.vend_state);

创建用户账户
CREATE USER语句
CREATE USER anna IDENTIFIED BY '123456';
删除用户账户
DROP USER anna;
设置访问权限
SHOW GRANTS FOR anna;
GRANT SELECT ON crashcourse.* TO anna;
更改密码
SET PASSWORD FOR anna = password('654321');

诊断启动问题
--help显示帮助
--safe-mode装载减去某些最佳配置的服务器.
--verbose显示全文本消息
--version显示版本信息然后退出.
查看日志文件
错误日志:hostname.err,位于data目录.
此错误日志名可以用--log-error命令更改.
查询日志:hostname.log.位于data目录中.
此查询名字可用--log命令更改.
缓慢查询日志: hostname-slow.log,位于data目录.

上一篇:Django -查询数据库相关操作


下一篇:yii的数据库相关操作