《MySQL必知必会》笔记1

2016/2/21正则表达式

数据库:保存有组织的数据的容器(一般是一个文件或一组文件)sql

数据库管理系统(DBMS):用于访问数据库。
数据库


:某种特定类型数据的结构化清单。相同的数据库中表的名字是惟一的安全

模式:关于数据库和表的布局及特性的信息。能够用来描述数据库中特定的表以及整个数据库。服务器

:表中的一个字段,全部表都是由一个或多个列组成。函数

数据类型:所允许的数据的类型。每一个表列都有相应的数据类型,它限制(或允许)该列中存储的数据。布局

:表中的一个记录性能


主键:一列(或一组列),其值可以惟一区分表中每一个行。测试

主键值的几个规则。编码


SQL:结构化查询语言。专门用来与数据库通讯的语言。



2016/2/22

DBMS分为两类:

    基于共享文件系统的DBMS

    基于客户机-服务器的DBMS


USE关键字:选择一个数据库。必须先使用USE打开数据库,才能读取其中的数据。


 返回可用数据库的一个列表

SHOW DATABASES;


返回当前选择的数据库内可用表的列表。

SHOW TABLES;    


也可用来显示表

SHOW COLUMNS FROM customers;

快捷方式:

DESCRIBE customers;


 显示容许的SHOW命令

HELP SHOW;  



SELECT语句:从表中检索一个或多个数据列。


SELECT prod_name    #列名(列名间加上逗号能够检索多个列;使用通配符(*)能够检索全部列,并能检索出名字未知的列)
FROM products;    #从中检索数据的表名


SQL语句不区分大小写,多数开发人员喜欢对关键字使用大写,便于阅读和调试。


SELECT DISTINCT vend_id    #DISTINCT,指示只返回不一样的值,它应用于全部列。
FROM products;


SELECT prod_name
FROM products
LIMIT 5;    #指示MySQL返回很少于5行。


SELECT prod_name
FROM products
LIMIT 3, 4;    #指示MySQL返回从行3开始的4行。


替代语法:

LIMIT 4 OFFSET 3;


行0:表示第一行。


使用彻底限定的表名,列名。

SELECT products.prod_name
FROM crashcourse.products;



子句的概念:如SELECT语句的FROM子句。


ORDER BY子句指示MySQL对prod_name列以字母顺序排序。

SELECT prod_name
FROM products
ORDER BY prod_name;


也可经过非选择列进行排序。


检索3个列,对其中两个列进行排序。

SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price, prod_name;


DESC关键字:指定降序排序。

ASC:指定升序排序(默认)。

SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price DESC;


DESC关键字只应用到直接位于其前面的列名上。

SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price DESC, prod_name;


在对文本性的数据进行排序时,A与a是否相同,取决于数据库如何设置。


子句的使用顺序:FROM子句->WHERE子句->ORDER BY子句->LIMIT子句



WHERE子句:

SELECT prod_price, prod_name
FROM products
WHERE prod_price = 2.50;


字符串使用‘ ’,单引号用于限定字符串。

MySQL在执行匹配时默认不区分大小写。

SELECT prod_price, prod_name
FROM products
WHERE prod_name = 'fuses';


<

<=

<>    不等于

!=    不等于


BETWEEN操做符

SELECT prod_price, prod_name
FROM products
WHERE prod_price BETWEEN 5 AND 10;


NULL 无值,它与字段包含0、空字符串或仅仅包含空格不一样。

SELECT prod_name
FROM products
WHERE prod_price IS NULL;


NULL值的行,表示未知,数据库不知道它们是否匹配,因此在匹配过滤或不匹配过滤时不返回它们。



AND操做符:用在WHERE子句中。计算优先级大于OR操做符。

OR操做符

圆括号可对相应操做符分组。使用圆括号没有坏处,还能消除歧义。


IN操做符(与OR操做符完成相同的功能)

WHERE子句中用来指定要匹配值的清单的关键字。

SELECT prod_price, prod_name
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name;


NOT操做符

WHERE子句中用来否认后跟条件的关键字。

SELECT prod_price, prod_name
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;



通配符:用来匹配值的一部分的特殊字符。可在搜索模式中任意位置使用,而且可使用多个通配符。

搜索模式:由字面值、通配符或二者组合构成的搜索条件。


LIKE操做符:它是谓词,指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。


百分号(%)通配符

    表示任何字符出现任意次数。0次、1次、屡次。

    % 不能匹配 NULL。


下划线(_)通配符

    匹配单个字符。


通配符使用技巧

    不要过分使用通配符。花费时间更长。

    除非绝对必要,不然不要把通配符用在搜索模式的开始出。

    仔细注意通配符的位置。不要放错地方。



正则表达式控制数据过滤


REGEXP后所跟的东西做为正则表达式处理

SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORFER BY prod_name;


. 匹配任意一个字符。

SELECT prod_name
FROM products
WHERE prod_name REGEXP '.1000'
ORFER BY prod_name;


LIKE与REGEXP的区别:

LIKE:匹配整个列

REGEXP:在列值内进行匹配。使用^和$定位符才能匹配整个列。


BINARY关键字:使MySQL中的正则表达式匹配区分大小写。


进行OR匹配

SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORFER BY prod_name;


匹配几个字符之一

SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] Ton'
ORFER BY prod_name;

[123]定义一组字符,它的意思是匹配1或2或3.

能够写成[1|2|3],但[]不能省略。

[^123]匹配除1 2 3 外的任何东西。

[1-5]匹配范围

[a-z]


匹配特殊字符:必须用\\为前导(转义)。如\\-    \\.    。(MySQL本身解释一个\,正则表达式库解释另外一个)

\\也可用来引用元字符(具备特殊含义的字符)

\\\匹配\自己。



2016/2/23

第十章建立计算字段


字段:计算字段


拼接:将值联结到一块儿构成单个值。


使用Concat()函数来拼接两个列。

SELECT Concat(vend_name, ' (', vend_country, ')')
FROM vendors
ORDER BY vend_name;


RTrim()函数:删除数据右侧多余的空格。

LTrim()函数:删除数据左侧多余的空格。

Trim()函数:删除数据左右两侧多余的空格。

SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')')
FROM vendors
ORDER BY vend_name;


新计算列没有名字,它只是一个值。未命名的列不能用于客户机应用,客户机没有办法引用它。

使用别名,解决这个问题。

SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')') AS vend_title
FROM vendors
ORDER BY vend_name;


别名(导出列)的其余用途:重命名。


执行算数计算

SELECT prod_id, quantity, item_price, quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;


SELECT能够省略FROM子句以便简单地访问和处理表达式。



第十章使用数据处理函数


文本处理函数

SELECT vend_name, Upper(vend_name) AS vend_name_upcase
FROM vendors
ORDER BY vend_name;

使用Soundex()函数,匹配发音相似的值。

SELECT cust_name, cust_contact
FROM customers
WHERE Soundex(cust_contact) = Soundex('Y Lie');


日期和时间处理函数


通常,应用程序不使用用来存储日期和时间的格式,日期和时间函数老是被用来读取、统计和处理这些值。


SELECT cust_id, order_num
FROM orders
WHERE order_date = '2005-09-01';


Date()    日期。

SELECT cust_id, order_num
FROM orders
WHERE Date(order_date) = '2005-09-01';

Time()    时间


SELECT cust_id, order_num
FROM orders
WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';


SELECT cust_id, order_num
FROM orders
WHERE Year(order_date) 2005 AND Month(order_date) = 9;


数值处理函数



第十二章 汇总数据


汇集函数:运行在行组上,计算和返回单个值的函数。


AVG函数:肯定特定数值列的平均值,列名做为函数参数。忽略列值为NULL的行。

SELECT AVG(prod_price) AS avg_price
FROM products;


AVG()肯定特定列或行的平均值。

SELECT AVG(prod_price) AS avg_price
FROM products;


COUNT函数

对表中行的数目进行计数,无论表列中包含的是空值(NULL)仍是非空值。

SELECT COUNT(*) AS num_cust
FROM customers;


若是指定列名,则指定列的值为空的行被COUNT()函数忽略。

SELECT COUNT(cust_email) AS num_cust
FROM customers;

MAX()函数:返回指定列中的最大值。要求指定列名。忽略列值为NULL的行。

MIN()函数

SUM()函数:返回指定列值的和(总计)。

SELECT SUM(quantity) AS total_price
FROM orderitems
WHERE order_num = 20005;


SUM()函数也可用来合计计算值

SELECT SUM(item_price*quantity) AS total_price
FROM orderitems
WHERE order_num = 20005;


汇集不一样值。

DISTINCT参数。缺省时,默认指定了ALL参数。

SELECT AVG(DISTINCT prod_price) AS avg_price
FROM products;
WHERE vend_id = 1003;


组合汇集函数:单条SELECT语句执行4个汇集计算。



第十三章分组数据


GROUP BY子句指示MySQL分组数据,而后对每一个分组而不是整个结果集进行汇集。

SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;


HAVING子句(与WHERE子句的区别:WHERE过滤行,而HAVING过滤分组

WHERE在数据分组前进行过滤,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子句顺序 (pdf 100页)



第十四章 使用子查询


查询:任何SQL语句都是查询。但此术语通常指SELECT语句。


SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2';

SELECT cust_id
FROM orders
WHERE order_num IN (20005,20007);

把第一个查询变为子查询组合两个查询

SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2');

在SELECT语句中,子查询老是从内向外处理。


子查询通常与IN操做符结合使用,但也能够用于测试等于(=)、不等于(<>)等。


做为计算字段使用子查询

SELECT cust_name, 
      cust_state,
      (SELECT COUNT(*)
FROM orders
WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name;

使用彻底限定列名。

WHERE orders.cust_id = customers.cust_id) AS orders

相关子查询:设计外部查询的子查询。

任什么时候候只要列名可能有多义性,就必须使用这种语法(表名和列名由一个句点分隔)。


逐渐增长子查询来创建查询:首先,创建和测试最内层的查询。而后,用硬编码数据创建和测试外层查询,而且仅在确认它正常后才嵌入子查询。


子查询最多见的使用是在WHERE子句的IN操做符中,以及用来填充计算列。



第十五章联结表


关系表:关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各表经过某些经常使用的值(即关系设计中的关系)互相关联。


主键


外键:某个表中的一列,它包含另外一个表的主键值,定义了两个表之间的关系。


可伸缩性:可以适应不断增长的工做量而不失败。设计良好的数据库或应用程序称之为可伸缩性好。


联结:用来在一条SELECT语句中关联表。联结不是物理实体,它在实际的数据库表中不存在,它存在于查询的执行当中。

(联结是SQL中最重要最强大的特性。)



2016/2/24

建立联结

SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;

prod_name, prod_price在表products中,vend_name在表vendors中。

WHERE子句过滤,后面跟的是联结条件。


笛卡尔积:由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

SELECT vend_name, prod_name, prod_price
FROM vendors, products
ORDER BY vend_name, prod_name;

返回的数据用每一个供应商匹配了每一个产品。


全部联结都应由WHERE子句。


叉联结。


等值联结:基于两个表之间的相等测试。也称为内部联结

SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;

INNER JOIN指定两个表之间的关系,ON指定联结条件。


联结多个表。

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;


性能考虑:联结的表越多,性能降低越厉害。


用联结代替子查询

SELECT cust_name, cust_contact
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id AND orderitems.order_num = orders.order_num AND prod_id = 'TNT2';



第十六章建立高级联结


别名除了用于列名和计算字段外,SQL还容许给表名起别名。

给表名起别名的做用:

    缩短SQL语句;

    容许在单条SELECT语句中屡次使用相同的表。


缩短SQL语句;

SELECT cust_name, cust_contact
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id AND oi.order_num = o.order_num AND prod_id = 'TNT2';

表别名只在查询执行中使用。与列别名不同,表别名不返回到客户机。


自联结

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';

子查询

SELECT prod_id, prod_name
FROM  products
WHERE vend_id = (SELECT vend_id
FROM products
        WHERE prod_id = 'DTNTR');


不管什么时候对表进行联结,应该至少有一个列出如今不止一个表中(被联结的列)。

天然联结排除屡次出现,使每一个列只返回一次。

对表使用通配符(SELECT *),选择那些惟一的列。对全部其余表的列使用明确的子集来完成。

SELECT c.*, 
      o.order_num, o.order_date,
      oi.prod_id, oi.quantity, oi.item_price
FROM customers AS c,
    orders AS o,
    orderitems AS oi
WHERE c.cust_id = o.cust_id AND oi.order_num = o.order_num AND prod_id = 'FB';


外部联结:联结包含了那些在相关表中没有关联的行。

检索全部客户,包括那些没有订单的客户。

SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;

OUTER JOIN指定联结的类型,

必须使用LEFT或RIGHT关键字指定包括其全部行的表。(RIGHT:OUTER JOIN 右边的表,LEFT:OUTER JOIN左边的表)


使用带汇集函数的联结

SELECT customers.cust_name,
      customers.cust_id,
      COUNT(orders.order_num) AS num_ord
FROM customers INNER JOIN orders ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;


联结使用的要点

1)注意联结类型:内部联结、外部联结

2)使用正确的联结条件

3)应该老是提供一个联结条件,不然会得出笛卡尔积。



第十七章组合查询

并(union)/复合查询:执行多个查询,并将结果做为单个查询结果返回。


须要使用组合查询的两种基本状况:

1)在单个查询中从不一样的表返回相似结构的数据;

2)对单个表执行多个查询,按单个查询返回数据。


UNION的规则



2016/2/25

UNION从查询结果集中自动去除重复的行。

UNION ALL:返回全部匹配行,不取消重复的行。


在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出如今最后一条SELECT语句以后。

用来排序全部SELECT语句返回的全部结果。


使用UNION的组合查询能够应用不一样的表。



第十八章全文本搜索

Match()和Against()函数

查询扩展

布尔方式



第十九章插入数据

INSERT语句:插入(或添加)行到数据库表。


插入的几种方式:

1)插入完整的行;

2)插入行的一部分;

3)插入多行;

4)插入某些查询的结果。


INSERT INTO customers
VALUES(NULL,
'Pep E. LaPew',
'100 Main Street',
'Los Angeles',
'CA',
'90046',
'USA',
NULL,
NULL);

对每一个列必须提供一个值,若是某个列没有值,应该使用NULL,

各个列必须以它们在表定义中出现的次序填充。


编写依赖于特定列次序的SQL语句是很不安全的。

编写INSERT语句的更安全的方法:(更烦琐)(使用列的列表)

INSERT INTO customers(cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country,
cust_contact,
cust_email)
VALUES('Pep E. LaPew',
'100 Main Street',
'Los Angeles',
'CA',
'90046',
'USA',
NULL,
NULL);


不要使用没有明确给出列的列表的INSERT语句。


省略列:省略的列必须知足如下某个条件。

1)该列为定义容许NULL值。

2)在表定义中给出默认值。


LOW_PRIORITY,指示MySQL下降INSERT语句的优先级。


单条语句插入多个值:(列名相同)


插入检索出的数据:INSERT SELECT



第二十章更新和删除数据

UPDATE语句:更新(修改)表中的数据

使用UPDATE的两种方法:

1)更新表中特定行;

2)更新表中全部行;


UPDATE customers
SET cust_email = 'elmer@fudd.com'
WHERE cust_id = 10005;

WHERE过滤条件不能少,不然会更新整个表。


更新多个列

UPDATE customers
SET cust_name = 'The Fudds',
   cust_email = 'elmer@fudd.com'
WHERE cust_id = 10005;


IGNORE关键字:UPDATE语句中即便发生错误,也继续更新。


删除某个列的值,可设置它为NULL。


DELETE语句:删除数据。

1)从表中删除特定的行;(使用WHERE)

2)从表中删除全部行。


DELETE FROM customers
WHERE cust_id = 10006;


DELETE语句删除的是行,为了删除指定的列,使用UPDATE语句。


TRUNCATE TABLE语句:删除原来的表并从新建立一个表。速度比使用DELETE删除表中全部行块。


使用UPDATE和DELETE的四个习惯。


MySQL没有撤销按钮,使用UPDATE和DELETE时多加当心。

相关文章
相关标签/搜索