2016/2/26-27
mysql
第二十一章建立和操纵表sql
建立表数据库
CREATE TABLE语句安全
IF NOT EXISTS:查看表名是否存在,而且仅在表名不存在时建立它。服务器
NULL列和NOT NULL列。(NULL为默认设置)函数
PRIMARY KEY:定义主键(能够单个列做为主键,也能够多个列组成主键)oop
主键中只能使用不容许NULL值的列。this
AUTO_INCREMENT:(每一个表只容许一个AUTO_INCREMENT列)编码
last_insert_id()函数:返回最后一个AUTO_INCREMENT值。spa
DEFAULT:指定默认值。MySQL不容许使用函数做为默认值,它只支持常量。
使用默认值而不是NULL值。
MySQL有多种引擎。
InnoDB:事务处理
MEMORY:功能同MyISAM,数据存储在内存。
MyISAM:全文本搜索
外键不能跨引擎:使用一个引擎的表不能引用具备使用不一样引擎的表的外键。
ALTER TABLE语句:更新表
ALTER TABLE vendors
ADD vend_phone CHAR(20);
删除列
ALTER TABLE vendors
DROP COLUMN vend_phone;
ALTER TABLE的一种常见用途是定义外键。
删除表:DROP TABLE语句。删除表没有确认,也不能撤销。
重命名表:RENAME TABLE语句
第二十二章使用视图
视图:虚拟的表。视图仅仅是用来查看存储在别处的数据的一种设施。视图自己不包含数据,所以它们返回的数据是从其余表中检索出来的。
利用视图简化复杂的联结
CREATE VIEW productcustomers AS
SELECT cust_name, cust_contact, prod_id
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id AND orderitems.order_num = orders.order_num;
SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id = 'TNT2';
用视图从新格式化检索出的数据
CREATE VIEW vendorlocations AS
SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')') AS vend_title
FROM vendors
ORDER BY vend_name;
SELECT *
FROM vendorlocations;
用视图过滤不想要的数据
CREATE VIEW customeremaillist AS
SELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_email IS NOT NULL;
SELECT *
FROM customeremaillist;
使用视图与计算字段
CREATE VIEW orderitemsexpanded AS
SELECT order_num,
prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM orderitems;
SELECT *
FROM orderitemsexpanded
WHERE order_num = 20005;
第二十三章使用存储过程
建立存储过程
DELIMITER //
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products;
END //
DELIMITER ;
DELIMITER // 临时更改命令行实用程序的语句分隔符。
(mysql命令行实用程序使用;做为语句分隔符。若是命令行实用程序要解释存储过程自身内的;字符,则它们最终不会成为存储过程的成分,
这会使存储过程当中的SQL出现句法错误)
DELIMITER ; 恢复。
执行存储过程(存储过程其实是一种函数)
CALL productpricing();
删除存储过程
DROP PROCEDURE productpricing;
变量:内存中一个特定的位置,用来临时存储数据。
通常存储过程并不显示结果,而是把结果返回给你指定的变量。
DELIMITER //
CREATE PROCEDURE productpricing(
OUT p1 DECIMAL(8,2),
OUT ph DECIMAL(8,2),
OUT pa DECIMAL(8,2)
)
BEGIN
SELECT Min(prod_price)
INTO p1
FROM products;
SELECT Max(prod_price)
INTO ph
FROM products;
SELECT Avg(prod_price)
INTO pa
FROM products;
END //
DELIMITER ;
OUT:指出相应的参数用来从存储过程传出一个值(返回给调用者)
IN:传递给存储过程
INOUT:
INTO:保存到相应变量。
调用存储过程,及变量显示。
(全部MySQL变量必须以@开头)
CALL productpricing( @pricelow,
@pricehigh,
@priceaverage);
SELECT @priceaverage;
SELECT @pricehigh, @pricelow, @priceaverage;
使用IN和OUT参数
DELIMITER //
CREATE PROCEDURE ordertotal(
IN onumber INT,
OUT ototal DECIMAL(8,2)
)
BEGIN
SELECT Sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO ototal;
END //
DELIMITER ;
CALL ordertotal(20005, @total);
SELECT @total;
CALL ordertotal(20009, @total);
SELECT @total;
创建智能存储过程
-- Name: ordertotal
-- Parameters: onumber = order number
-- taxable = 0 if not taxable, 1 if taxable
-- ototal = order total variable
DELIMITER //
CREATE PROCEDURE ordertotal(
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL(8,2)
)COMMENT 'Obtain order total, optionally adding tax'
BEGIN
-- Declare variable for total
DECLARE total DECIMAL(8,2);
-- Declare tax percentage
DECLARE taxrate INT DEFAULT 6;
-- Get the order total
SELECT Sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO total;
-- Is this taxable?
IF taxable THEN
-- Yes, so add taxrate to the total
SELECT total+(total/100*taxrate) INTO total;
END IF;
-- And finally, save to out variable
SELECT total INTO ototal
END//
DELIMITER ;
CALL ordertotal(20005, 0, @total);
SELECT @total;
CALL ordertotal(20005, 1, @total);
SELECT @total;
-- :注释
DECLARE语句:定义局部变量
COMMENT关键字:在SHOW PROCEDURE STATUS 的结果中显示的内容。
检查存储过程
显示用来建立一个存储过程的CREATE语句。
SHOW CREATE PROCEDURE ordertotal;
SHOW PROCEDURE STATUS LIKE 'ordertotal';
第二十四章使用游标
游标的使用缘由:在检索出来的行中前进或后退一行或多行。
游标:一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。
游标主要用于交互式应用。
MySQL游标只能用于存储过程。
对游标结果进行循环以及逐行处理的技术。
DELIMITER //
CREATE PROCEDURE processorders()
BEGIN
-- Declare local variables
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
DECLARE t DECIMAL(8,2);
-- Declare the cursor
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
-- Declare continue handler
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
-- Create a table to store the results
CREATE TABLE IF NOT EXISTS ordertotals
(order_num INT, total DECIMAL(8,2));
-- Open the cursor
OPEN ordernumbers;
-- Loop through all rows
REPEAT
-- Get order number
FETCH ordernumbers INTO o;
-- Get the total for this order
CALL ordertotal(o, 1, t);
-- Insert order and total into ordertotals
INSERT INTO ordertotals(order_num, total)
VALUES(o,t);
-- End of loop
UNTIL done END REPEAT;
-- Close the cursor
CLOSE ordernumbers;
END//
DELIMITER ;
CALL processorders();
SELECT *
FROM ordertotals;
第二十五章使用触发器
触发器是MySQL响应一下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句)
DELETE;
INSERT;
UPDATE。
2016/2/28
最新版本的MySQL没法执行书上的代码。
第二十六章管理事务处理
事务处理:维护数据库的完整性,它保证成批的MySQL操做要么彻底执行,要么彻底不执行。
(用来管理成批执行的MySQL操做,以保证数据库不包含不完整的操做结果)
事务:指一组SQL语句;
回退:
提交:
保留点:
SELECT * FROM ordertotals;
START TRANSACTION;
DELETE FROM ordertotals;
SELECT * FROM ordertotals;
ROLLBACK;
SELECT * FROM ordertotals;
START TRANSACTION语句标识事务的开始
ROLLBACK语句回退START TRANSACTION以后的全部语句。ROLLBACK只能在一个事务处理内使用。
事务处理用来管理INSERT、UPDATE和DELETE语句。
不能回退SELECT语句、CREATE或DROP操做。
隐含提交:通常的MySQL语句都是直接针对数据库表执行和编写的。提交(写或保存)操做时自动进行的。
事务处理块中,提交不会隐含地进行。进行明确提交。
使用COMMIT语句进行明确提交。
START TRANSACTION;
DELETE FROM orderitems WHERE order_num = 20010;
DELETE FROM orders WHERE order_num = 20010;
COMMIT;
COMMIT或ROLLBACK语句执行后,事务会自动关闭。
使用保留点:部分提交或回退;占位符;能够设置任意多的保留点。
释放保留点:事务处理完成后自动释放;或使用语句明确释放。
可设置MySQL不自动提交。
第二十七章全球化和本地化
字符集
编码
校对
SHOW CHARACTER SET; #查看所支持的字符集的完整列表
SHOW COLLATION; #查看所支持校对的完整列表
SHOW VARIABLES LIKE 'character%'; #肯定所用的字符集和校对
SHOW VARIABLES LIKE 'collation%';
CREATE TABLE mytable #给表指定字符集和校对
(
columnn1 INT,
columnn2 VARCHAR(10)
)DEFAULT CHARACTER SET hebrew
COLLATE hebrew_general_ci;
DROP TABLE mytable; #删除表
CREATE TABLE mytable
(
columnn1 INT,
columnn2 VARCHAR(10),
columnn3 VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_general_ci #对某列单独设置字符集和校对
)DEFAULT CHARACTER SET hebrew
COLLATE hebrew_general_ci;
SELECT *
FROM customers
ORDER BY lastname, firstname COLLATE latin1_general_cs; #用与建立表时不一样的校对顺序排序特定的SELECT语句。
第二十八章安全管理
USE mysql;SELECT user FROM user; #得到全部用户帐号列表CREATE USER ben IDENTIFIED BY 'p@$$w0rd'; #建立一个新的用户帐号,并给出了一个口令RENAME USER ben TO bforta; #从新命名一个用户帐户DROP USER bforta; #删除用户帐户SHOW GRANTS FOR bforta; #查看赋予用户帐户的权限GRANT SELECT ON crashcourse.* TO bforta; #设置权限;bforta用户对crashcourse数据库中的全部数据具备只读访问权限#GRANT语句至少须要的信息#要授予的权限#被授予访问权限的数据库或表#用户名REVOKE SELECT ON crashcourse.* FROM bforta; #撤销特定权限GRANT SELECT, INSERT ON crashcourse.* TO bforta; #赋予多条权限SET PASSWORD FOR bforta = Password('n3w p@$$w0rd'); #更改用户口令SET PASSWORD = Password('n3w p@$$w0rd'); #更改当前登入用户口令