一、外键为某个表中的一列,它包含另外一个表的主键值,定义了两个表之间的关系。经过外键查找: 函数
SELECT vend_name, prod_name, prid_price FROM vendors, products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name; 性能
在引用的列可能出现二义性,必须使用彻底限定列名。 测试
若是没有用WHERE子句进行条件过滤则返回的结果是笛卡尔积,即两个表行的乘积。 spa
二、上条的语句所用的联结是等值联结,它基于两个表之间的相等测试,这种联结也成为内部联结。对于这种联结可使用不一样的语法: 排序
SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id; 索引
ANSI SQL规范首先INNER JOIN语法。 事务
三、SQL对一条SELECT语句中能够联结的表的数目没有限制,建立联结规则基本相同。 ip
但MySQL在运行时关联指定的每一个表以处理联结,这种处理可能很耗费资源,所以不要联结没必要要的表,联结的表越多性能降低越厉害。 内存
四、自联结 ci
加入想查询ID为DTNTR的物品相同生产厂家的其余物品,能够采用子查询的方式:
SELECT prod_id, prod_name FROM products
WHERE vend_id = ( SELECT vend_id FROM products WHERE prod_id ='DTNTR');
也能够采用自联结的方式:
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';
在查询中须要的两个表其实是相同的表,但对products的引用具备二义性,因此使用表别名。
自联结一般做为外部语句用来替代从相同表中检索数据时使用的子查询语句。虽然结果相同,但处理联结比处理子查询快不少。
五、外部联结
联结包含了那些在相关表中没有关联行的行:
SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;
在使用OUTER JOIN 时必须使用RIGHT或LEFT关键字指定包括没有关联行的表。LEFT指OUTER JOIN左侧的表,以此类推。
六、组合查询UNION
组合数条SQL查询:
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 ALL代替UNION。
对组合结果进行排序,只能使用一条ORDER BY子句,它必须出如今最后一条SELECT语句以后。
七、全文搜索
使用MATCH()和AGAINST(),MATCH()指定要搜索的列,AGAINST()指定匹配的文本。
搜索的列必须创建搜索索引,建立表时用FULLTEXT()包含列。
只有MyISAM引擎支持全文搜索,InnoDB不支持,而且汉语不具备词分隔符,因此不能返回全文搜索的结果,因此工做中应该不多用到。
八、插入
插入完整行,不指定列名插入
INSERT INTO customers
VALUES(value1,
value2,
......
valuen);
指定列名插入
INSERT INTO 表名(列名1,
列名2,
......,
列名n)
VALUES(value1,
valuen);
若是表的定义容许,则能够在INSERT操做中省略某些列,省略的列必须知足如下条件之一:
INSERT语句很耗时,并且可能下降等待处理的SELECT语句的性能。若是数据检索是最重要的,则能够经过在INSERT和INTO之间添加关键字LOW_PRIORITY,指示MySQL下降INSERT语句的优先级。一样适用于UPDATE和DELETE语句。
能够一条语句插入多行:
INSERT INTO 表名(列名1,
列名2,
......,
列名n)
VALUES(value1,
valuen),
(value1,
valuen);
九、插入检索出的数据 INSERT SELECT
INSERT INTO 表名(列名1,
......,
列名n)
SELECT 列名1,
......,
列名n
FROM 另外一个表名;
十、更新数据UPDATE
UPDATE 表名
SET 列名1=value1,
列名2=value2
WHERE 过滤条件;
若是用UPDATE语句更新多行,而且在更新这些行中的一行出现错误时,则整个UPDATE操做被取消;若是想即便发生错误也继续进行更新使用:UPDATE IGNORE 表名。
十一、删除数据
DELETE FROM 表名
WHERE 过滤条件;
若是想从表中删除全部行,不要使用DELETE。可以使用TRUNCATE TABLE语句,它完成相同的工做,但速度更快。TRUNCATE TABLE实际是删除原来的表并从新建立一个表,而不是逐行删除表中的数据。
在使用UPDATE或DELETE语句前,应该先用SELECT带相同的WHERE子句进行测试,保证它过滤的是正确的记录。
十二、建立表
CREATE TABLE customers (
cust_id int(11) NOT NULL AUTO_INCREMENT,
cust_name char(50) NOT NULL,
cust_address char(50) DEFAULT NULL,
cust_city char(50) DEFAULT NULL,
cust_state char(5) DEFAULT NULL,
cust_zip char(10) DEFAULT NULL,
cust_country char(50) DEFAULT NULL,
cust_contact char(50) DEFAULT NULL,
cust_email char(255) DEFAULT NULL,
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10006 DEFAULT CHARSET=latin1
建立的表名必须不存在,若是存在将报错。若是仅想在一个表不存在时建立它,应该使用CREATE TABLE IF NOT EXISTS 表名。
是否能够为NULL设置,NULL为默认值。主键只能使用不容许为NULL的列。
1三、AUTO_INCREMENT
每一个表只能有一个AUTO_INCREMENT列,并且它必须被索引。
若是一个列被指定为AUTO_INCREMENT,它还能够被赋予特殊值,在INSERT语句中指定值,而且保证它是惟一的便可。该值将被用来替代自动生成的值,后续的增量将开始使用该手工插入的值。
使用last_insert_id()函数能够返回最后一个AUTO_INCREMENT值。
1四、经过DEFAUTL关键字能够指定列的默认值。MySQL不容许使用函数做为默认值,它只支持常量。
建议使用默认值而不是NULL。
1五、引擎类型
DBMS使用内部引擎管理和处理数据。MySQL具备多种引擎:
引擎能够混用,不一样的表使用不一样的引擎。可是外键不能夸引擎。
1六、更新表ALERT TABLE
添加一个列:ALTER TABLE vendors ADD vend_phone CHAR(20);
删除一个列:ALTER TABLE vendors DROP COLUMN vend_phone;
定义外键:ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_oders
FOREIGN KEY (order_num) REFERENCES orders(order_num);
1七、删除表DROP TABLE 表名
1八、重命名表 RENAME TABLE 原表名 TO 新表名;