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

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 (xxx, yyy, 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笔记的更多相关文章

  1. SQL 笔记 By 华仔

    -------------------------------------读书笔记------------------------------- 笔记1-徐 最常用的几种备份方法 笔记2-徐 收缩数据 ...

  2. SQL笔记 --- 数据库设计步骤(转)

    SQL笔记 --- 数据库设计步骤 目录 总体设计过程需求分析概念结构设计逻辑结构设计数据库物理设计数据库实施数据库运行和维护 总体设计过程 0 » 下一篇:vim 命令集 posted @ 2012 ...

  3. SQL笔记1:SELECT及SELECT高级应用

      T-SQL笔记1:SELECT及SELECT高级应用 本章摘要 1:安装AdventureWorks 2:基本运算符和表达式 3:between 4:like 5:escape 6:TOP 7:G ...

  4. pl/sql 笔记之基础(上)

    由于公司中使用 oracle,而本人对存储过程一直也懵懵懂懂,故一周时间学习了一遍 pl/sql,在此记下笔记!!! 一.前提,pl/sql 是啥? 1.PL/SQL是一种高级数据库程序设计语言,该语 ...

  5. (2.2)【转】mysql的SQL笔记

    一千行 MySQL 详细学习笔记 IT技术思维 4月1日 ↑↑↑点上方蓝字关注并星标⭐「IT技术思维」 一起培养顶尖技术思维 作者:格物 原文链接:https://shockerli.net/post ...

  6. sql 笔记(mysql)

    Windows 安装mysql(zip包) 1,zip包解压到要安装目录 2,配置环境变量,Path后加mysql路径\bin 3,修改配置文件,mysql目录下my-default.ini base ...

  7. 深入浅出SQL笔记1–数据和表

    1.数据库的概念及组成 数据库是保存表和其他相关SQL结构的容器. 数据库是由各种各样的表构成的,一个数据库里面的表总是存在相互联系的关系. 数据库内的信息组成了表,表示由行和列构成的,行是一组能够描 ...

  8. SQL 笔记

    --查询某一列在哪个表里 SELECT name , object_id , type , type_desc FROM sys.objects WHERE object_id IN ( SELECT ...

  9. SQL笔记 - 解决CTE定位点类型和递归部分的类型不匹配

    在CTE递归测试,也就是部门名称拼接的时候,遇到了小问题: 登时就迷糊了:不都是取的是Unit表中的同一个列,相加之后类型就变了么? 难道是因为,系统知道这是在进行递归运算,但又不确定递归的层次,以及 ...

  10. SQL笔记----在一个关系表中操作列

    使用alter关键字,可以为一个表添加新的列. 比如: 给Persons的表中添加一列,名字为Birthday,类型是date. ALTER TABLE Persons ADD Birthday da ...

随机推荐

  1. Windows下bat命令

    一.简单批处理内部命令简介  1.Echo 命令 打开回显或关闭请求回显功能,或显示消息.如果没有任何参数,echo 命令将显示当前回显设置.    语法  echo [{on│off}] [mess ...

  2. C语言如何定义结构体

    原文地址 1. struct与typedef struct区别 struct是结构体的关键字,用来声明结构体变量如 struct  student {   char  num[10];      ch ...

  3. VHDL设计时参数定义的方法 例子

    -- SPtb LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_ ...

  4. boost库在工作(40)串行通讯

    现代的计算机技术进步很快,各种的通讯也日新月异,像USB.网络.蓝牙.WIFI等通讯技术飞速地出现,改变了整个计算机的通讯能力,速度已经达到GBit级别.但是有一种最原始的通讯方式,还是保留了30年, ...

  5. mojo 接口示例

    <pre name="code" class="python">use Mojolicious::Lite; use JSON qw/encode_ ...

  6. 《windows程序设计》学习_4.1:计时器(可用于扫雷)

    为了做一个逼真的扫雷,我的扫雷程序的位图都是从windowsXP下面的扫雷里来的.具体是怎么获取位图的呢?win8.1不给力,习惯了vc++6.0,所以虚拟机里装上了xp,用vc++6.0加载扫雷程序 ...

  7. cygwin在Windows8.1中设置ssh的问题解决

    为了在Windows 8.1上直接使用Linux环境和hadoop开发,装了cygwin,同时设置ssh无密码登录.   但正常ssh-keygen后复制到authorised_keys后登录出现提示 ...

  8. 【POJ】2492 A bug's life ——种类并查集

    A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 28211   Accepted: 9177 De ...

  9. hibernate中文查询时无查询结果

    原因很简单,问题在于我连接mysql用的url时,没有指定字符集,导致查询不到任何数据 问题出在 hibernate.xml配置文件中: 将 <property name="jdbcU ...

  10. freemaker

    FreeMarker模板文件主要由如下4个部分组成:  1,文本:直接输出的部分  2,注释:<#-- ... -->格式部分,不会输出  3,插值:即${...}或#{...}格式的部分 ...