MySQL必知必会—表操做篇

MySQL必知必会—概念篇mysql

MySQL必知必会—安装应用篇git

MySQL必知必会—检索数据篇github

MySQL必知必会—联结表和高级查询篇sql

MySQL必知必会—文本搜索篇数据库

下面用到的数据库文件可在 mysql_scripts 找到。


建立和操纵表

建立表

利用 CREATE TABLE 建立表,必须紧跟着给出新表的名字,而后是表列的名字和定义,用逗号分隔。segmentfault

NULL 值

NULL 值就是没有值或缺值。容许 NULL 值的列也容许在插入行时不给出该列的值。 NOT NULL 即不容许 NULL 值的列不接受该列没有值的行,在插入或更新行时,该列必须有值。NULL 是默认设置,若是不指定 NOT NULL,则认为指定的是 NULL。安全

主键

主键必须是惟一的,即表中的每一个行必须具备惟一的主键值,若是主键使用单个列,则它的值必须惟一。若是使用多个列,则这些列的组合值必须惟一。服务器

使用相似 PRIMARY KEY (id) 的语句来定义。为建立由多个列组成的主键,应该以逗号分隔的列表给出各列名,例如 orderitems 表的建立用到的 PRIMARY KEY (order_num, order_item)函数

主键能够在建立表时定义,或者在建立表以后定义。性能

主键为惟一标识表中每一个行的列,主键中只能使用不容许 NULL 值的列。

AUTO_INCREMENT

每次执行一个 INSERT 操做时, MySQL 自动对该列增量。

每一个表只能容许一个 AUTO_INCREMENT 列,并且它必须被索引(好比经过使用它成为主键)

在执行 INSERT 时能够给 AUTO_INCREMENT指定一个值,只要它是至今为止惟一的就行,该值将被用来替代自动生成的值。后续的增量将开始使用该手工插入的值。

last_insert_id() 这个函数能返回最后一个 AUTO_INCREMENT 值

指定默认值

列定义中的 DEFAULT 关键字指定。 MySQL 跟大多数 DBMS 同样, 不容许使用函数做为默认值,它只支持常量。

引擎类型

大多数时候, CREATE TABLE 语句全都以 ENGINE=InnoDB 语句结束。MySQL具备多种引擎,这些打包的多个引擎都隐藏在 MySQL 的服务器内,全都能执行 CREATE TABLE 和 SELECT 等命令。这些引擎具备各自不一样的功能和特性,为不一样的任务选择正确的引擎能得到良好的功能和灵活性。

InnoDB 是一个可靠的事务处理引擎,它不支持全文本搜索。

MyISAM 是一个性能极高的引擎,它支持全文本搜索,但不支持事务处理

MEMORY 在功能等同于 MyISAM,但因为数据存储在内存(不是磁盘)中,速度很快(特别适合用于临时表)

########################
# 看一下 customers 表的建立
########################
CREATE TABLE customers
(
  cust_id      int       NOT NULL AUTO_INCREMENT,
  cust_name    char(50)  NOT NULL ,
  cust_address char(50)  NULL ,
  cust_city    char(50)  NULL ,
  cust_state   char(5)   NULL ,
  cust_zip     char(10)  NULL ,
  cust_country char(50)  NULL ,
  cust_contact char(50)  NULL ,
  cust_email   char(255) NULL ,
  PRIMARY KEY (cust_id)
) ENGINE=InnoDB;

更新表

为了更新表定义,可以使用 ALTER TABLE 语句。

### vendors 表中增长 vend_phone 列
ALTER TABLE vendors ADD vend_phone CHAR(20);

### 删除刚刚增长的 vend_phone 列
ALTER TABLE vendors DROP COLUMN vend_phone;

### ALTER TABLE 常见的用途就是定义外键
ALTER TABLE products ADD CONSTRAINT fk_products_vendors FOREIGN KEY (vend_id) REFERENCES vendors (vend_id)

删除表

DROP TABLE customers2;

重命名表

### 重命名一个表
RENAME TABLE customers2 TO customers;

### 重命名多个表
RENAME TABLE backup_customers TO customers,backup_vendors TO vendors;

注意

  • 建立新表时,指定的表名必须不存在,不然将出错。若是仅想在一个表不存在时建立它,应该在表名后面给出 IF NOT EXISTS。
  • 使用 ALTER TABLE 要极为当心,应该在进行改动以前作一个完整的备份(模式和数据的备份)


插入数据

插入完整的行

### 以下的语句中,对每一个列必须提供一个值,若是某个列没有值,应该使用 NULL 值(假设表容许对该列指定空值)。每一个列必须按照顺序给出,自动增量的值也不能忽略,并且若是不想赋值,就须要指定为 NULL 。
INSERT INTO customers VALUES( NULL, 'Pep E. LaPew', '100 Main Street', 'Los Angeles', 'CA', '90046', 'USA', NULL, NULL);

上面的语法应该避免使用,由于不安全,建议用下面的语句,能够不按照次序填充,只要保证 VALUES中的次序跟前面给出的列名次序一致就行。

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

插入多个行

### 可使用多条 INSERT 语句,甚至一次提交它们,每条语句用一个分号结束。
INSERT INTO customers(cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country) VALUES('Pep E. LaPew','100 Main Street','Los Angeles','CA','90046','USA');INSERT INTO customers(cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country) VALUES('M. Martian','42 Galaxy Way','New York','NY','11213','USA');

### 或者每条 INSERT 语句中的列名(和次序)相同,能够以下组合语句
INSERT INTO customers(cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country) VALUES('Pep E. LaPew','100 Main Street','Los Angeles','CA','90046','USA'), ('M. Martian','42 Galaxy Way','New York','NY','11213','USA');

注意

  • 在 INSERT 操做中能够省略某些列,省略的列必须知足:该列定义为容许 NULL 值(无值或者空值),或在表定义中给出默认值,这表示若是不给出值,将使用默认值,不然插入时省略会报错。
  • 可使用 INSERT LOW PRIORITY INTO 来下降插入语句的优先级。


更新数据

### 更新id是10009客户名字的邮箱。
UPDATE customers SET cust_name = 'The Fudds', cust_email = 'elmer@fudd.com' WHERE cust_id = 10009;

### 为了删除某个列的值,可设置它为 NULL(假定表定义为容许 NULL 值)
UPDATE customers SET cust_email = NULL WHERE cust_id = 10009;

注意

  • 使用 UPDATE 时,必定不能省略 WHERE 子句,不然就会更新表中的全部行。
  • UPDATE 操做若是报错,则整个UPDATE操做被取消,错误发生前更新的全部行被恢复到它们原来的值,若是想发生错误的时候也继续进行更新,可使用 IGNORE 关键字 UPDATE IGNORE customers


删除数据

### 删除10011这一行
DELETE FROM customers WHERE cust_id = 10011;

注意

  • 使用 DELETE 时,必定不能省略 WHERE 子句,不然就会删除表中的全部行。即便删除全部行, DELETE 也不会删除表自己。
  • 若是想从表中删除全部行,不要使用 DELETE。可使用 TRUNCATE TABLE 语句,速度更快(TRUNCATE 实际是删除原来的表并从新建立一个表,而不是逐行删除表中的数据)。

一个持续更新的github笔记,连接地址:Front-End-Basics,能够watch,也能够star。

此篇文章的地址:MySql必知必会

相关文章
相关标签/搜索