码迷,mamicode.com
首页 > 数据库 > 详细

Head First SQL笔记

时间:2015-06-28 16:59:10      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

看的时候总结了一下,如下:

 

Chapter 1:

创建数据库
CREATE DATABASE database_name;
使用数据库
USE database_name;
创建表
CRATE TABLE table_name
(
 col2 VAR_TYPE,
 col1 VAR_TYPE NOT NULL DEFAULT xxx,
);
删除表
DROP TABLE table_name;
显示表
DESC table_name;
DESCRIBE table_name;
插入数据
INSERT INTO table_name
(col1, col2)
VALUES (col1_val, col2_val)
还有其它形式的插入数据方式,不一一列举啦
 
 
Chapter 2:
查询
SELECT * FROM table_name [WHERE col1 = xxxx AND col2 = yyyy]
 
SELECT col1, col2 col3 FROM table_name [WHERE col1 = xxxx];
 
SELECT col1, col2 col3 FROM table_name [WHERE col1 IS NULL];
SELECT col1, col2 col3 FROM table_name [WHERE col1 IS NOT NULL];
 

SELECT col1, col2 col3 FROM table_name [WHERE col1 LIKE xxxx];

SELECT col1, col2 col3 FROM table_name [WHERE NOT col1 LIKE xxxx];
 
SELECT col1, col2 col3 FROM table_name [WHERE col1 BETWEEN xxx AND yyy];
SELECT col1, col2 col3 FROM table_name [WHERE NOT col1 BETWEEN XXX AND yyy];
 
SELECT col1, col2 col3 FROM table_name [WHERE col1 IN (xxxyyy, ZZZ)];
SELECT col1, col2 col3 FROM table_name [WHERE col1 NOT IN (xxx, yyy, ZZZ)];
 
SELECT col1, col2 col3 FROM table_name [WHERE NOT col1 LIKE xxxx AND NOT col2 = yyyy];
 
比较运算符:
=
>
>=
<
<=
<> 不等于
通配符:
% 匹配任意多个字符
_ 匹配任意一个字符
 
字符串转义字符:
\‘
‘‘
上面两个都表示单引号
 
表示字符串时不要使用双引号,双引号用来在PHP中表示SQL语句使用
 
 
Chapter 3:
DELETE 删除操作
DELETE FROM table_name;
DELETE FROM table_name WHERE col1 = xxxx;
 
WHERE语句的用法与SELECT语句中的一样
 
 
UPDATE 更新操作
UPDATE table_name SET col1 = xxxx, col2 = yyyy [WHERE col1 = zzzz]
 
WHERE语句的用法与SELECT语句中的一样
 
Chapter 4:
1NF:每个列必须是原子的,第个行必须有主键。表中没有重复类型的值[不能有数组]。
 
SHOW 命令,用法请自己体会:
SHOW CREATE TABLE table_name;
SHOW CREATE DATABASE db_name;
SHOW COLUMNS FROM table_name;
SHOW INDEX FROM table_name;
SHOW WARNINGS;
 
指定主键(NOT NULL不是必须的,但是主键加上这个限制是应该的):
CREATE TABLE table_name(
     col1 COL1_TYPE NOT NULL,
     col2 COL2_TYPE,
     PRIMARY KEY (col1)
);
指定自动递增:
CREATE TABLE table_name(
     col1 COL1_TYPE NOT NULL AUTO_INCREMENT,
     col2 COL2_TYPE,
     PRIMARY KEY (col1)
);
 
每个表中只有一列可以被定义为AUTO_INCREMENT
 
 
Chapter 5:
ALTER 改变表
修改表名称:
ALTER table_name1 RENAME TO table_name2;
 
增加一列:
ALTER TABLE table_name ADD COLUMN col_name COL_TYPE FIRST;
指定位置还可以使用:
SECOND, AFTER col_name, BEFORE col_name
 
增加主键:
ALTER TABLE table_name ADD PRIMARY KEY (col_name);
 
修改列:
ALTER TABLE table_name CHANGE COLUMN orig_name ,new_name NOT NULL AUTO_INCREMENT;
(CHANGE用来重新定义一个列,所以后面的部分跟重新定义一个列是一样的)
 
只改变数据类型,不改变列名称:
ALTER TABLE table_name MODIFY col_name NEW_TYPE;
 
删除列:
ALTER TABLE table_name DROP COLUMN col_name;
 
一些字符串处理函数:
LEFT(col_name, count)
RIGHT(col_name, count)
SUBSTRING(col_name, fs, count) 返回第count个fs之前的所有字符
UPPER(col_name)
LOWER(col_name)
REVERSE(col_name)
LTRIM(col_name) 删除最左边的空白
RTRIM(col_name)
LENGTH(col_name)
其中的col_name都可以直接换成字符串
 
 
ALTER无法直接改变列的顺序,需要先删除之前的列,再把这个列插入到想要的位置。
 
 
Chapter 6:
CASE:
UPDATE table_name SET col_name=
WHEN
 CASE col1 = val1 THEN val11
 CASE col2 = val2 THEN val22
 CASE col3 = val3 THEN val33
 ELSE val_default
END;
 
ORDER BY:
SELECT col1, col2 WHERE col3 = XXXX
ORDER BY col1 DESC, col2 ASC;
先按col1排序,再按col2排序,也可以只选一个列来排序,可以指定升序(ASC, ASCENDING)或降序(DESC, DESCENDING)
 
数值处理函数:
SUM(col_name)
AVG(col_name)
MIN(col_name)
MAX(col_name)
COUNT(col_name)
这些函数会忽略掉NULL的存在
 
分组:
GROUP BY col_name
 
去重:
DISTINCT col_name
 
限制个数:
LIMIT n;
LIMIT m, n;从第m个开始的n个
 
 
Chapter 7:
外键:
外键引用的主键被称为父键
外键所在的表被称为父表
外键的值可以为NULL
 
创建带有外键的表:
CREATE TABLE table_name 
(
col1 TYPE,
col2 TYPE,
CONSTRAINT parent_table parent_col_name
FOREIGN KEY (col2)
REFERENCE parent_table (parent_col_name)
);
 
其它约束:
UNIQUE
CHECK(MySQL不支持)
 
通过分表来处理违反第一范式的情况
通过建中间表来处理多对多的情况
 
组合键:两个以上列组成的主键。
 
2NF:符合1NF的基础上,没有部分函数依赖。
已经符合1NF的表,如果只有一个主键的话,肯定符合2NF。
 
3NF:符合2NF的基础上,没有传递函数依赖。
(传递函数依赖是指非键列之间的依赖关系 。)
 
 
Chapter 8:
AS指定别名:
SELECT col_name AS new_name; 指定列别名
SELECT col_name FROM table_name AS new_name; 指定表别名
其中的AS也可以省略,注意别名和原名之间不能有逗号隔开
 
INNTER JOIN内联接:
有四种内联接,CROSS JOIN, QEUIJOIN, NON-QEUIJOIN, NATURAL-JOIN
SELECT table1.col1, table2.col2 FROM table1 CROSS JOIN table2; 其中CROSS JOIN可以用逗号代替
SELECT table1.col1, table2.col2 FROM table1 INNER JOIN table2 ON some_condition;
equijoin相等连接:
SELECT table1.col1, table2.col2 FROM table1 INNER JOIN table2 ON table1.coln = table2.colm;
non-equijoin不等连接:
SELECT table1.col1, table2.col2 FROM table1 INNER JOIN table2 ON table1.coln <> table2.colm;
natural-join自然连接(两个表里面有相同的列时可用):
SELECT table1.col1, table2.col2 FROM table1 NATURAL JOIN table2;
 
相等连接及不等连接中的ON换成WHERE也一样可以工作
 
 
Chapter 9:
SELECT col_name FROM table_name WHRE col_name IN (SELECT col_name2 FROM table_name2);
其它的子查询关键字还有NOT IN, EXISTS, NOT EXISTS, =, <>
 
子查询还可以用于选择列中
SELECT col1, col2, (sub_query) ...;
 
非关联子查询指子查询可以独立于外层查询独立的运行,关联子查询的意思刚好相反。尽量使用非关联子查询,可以加快查询的速度。
 
一般来说子查询应该只返回一列的结果,当用于IN, NOT IN, EXISTS, NOT EXISTS时可以返回多列的结果。
 
Chapter 10:
左外联接:
SELECT table1.col1, table2.col2 FROM table1 LEFT OUTER JOIN table2;
使用左表中的每一行与右表中的每一行比较,当匹配时则在结果中增加一行,如果左表中的某一行与右表中的所有行都不匹配,则也输出一行,不过结果中有NULL。左表中的第一行在输出结果中都会至少出现一次。
 
右外联接只是联接的方向变在了从右向左连接,其本质与左外联接一样。在工作中可以只使用一种外联接方式。
 
自引用外键:引用同一张中主键的列。
 
自己与自己JOIN(与其它内联接的方式相同,只要在右键的地方写上自己就行了,但是一般要对同一个键设两个不同的别名):
SELECT t1.col_name, t2.col_name FROM table1 AS t1 INTER JOIN table2 as t2 ON condition;
 
UNION(组合不同的搜索结果):
SELECT col_name FROM table1 UNION
SELECT col_name FROM table2 UNION
SELECT col_name FROM table3
ORDER by col_name;
这个命令会自动去重,如果要保留重复的结果,可以使用UNION ALL命令。UNION命令要求搜索出来的列数必须相同,且列类型要相同。SEL之间的顺序不会影响结果,即使不加ORDER BY命令。
 
 
INTERSECT和EXCEPT:
INTERSECT用来取两次SELECT的交集,即两个都有的部分。EXCEPT用来取两次SELECT的差集,即在一个的结果中但是不在另一个结果中的部分。
这两条命令不被MySQL支持,所以不写具体形式了。
 
在SELECT命令中,基本上子查询都可以用联接来代码。但是子查询还可以用UPDATE INSERT DELETE命令中。
 
用SELECT的结果来创建表:
CREATE TABLE AS SELECT ...;
 
Chapter 11:
CHECK约束:
用来确保插入到数据库中的列满足一定的条件(不被MySQL支持,所以不写具体形式了);
 
创建视图:
CREATE VIEW view_name AS 
SELECT ...;
 
跟用SELECT的结果创建一个新表的命令相似,事实上,创建的视图也可以当作 一个新表来使用,可以使用SELECT语句来从中选择任意列,语法与普通SELECT完全一样:
SELECT * FROM view_name;
view_name部分会被替换成创建view时SELECT命令,作为这条SELECT语句中的子查询。
 
视图也可以用于UPDATE, INSERT, DELETE命令中,但是一般不推荐这样用。不过有一个hack功能却值得一试,就是用视图的CHECK OPTION来模仿其它数据库的CHECK约束。
 
CREATE VIEW view_name AS SELECT col1, col2 FROM table_name WHERE condition WITH CHECK OPTION;
以后对这个视图执行INSERT操作的话就会检查condition条件是否满足。
 
删除一个视图:
DROP VIEW view_name;
 
使用SHOW TABLES;命令可以查看当前数据库中的所有表和视图。
 
当一表出现在一个视图的创建命令中时,如果这个视图没有被删除,则这个表也不能被删除。
 
TRANSCATION:
事务是一组SQL命令,要么都被执行,要么都不执行,即具有原子性。且事务在提交之前可以回滚,就像这些语句一条都没有执行一样。
 
START TRANSACTION;
sql command;
sql command;
ROLLBACK;
 
START TRANSACTION;
sql command;
sql command;
COMMIT;
 
使用ROLLBACK会撤销START TRANSCATION;后面的所有语句。使用COMMIT命令会把START TRANSCATION命令后面的语句原子性都提交到数据库中。
 
MySQL中,只有BDB和InnoDB引擎才支持事务。事务是使用日志来实现的,在执行ROLLBACK或COMMIT之前,事务被存在日志中。
 
Chapter 12:
设置root密码:
SET PASSWORD FOR ‘root‘@‘hostname‘ = PASSWORD(‘new_password‘);
 
CREATE USER user_name IDENTIFIED BY ‘password‘;
使用这种方式创建的用户是没有任何权限的,也就是说,什么都干不了。
 
GRAND:
GRAND XXX ON table_name TO user_name1, username2;
GRAND XXX ON table_name TO user_name WITH GRANT OPTION; 用户还可以把这个权限再授予其它人
XXX可以是UPDATE, INSERT, DELETE, SELECT;
 
对于SELECT权限,还可以写成SELECT(col_name)的形式,表示只可以查看col_name列。
 
REVOKE:
REVOKE XXX ON table_name FROM username [CASCADE];
如果username有GRANT OPTION,且已经把权限授予了其它人,则这个命令也会把他授予其它人的这个权限一并撤销掉。
如果使用RESTRICT选项替代CASCADE选项,则在上面的情况下,会报错。
 
还可以只撤销再授予权限的权限:
REVOKE GRANT OPTION ON xxx ON table_name FROM username;
副作用是如果该用户已经把这个权限授予了他人,则会一并收回他授予他人的这个权限。
 
可以用通配符:
GRANT SELECT ON database_name.* TO user_name;
某个数据库中的所有表
GRANT SELECT ON *.* TO user_name;
所有数据库中所有表
 
可以创建角色,对角色授予权限,再把角色授予用户,MySQL不支持角色,所以这里就不具体写了。
 

Head First SQL笔记

标签:

原文地址:http://www.cnblogs.com/clpszpp/p/head-first-sql-notes.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!