第二部分 1NF ALTER

阅读更多

一、原子性

    数据根据需求,被分割成最小块。分割必须是创建有效率的表所需的。如果不需要增加额外的列,就不要因为可增加而增加。

    具有原子性的数据的列不会有多个类型相同的值。例如列ingredient中,一行可能同时有:milk、oil、egg三个值,这样就不具备原则性了。试想,如何查找列ingredient中的egg呢?

    具有原子性的表不会含有多个表达同一信息的列。例如一个表中含有列student1、student2,、student3,那么这个表就不具备原子性。

 

二、主键

    主键是表中的某列,它可以让每一条记录具有唯一性。

    主键不能为NULL,其值不能被修改;插入新纪录时必须给出主键的值;另外,主键还应该简洁,只含独一无二的内容,不该有其它内容。 另外,可以单独创建一个ID列来存放主键。

   

CREATE TABLE my_contacts                  # 创建表联系人  
    ( 
    contact_id INT NOT NULL; 
    name VARCHAR(30) NOT NULL,  
    gender CHAR(1) NOT NULL DEFAULT 'M',  #'M'或'F'  
    birthday DATE,                        # 1980-09-15  
    phone VARCHAR(11) NOT NULL,            
    information BLOB ,
    PRIMARY KEY(contact_id) 
    );  

 

CREATE TABLE my_contacts                  # 创建表联系人  
    ( 
    contact_id INT NOT NULL AUTO_INCREMENT; 
    name VARCHAR(30) NOT NULL,  
    gender CHAR(1) NOT NULL DEFAULT 'M',  #'M'或'F'  
    birthday DATE,                        # 1980-09-15  
    phone VARCHAR(11) NOT NULL,            
    information BLOB ,
    PRIMARY KEY(contact_id) 
    );  

 一个表中只能有一个AUTO_INCREMENT,且只能是INTEGER型的。

    如果主键是AUTO_INCREMENT,那么插入时可以不写明主键的值,主键的值会自动加一。当写明主键的值时,如果主键的值在表中已经有了,那么插入会失败。

    1NF:具有原子性和主键。

 

三、SHOW命令

SHOW TABLE my_contacts;
SHOW CREATE TABLE my_contacts;  #显示创建表的语句
SHOW COLUMNS FROM my_contacts;  #显示表的所有列及其语句类型
SHOW CREATE DATABASE basename;
SHOW INDEX FROM my_contacts;    #显示索引列及索引类型
SHOW WARNINGS;                  #得到更加确切的警告内容

 四、ALTER命令

ALTER一般与CHANGE、MODIFY、ADD、DROP搭配来修改表的结构。

ALTER TABLE my_contacts
ADD COLUMN phone VARCHAR(10);    #默认添加列放在最后

ALTER TABLE my_contacts
ADD COLUMN phone VARCHAR(10) AFTER name;  #添加列phone放在name后面

ALTER TABLE my_contacts
ADD COLUMN id INT NOT NULL AUTO_INCREMENT FIRST,    #添加列放在最前面
ADD PRIMARY KEY(id);      #添加主键

 除了FIRST、AFTER name外,还可以用BEFORE name、LAST、SECOND、THIRD、FIFTH等。

修改表名:

ALTER TABLE projeckt
RENAME TO project_list;

删除某一列

ALTER TABLE project_list
DROP COLUMN date;

CHANGE命令

    CHANGE可以修改表名、数据类型、设置主键、改变AUTO_INCREMENT等。

    如果列discription为VARCHAR(30),列name为VARCHAR(10),可以用CHANGE同时修改名称与数据。
修改数据类型时,当数据不兼容,命令会执行失败;当数据兼容时,可能会发生数据丢失,例如VARCHAR(10)改为CHAR(1),'Bonzo'会改为'B'。

ALTER TABLE project_list
CHANGE COLUMN number
project_id INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY(project_id);    #将列number改为project_id并设为主键

ALTER TABLE project_list
CHANGE COLUMN discription project_desc VARCHAR(70);  #改变列名和数据类型
ALTER TABLE project_list
CHANGE COLUMN name project_name VARCHAR(30);

ALTER TABLE your_table
CHANGE your_id your_id INT(11) NOT NULL AUTO_INCREMENT; #添加AUTO_INCREMENT
ALTER TABLE your_table
CHANGE your_id your_id INT(11) NOT NULL ;  #删除AUTO_INCREMENT

 

CHANGE可以用来只改变数据类型,但用MODIFY更好。

ALTER TABLE project_list
CHANGE COLUMN project_desc project_desc VARCHAR(100);
ALTER TABLE project_list
MODIFY COLUMN project_desc VARCHAR(100);

 

一个表一旦建立,其列的先后顺序就不能改变,用MODIFY改变列的顺序时,实际是SQL软件背后将当前数据缓存,然后删除要移动的列,再用ALTER指定添加位置。

ALTER TABLE hooptie
RENAME TO car_table,
ADD COLUMN car_id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY(car_id),
ADD COLUMN VIN VARCHAR(16) AFTER car_id,
CHANGE COLUMN mo model VARCHAR(20),
MODIFY COLUMN color AFTER model,
MODUFY COLUMN year SIXTH,
CHANGE COLUMN howmuch price DECIMAL(7,2)

 

五、CASE

CASE可以与SELECT、INSERT、DELETE、UPDATE搭配。

UPDATE movie_table
SET category=
CASE 
  WHEN drama='T' THEN 'drama'
  WHEN comedy='T' THEN 'comedy'
  WHEN action='T' THEN 'action'
  WHEN gore='T' THEN 'gore'
  WHEN scifi='T' THEN 'scifi'
  WHEN for_kids='T' THEN 'family'
  WHEN catoon='T' THEN 'family'
  ELSE 'misc'
END    #后面还可以加上WHERE之句

 

六、ORDER BY

SELECT title ,category FROM movie_table
WHERE title LIKE 'A%' AND category='family'
ORDER BY title;

SELECT title ,category,purchases FROM movie_table
ORDER BY category,purchases ;    #设置第二排序

SELECT title ,category,purchases FROM movie_table
ORDER BY category ASC,purchases DESC;    #ASC是默认升序,DESC是降序

 ORDER BY的顺序为:!"#$%&'()*+,./0123:;<=>?@ABCD[\]^_`abcd~

 

七、SELECT与函数

字符串函数:

SELECT RIGHT(location,2) FROM mycontacts;  #从列location(字符串类型)选取两个字符
SELECT SUBSTRING_INDEX(location,',',1) FROM my_contacts;  #取列location中第1个‘,’前面的所有内容
UPDATE mycontacts SET state=RIGHT(location,2); 

 还有:SUBSTRING(string,start,lenth)获取子字符串。SELECT SUBSTRING('San Antonio,TX',5,3)。
           UPPER(string)、LOWER(string)转大小写。SELECT UPPER('Abc')。
           REVERSE(string)反转字符串。SELECT REVERSE('hello')。
           LTRIM(string)、RTRIM(string)清除左右的空格。SELECT LTRIM('  abc').
           LENGTH(string)获取字符个数。SELECT LENFTH(' china ')。
       注意:字符串函数并没有改变表中的内容,它只是修改了查询结果。

非字符串函数:

SELECT SUM(sales) FROM cookie_sales 
        WHERE name='Nicole';#name为Nicole的sales之和
SELECT name,SUM(sales) FROM cookie_sales
       GROUP BY name ORDER BY SUM(sales) DESC; #根据name分类求sales和,并用和排序
SELECT name,AVG(sales) FROM cookie_sales
       GROUP BY name ; #根据name分类求平均
SELECT name,MAX(sales) FROM cookie_sales
       GROUP BY name ; #每一种name的最大sales
SELECT name,MIN(sales) FROM cookie_sales
       GROUP BY name ; #每一种name的最小sales
SELECT COUNT(sales_date)
       FROME cookie_sales;#返回多少个sales_date不为null
SELECT DISTINCT sales_date FROM cookie_sales
       ORDER BY sales_date; #DISTINCT是关键字不是函数,选出不同的值
SELECT COUNT(DISTINCT sales_date) FROM cookie_sales;

 八、LIMIT

SELECT name,SUM(sales) FROM cookie_sales
GROUP BY name ORDER BY SUM(sales) DESC
LIMIT 2;   #只显示两行记录
SELECT name,SUM(sales) FROM cookie_sales
GROUP BY name ORDER BY SUM(sales) DESC
LIMIT 0,4;   #从第0条记录开始显示4条记录
SELECT name,SUM(sales) FROM cookie_sales
GROUP BY name ORDER BY SUM(sales) DESC
LIMIT 1,1;   #只显示第2条记录

你可能感兴趣的:(1NF,ALTER)