一、原子性
数据根据需求,被分割成最小块。分割必须是创建有效率的表所需的。如果不需要增加额外的列,就不要因为可增加而增加。
具有原子性的数据的列不会有多个类型相同的值。例如列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条记录