继恶补了C++基础以后,又来恶补MySQL了,花了将近一天的时间啃完了<MySQL必知必会>这本书,整理了有点糙的读书笔记。正则表达式
1.SHOW语句的使用:sql
SHOW DATABASES; //显示存在的数据库列表 SHOW TABLES; //显示当前数据库里存在的表 SHOW COLUMNS FROM user; //显示表user中的全部列(字段)信息,效果同DESCRIBE user SHOW GRANTS; //显示受权用户
2.SELECT查询语句:数据库
SELECT name FROM products; //查询单列 SELECT name,id FROM products; //查询多列 SELECT * FROM products; //查询全部列 SELECT DISTINCT id FROM products; //查询一列返回不一样的行 SELECT products.name FROM factory.products; //使用彻底限定的代表和数据库名
3.LIMIT子句限定显示结果行数:安全
SELECT name FROM products LIMIT 5; //查询一列返回从开始的5行 SELECT name FROM products LIMIT 5,5; //查询一列返回从第5行开始的5行
4.ORDER BY子句对查询结果进行排序:函数
SELECT name FROM products ORDER BY name; //经过单一列对查询结果排序,排序子句中的列名不必定是查询结果中的列明。 SELECT id,price,name FROM products ORDER BY price,name;//经过多列对结果排序,即当第一个列值相同时按照第二个再排,不然只按第一个排。 SELECT id,price,name FROM products ORDER BY price DESC,name;//同上,只不过先按price降序排列,再按name升序排列(没写ASC关键字是由于默认升序) SELECT price FROM products ORDER BY price DESC LIMIT 1; //利用排序子句和LIMIT子句检索价格最大值
5.WHERE子句用于过滤行数据:spa
SELECT name,price FROM products WHERE price = 2.5; //过滤价格等于2.5的数据 SELECT name,price FROM products WHERE price BETWEEN 5 AND 10; //过滤价格在5到10之间的数据 SELECT id FROM customers WHERE email IS NULL //过滤表中email为空值得数据
WHERE子句可使用的基本操做符有: =、!= 、< 、> 、<= 、>= 、> 、 BETWEEN。还能够配合以下特殊操做符(AND \ OR \ IN \ NOT):code
SELECT id,price,name FROM products WHERE id = 1000 AND price <=10; //AND操做符 SELECT name,price FROM products WHERE id = 1000 OR id = 1002; //OR操做符 SELECT name,price FROM products WHERE id IN(1002,1003) ORDER BY name; //IN操做符 SELECT name,price FROM products WHERE id NOT IN(1002,1003) ORDER BY name;//NOT操做符用于对后面子句取反
6.LIKE子句:排序
SELECT id,name FROM products WHERE name LIKE 'jet%'; //%通配符表示任何字符出现任意次数,这里表示以jet开头的词,jet后不管出现多少个任意字符。 SELECT id,name FROM products WHERE name LIKE '_ ton'; //_通配符表示单个任意字符。
7.REGEXP子句用于使用正则表达式进行搜索。详参照正则表达式。索引
8.拼接函数Concat():事务
SELECT Concat(name, '(' , country , ')') AS title FROM vendors ORDER BY name; 查询结果显示name 和(country)拼接起来的结果,而且显示的列标题经过AS起别名为title
9.SELECT中执行算术计算:
SELECT id,quantity,price*item_price AS price FROM order WHERE order_num = 2005; //让结果显示算术运算后的结果并起别名
10.数据处理函数:A.文本处理函数
B.日期和时间处理函数:
C.数值处理函数:
11.汇集函数:
12.GROUP BY子句用于分组数据:
SELECT id, COUNT(*) AS num_prods FROM products GROUP BY id; //按照id进行分组,其中SELECT中出现的出汇集函数之外的列名必须出如今GROUP BY子句中,且GROUP BY不能使用别名。
13.HAVING 子句用于过滤分组:
SELECT id,COUNT(*) AS order FROM order WHERE id > 10 GROUP BY id HAVING COUNT(*) >= 2; //查询语句先回执行WHERE过滤行数据,再经过GROUP BY分组,接着是HAVING来过滤分组后的组
14.SELECT相关子句书写顺序:SELECT -> FROM -> [WHERE] -> [GROUP BY] -> [HAVING] -> [ORDER BY] -> [LIMIT],其中括号括起来的是非必需的。
15.子查询,经常使用yu过滤子句中和SELECT的计算字段:
SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE pro_id = 'TNT2'); //这里在WHERE过滤子句中嵌套了一个子查询,执行顺序是先是子查询查到order_num,而后经过子查询的order_num过滤外层查询数据 SELECT cust_name, cust_state, (SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS orders FROM customers ORDER BY cust_name; //这里显示结果的第三列是来自另一个表的子查询,而且指定了在子查询中过滤id等于当前表id的数据。
16.外键是某个表中的一列,包含另外一个表的主键值,定义了两个表之间的关系。
17.INNER JOIN内部联结(也称等值联结)实现查询多个表的数据,来自多个表的数据经过必定的联结条件联结起来:
SELECT ven_name , prod_name , prod_price FROM vendors , products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name , prod_name; //查询来自两个表vendors和products的数据,而且将数据经过WHERE子句中id相等条件内联起来,这里id必定要写限定全名区分,若不使用内联结会出现笛卡儿积的结果 SELECT vend_name,prod_name,prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id; //查询效果同上,只不过这里经过INNER JOIN内联结,ON后为内联结条件。
18.自联结,即经过当前表和当前表自己进行联结进行查询数据:
SELECT p1.prod_id,p1.prod_name FROM products AS p1, products AS p2 WHERE p1.vend_id = p2.vend_id AND p2.prod_id = 'DTNTR';//将同一张表区别名p1和p2,经过vend_id为条件进行自联结,因为追加了p2.prod_id = 'DTNTR'使得p2只有一条数据,所以在自联结时p1只会过滤为只含有p2那条数据ven_id的数据。
19.OUTER JOIN外联结,与内联结相似,区别就是包括了没有进行关联的行:
SELECT customers.cust_id , order.order_num FROM customer LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id; //在外联结关键字OUTER JOIN前面加LEFT和RIGHT标志指定包括OUTER JOIN左边或者右边的全部行(包括没进行关联的,没进行关联的数据为NULL)。
20.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) ORDER BY vend_id , prod_price; //组合的要求是多个查询结果的列数量和类型是相兼容的,而且组合会去重复行,要包括重复行使用UNION ALL,组合的结果只能用一个ORDER BY
21.全文本搜索:
//启用全文搜索 CREATE TABLE productnotes( note_id int NOT NULL AUTO_INCREMENT, prod_id char(10) NOT NULL, note_date datetime NOT NULL, note_text text NULL, PRIMARY KEY(note_id), FULLTEXT(note_text) //对note_text字段开启全文本搜索支持 )ENGINE = MyISAM //使用MyISAM引擎,由于此引擎支持全文本搜索 //使用全文本搜索 //Match(note_text)即对note_text字段进行全文本搜索,Against('rabbit')指出搜索的关键字是'rabbit' SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit ');
22.INSERT语句用于插入数据:
INSERT INTO customers VALUES(NULL,'Test','Test1','Test2',99,NULL);//直接插入完整的数据,数据按位入座。但容易写漏,不安全 INSERT INTO customers (cust_address , cust_city , cust_state , cust_zip , cust_country,cust_contact , cust_email) VALUES('Test','TEST','TEST','TEST','TEST','TEST',NULL,NULL); //插入一行数据的指定列的数据,没指定的列为默认为NULL或默认值。 INSERT INTO customers(cust_id , cust_contact , cust_email , cust_name , cust_address, cust_city , cust_state , cust_zip , cust_country)SELECT cust_id , cust_contact , cust_email , cust_name , cust_address, cust_city , cust_state , cust_zip , cust_country FROM custnew;//将查询的数据插入
23.UPDATE语句更新数据:
UPDATE customers SET cust_name = 'The Fudds',cust_email = 'elmer@fudd.com' WHERE cust_id 1005; //修改指定行的数据。若不加WHERE会更新全部行的数据
24.DELETE语句删除数据:
DELETE FROM customers WHERE cust_id = 1005; //删除指定行的数据,若不加WHERE则删除全部行数据。
25.CREATE TABLE语句建立表:
//建表关键字CREATE TABLE,后面接表名,括号内为各列的名称及属性 CREATE TABLE orderitems( //NOT NULL执行这一列不能为空,设为NULL则能够为空,DEFAULT指出若这一列若没赋值则使用默认值,AUTO_INCREMENT指出这一列的数据若没赋值会根据上一个值自动增长。 order_num int NOT NULL, AUTO_INCREMENT, order_item int NOT NULL, prod_id char(10) NOT NULL DEFAULT 1, quantity int NOT NULL, item_price decimal(8.2) NOT NULL, //设置主键 PRIMARY KEY (order_num , order_item) )ENGINE = InnoDB;//选择使用引擎
26.ALTER TABLE语句更新表:
ALTER TABLE vendors ADD vend_phone CHAR(20) ; //在表中添加一列 ALTER TABLE orders ADD CONSTAINT fk_orders_customers FOREIGN KEY(cust_id) REFERENCES customers(cust_id); //更新表经常使用来添加外键约束,这里添加约束列fk_orders_customers,指出是外键cust_id,引用于customers的cust_id列 ALTER TABLE Vendors DROP COLUMN vend_phone; //删除表中的一列
27.DROP TABLE 删除表:
DROP TABLE customers2;
28.RENAME TABLE重命名表:
RENAME TABLE customers2 TO customers;
29.VIEW视图能够看做虚拟的表自己不包含任何数据,不能使用索引和触发器,自己保存一个SQL查询语句,用于以后的SELECT,简化查询操做,复用SQL代码。
//建立视图 CREATE VIEW productcustomers AS SELECT cust_name , cust_contact , prod_id FROM customers , orders , orderitems WHERE customers.cust_id = order.cust_id AND orderitems.order_num = orders.order_num; //AS后面保存的就是一个SQL查询,此视图就是基于此查询得出来的虚拟表 //从视图查询,直接得出结果而不用在敲上面那么多代码 SELECT * FROM productcustomers //删除视图 DROP VIEW viewname;
能够对视图中的数据进行插入、更新、删除操做,操做完会修改本来的基类表。
30.存储过程暂时没看以后补上
31.游标暂时没看以后补上
32.TRIGGER触发器即某些语句被执行时自动执行一些操做,可使用出发语句有INSERT\DELETE\UPDATE,包括其以前和以后触发所以一个表最多含有6个触发器:
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added'; //建立的触发器名是newproduct,出发条件在插入表以后,FOR EACH ROW指出每次插入都触发,触发内容就是显示'Product added'行 CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num; //这里的NEW.order_num指的是新插入的记录的order_num字段 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; //这里使用BEGIN和END使得能够执行多条语句。 DROP TRIGGER newproduct; //删除触发器
33.事务处理保证SQL操做要么执行,要么彻底不执行:
START TRANSACTION;//开启事务 ROLLBACK; //回滚操做到开启事务处,只能在一个事务处理内使用 COMMIT; //提交整个事务操做 SAVEPOINT pos; //使用保留点 ROLLBACK TO pos; //回滚到保留点 SET autocommit = 0; //关闭自动提交行为