当前位置:Gxlcms > 数据库问题 > Head First SQL笔记

Head First SQL笔记

时间:2021-07-01 10:21:17 帮助过:3人阅读

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笔记

标签:

人气教程排行