MySQL快速入门

继恶补了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; //关闭自动提交行为
相关文章
相关标签/搜索