最近一段时间,翻阅了《SQL学习指南》这本书,发现了一些值得记下的使用技巧和容易忽视的知识点
一·关于查询:
1.1·可以通过在SELECT后面加上DISTINCT来去除结果集中重复的行。默认的SELECT后面适用的是ALL关键字。
1.2·对于DISTINCT的使用,执行时会先对结果集进行排序,比较耗时。所以不必要的时候应该减少使用。
1.3·表分为三类:永久表、临时表、虚拟表(视图)。可以通过CREATE VIEW EMP_VW AS SELECT * FROM EMPLOYEE_来创建名为EMP_VW 的视图。
1.4·使用虚拟表:SELECT * FROM EMP_VW 。
1.5·ORDER BY 1 表明使用返回结果的第一列进行排序。
二·关于过滤:
2.1·所有的SQL,除了INSERT外,都可以使用WHERE进行数据过滤。
2.2·BETWEEN......AND...... 对字符串进行排序,实际是按照字符串在所使用字符集内顺序进行排序的。
2.3·REGEXP 在MYSQL中,可以使用该关键字来通过正则表达式对数据进行验证。Oracle中格式为REGEXP_LIKE 。SQL Server中,可以直接写在LIKE关键字后面。
2.4·两个NULL,不能进行相等的判断。如果数据中存在NULL是,通过 列名 != 值 的形式,不能取到值为NULL的数据。
三·多表查询:
3.1·交叉查询 CROSS JOIN (取得笛卡尔积)。
3.2·内连接 INNER JOIN ,对于内连接连接的两个表,只有两张表中通过连接条件的数据行,才能够查询出来。
3.3·关于SQL的连接顺序:SQL是一种非过程化语言,对于FROM自己中级联的各个表,SQL会根据表内数据行的数量自动进行重新排序,可以通过关键字指定级联的先后顺序。
3.4·自连接 对于表自身进行连接。例如 地区级联,通过地区的PARENT_ID_,级联他自身的主键ID_ 。
四·使用集合:
4.1·UNION和UNION ALL操作。UNION操作会去除重复的行,而UNION ALL则不会去除重复的行。
4.2·INTERECT和INTERECT ALL操作。取交集(去重,不去重)。
4.3·EXCEPT 和 EXCEPT ALL 操作。集合差(去重,不去重)。
4.4·使用UNION时,如果需要排序,只能对UNION中第一个表中字段名进行排序。所以,不要将两张表的列名写成一样的。
4.5·复合查询的顺序是自顶向下进行的,其中INTERECT的优先级最高。
五·数据转换以及生成:
5.1·当存入数据库中的字符串超过我们设定的长度时,数据库会有以下两种处理方式:
一、添加到数据库,对字符串进行截串操作,并提示警告信息。(ANSI)
二、抛异常。(STRICT)
对于处理的模式,我们可以通过 SELECT @@session.sql_mode;来进行查询。我们还可以通过 SET SQL_MODE = 'ANSI'; 来设定SQL模式。
5.2·在查询语句中使用char()函数可以取得字符对应的ASCII码,通过ASCII()函数可以通过ASCII码取得对应字符。
5.3·Mysql中使用CONCAT('exp1','exp2','exp3'....)来进行字符串的连接。
5.4·length(colunmName) 。 在length(col)函数中放入列的字段名,可以返回该列的字符串长度。对于MySQL,Oracle中,char类型的列中存放的字符串,只用空格填充向右补齐,但在获取数据的时候,会自动删除掉尾端的空格。
5.5·position('character' IN vchar_fld).找出字符串character在vchar_fld中的位置,若找不到,则返回0 。