【年薪百万之IT界大神成长之路十一】一篇就懂、带你从头到尾梳理SQL(基础篇)

 

[catalog]

 
  1.认识 SQL
  2. SQL 语言分类
  3. LIKE 模糊查询
  4. AS 别名
  5. UNION & JOIN 集合连接
  6. CONSTRAINT 约束
  7. INDEX 索引
  8. SEQUENCE / AUTO_INCREMENT 序列对象 / 自增列
  9. VIEW 视图
  10. FUNCTION 函数
  【每日一面】DROP、TRUNCATE、 DELETE 的区别

 


1.认识 SQL 

SQL(Structured Query Language)结构化查询语言是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。SQL 对大小写不敏感,SELECT 与 select 是相同的。

  • Oracle角色权限
  • .connect 临时用户,简单权限,只可以登录,与服务器建立连接会话session的权限,不可以创建数据库结构
  • .resource 用户可以创建他们自己的表,序列,存储过程(procedure),触发器(trigger),索引(index)等。
  • .dba 所有系统权限,无限制的空间限额和给其他用户授予各种权限的能力,用户system拥有dba角色。

 


2. SQL 语言分类 

 

  • DQL 数据查询语言(Data Query Language):WHERE 条件、ORDER BY 排序、GROUP BY 分组、HAVING 聚合条件
  • DML 数据操作语言(Data Manipulation Language):INSERT 增、DELETE 删、UPDATE 改、SELECT 查
  • DDL 数据定义语言(Data Definition Language):CREATE 创建、DROP 删除、ALTER 改变/修改
  • DCL 数据控制语言(Data Control Language):GRANT 授权、REVOKE 撤销
  • TCL 事务控制语言(Transation Control Language):COMMIT 提交、ROLLBACK 回滚
  • CCL 指针控制语言(Cursor Control Language):DECLARE CURSOR、FETCH INTO、UPDATE WHERE CURRENT

 


  • DQL 示例
*****************************************************************	
・【ORDER BY】排序
	ORDER BY A,B        默认都按升序排列
	ORDER BY A DESC,B   A 降序,B 升序排列
	ORDER BY A,B DESC   A 升序,B 降序排列
*****************************************************************	

 


  • DML 示例
*****************************************************************	
・【INSERT】插入数据
	INSERT INTO table_name
	VALUES
		( value1, value2, value3,...);
................................................................
	或者
	INSERT INTO table_name ( column1, column2, column3,...)
	VALUES
		( value1, value2, value3,...);
*****************************************************************		
・【INSERT INTO...FROM】插入表数据,要求目标表存在
	INSERT INTO table_name_new SELECT
	* 
	FROM
		table_name_old
................................................................
	或者
	INSERT INTO table_name_new ( column1, column2...) SELECT
	column1,
	column2...
	FROM
		table_name_old	
*****************************************************************	
・【SELECT...INTO FROM】要求目标表不存在,因为在插入时会自动创建(MySQL暂不支持)
	SELECT
		* INTO table_name_new 
	FROM
		table_name_old
*****************************************************************
・【DELETE】删除,可回滚
	DELETE 
	FROM
		table_name 
	WHERE
		some_column = some_value;
*****************************************************************	
・【UPDATE】更新,set sql_safe_updates=1; 表示开启更新条件(whereUPDATE table_name 
	SET column1 = value1,
	column2 = value2,
	...
	WHERE
		some_column = some_value;
*****************************************************************	
・【SELECT DISTINCT】在表中,一个列可能会包含多个重复值,DISTINCT 关键词用于返回唯一不同的值。
	SELECT DISTINCT
		column_name,
		column_name 
	FROM
		table_name;
*****************************************************************			
・【LIMIT】MySQL 规定要返回的记录的数目
	SELECT
		column_name
	FROM
		table_name 
		LIMIT number;
*****************************************************************	
・【ROWNUM】Oracle 规定要返回的记录的数目
	SELECT
		column_name
	FROM
		table_name 
	WHERE
		ROWNUM <= number
*****************************************************************	
・【TOPSQL Server 规定要返回的记录的数目
	SELECT
		TOP number | percent column_name
	FROM
		table_name;
*****************************************************************	

 


  • DDL 示例
*****************************************************************	
・【CREATE TABLE...AS】复制表结构及其数据
	CREATE TABLE table_name_new AS 
	SELECT
		* 
	FROM
		table_name_old;
*****************************************************************			
・【CREATE TABLE...LIKE】仅复制表结构
	CREATE TABLE table_name_new AS 
	SELECT
		* 
	FROM
		table_name_old 
	WHERE
		1 = 2;
................................................................
	或者
	CREATE TABLE table_name_new 
	LIKE table_name_old
*****************************************************************	
・【ALTER】修改表结构 - 修改列的数据类型
	ALTER TABLE table_name 
	MODIFY column_name datatype;
*****************************************************************
・【ALTER】修改表结构 - 修改列名
	ALTER TABLE table_name 
	RENAME COLUMN column_old TO column_new;
*****************************************************************
・【ALTER】修改表结构 - 增加列
	ALTER TABLE table_name 
	ADD column_name datatype;
*****************************************************************
・【ALTER】修改表结构 - 删除列
	ALTER TABLE table_name 
	DROP COLUMN column_name;
*****************************************************************
・【DROP】删除表 / 数据库
	DROP TABLE table_name;
	DROP DATABASE database_name;
	TRUNCATE TABLE table_name;
*****************************************************************
・【RENAME】修改表名
	RENAME table_name_old TO table_name_new;
*****************************************************************

 


  • DCL 示例
*****************************************************************	
・【GRANT】赋予角色权限
	CREATE USER user_name IDENTIFIED BY password;
	GRANT CONNECT,
	RESOURCE,
	dba TO user_name;
*****************************************************************	

 


3. LIKE 模糊查询

 

*****************************************************************	
・【LIKE】模糊查询
	SELECT
		column_name
	FROM
		table_name 
	WHERE
		column_name LIKE pattern;
*****************************************************************	
通配符 说明
% 替代 0 个或多个字符
_ 仅替代一个字符
[ charlist ] 字符列中任意单一字符
[ ^charlist ] or [ !charlist ] 不在字符列中的任何字符
*****************************************************************	
・【LIKE】MySQL 不支持 [charlist]。使用 REGEXPNOT REGEXP 运算符 (RLIKENOT RLIKE) 来操作正则表达式。
	SELECT
		* 
	FROM
		Websites 
	WHERE
		NAME REGEXP '^[GFs]';
*****************************************************************	

 


4. AS 别名

下面的情况下,使用别名很有用:在查询中涉及超过一个表;在查询中使用了函数;列名称很长或者可读性差;需要把两个列或者多个列结合在一起

*****************************************************************	
・【COLUMN】列的 SQL 别名
	SELECT
		column_name AS alias_name 
	FROM
		table_name;
*****************************************************************
・【COLUMN】列结合的 SQL 别名
	SELECT NAME
		,
		CONCAT( url, ', ', alexa, ', ', country ) AS site_info 
	FROM
		Websites;
*****************************************************************	
・【TABLE】表的 SQL 别名
	SELECT
		column_name
	FROM
		table_name AS alias_name;
*****************************************************************	

 


5. UNION & JOIN 集合连接

1.MySQL 暂不支持 FULL JOIN,要使用 UNION 将一个左连接、和一个右连接去重合并。
2.UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中列的顺序必须相同。排序时只能在最后使用一个ORDER BY命令,是将两个查询结果合在一起之后,再进行排序!绝对不能写两个ORDER BY命令。

*****************************************************************	
・【INNER JOIN】内连接,INNER JOINJOIN 是相同的
	SELECT
		select_list 
	FROM
		table1
	JOIN / INNER JOIN table2 
	ON table1.column_name = table2.column_name
*****************************************************************
・【LEFT / RIGHT /FULL JOIN】外连接,基准表返回所有的行,连接表返回匹配的行
	SELECT
		select_list 
	FROM
		table_name1 
		LEFT / RIGHT /FULL JOIN table_name2 
	ON table1.column_name = table2.cloumn_name
*****************************************************************	
・【UNION】合并两个或多个 SELECT 语句的结果,只会选取不同的值。
	SELECT
		column_name
	FROM
		table1 UNION
	SELECT
		column_name
	FROM
		table2;
*****************************************************************	
・【UNION ALL】合并两个或多个 SELECT 语句的结果,如果允许重复的值,请使用 UNION ALL
	SELECT
		column_name
	FROM
		table1 UNION ALL
	SELECT
		column_name
	FROM
		table2;
*****************************************************************	
・【INTERSECT/ MINUS / EXCEPT】交集/并集/差集(MySQL 暂不支持)
	SELECT
		column_name
	FROM
		table1 INTERSECT/ MINUS / EXCEPT
	SELECT
		column_name
	FROM
		table2;
*****************************************************************	

 


9. CONSTRAINT 约束

[ 可选 ] 如需命名约束使用:CONSTRAINT constraint_name

*****************************************************************	
・【PRIMARY KEY】主键约束,在一个表中有且只有一个,主键字段数据必须非空,主键字段数据必须唯一
	建表时:
	CREATE TABLE table_name  (
		 id number ( 2 ) PRIMARY KEY, 
		 NAME varchar2 ( 20 )
	 );
	 或者
	CREATE TABLE table_name  (
		 id number ( 2 ), 
		 NAME varchar2 ( 20 ), 
		 CONSTRAINT pk_name PRIMARY KEY ( id ) 
	 );
................................................................
	建表后:
	ALTER TABLE table_name 
	ADD CONSTRAINT pk_name 
	PRIMARY KEY ( column_name);
*****************************************************************	
・【FOREIGN KEY】外键约束,保证一个表中的数据匹配另一个表中的值的参照完整性
	建表时:
	CREATE TABLE table_name_order (
		 id number ( 2 ) REFERENCES table_name ( column_name ),
		 NAME varchar2 ( 20 )
	 );
	 或者
	CREATE TABLE table_name_order ( 
		id number ( 2 ), 
		NAME varchar2 ( 20 ), 
		CONSTRAINT fk_name FOREIGN KEY ( id ) REFERENCES table_name ( column_name ) 
	);
................................................................
	建表后:
	ALTER TABLE table_name_order  
	ADD CONSTRAINT fk_name 
	FOREIGN KEY ( column_name ) REFERENCES table_name ( column_name ) ;
*****************************************************************	
・【UNIQUE】唯一性约束,唯一标识数据库表中的每条记录
	CREATE TABLE table_name  (
		 id number ( 2 ) UNIQUE, 
		 NAME varchar2 ( 20 )
	 );
*****************************************************************	
・【CHECK】检查性约束,只允许特定的值。
	CREATE TABLE table_name ( 
		id number ( 2 ) CHECK ( id > 0 ), 
		NAME varchar2 ( 20 ) CHECK ( NAME = 'ITGod' ) 
	);
*****************************************************************	
・【DEFAULT】默认约束,向列中插入默认值,也可以插入系统值
	CREATE TABLE table_name  (
		 id number ( 2 ) DEFAULT 88, 
		 NAME varchar2 ( 20 ) ,
		 OrderDate date DEFAULT GETDATE()
	 );
*****************************************************************	
・【NOT NULL】非空约束,强制列不接受 NULLCREATE TABLE table_name  (
		 id number ( 2 ) NOT NULL UNIQUE, 
		 NAME varchar2 ( 20 )
	 );
*****************************************************************	
・【DROP】删除约束
	ALTER TABLE table_name 
	DROP CONSTRAINT constraint_name;
................................................................	
・【SELECT】不知道约束名,先查询约束名
	SELECT
		constraint_name 
	FROM
		information_schema.REFERENTIAL_CONSTRAINTS 
	WHERE
		constraint_schema = 'db_name' 
		AND table_name = 'table_name';
*****************************************************************	

 


7. INDEX 索引

用户无法看到索引,它们只能被用来加速搜索/查询

*****************************************************************	
・【CREATE INDEX】创建索引(允许使用重复的值)
	CREATE INDEX index_name 
	ON table_name (column_name1, column_name2 [ asc / desc ])
................................................................	
・【CREATE INDEX】创建索引(不允许使用重复的值)
	CREATE UNIQUE INDEX index_name 
	ON table_name (column_name [ asc / desc ])	
*****************************************************************	
・【DROP INDEX】Oracle 删除索引
	DROP INDEX index_name
................................................................	
・【CREATE INDEX】MySQL 删除索引
	ALTER TABLE table_name 
	DROP INDEX index_name
*****************************************************************	

 


8. SEQUENCE / AUTO_INCREMENT 序列对象 / 自增列

每次插入新记录时,自动地创建主键字段的值

*****************************************************************	
・【SEQUENCE】Oracle 序列对象
	CREATE  SEQUENCE  SEQUENCE_NAME
	[ START  WITH  START_VALUE ]---起始值【默认1】
	[ INCREMENT  BY  INCR_VALURE ]---增量,步长
	[ MAXVALUE  MAX_VALUE ]---最大值
	[ MINVALUE  MIN_VALUE ]---最小值
	[ CACHE  N ]---高速缓冲区
	[ CYCLE ]---循环(递增、递减)
................................................................	
・【SEQUENCE】Oracle 使用序列对象
	INSERT INTO Persons ( column_name1, column_name2)
	VALUES(
		SEQUENCE_NAME.nextval,
		'Values'
	)
*****************************************************************	
・【AUTO_INCREMENT】MySQL 自增列,默认1,自增1
	CREATE TABLE Persons (
		ID INT NOT NULL AUTO_INCREMENT,
		LastName VARCHAR ( 255 ) ,
		FirstName VARCHAR ( 255 ),
		Address VARCHAR ( 255 ),
		City VARCHAR ( 255 ),
		PRIMARY KEY ( ID ) 
	)
................................................................	
・【AUTO_INCREMENT】MySQL 修改自增列以其他值开始
	ALTER TABLE Persons AUTO_INCREMENT=100
*****************************************************************		

 


9. VIEW 视图

是由查询结果生成的虚拟表,是动态数据的存储集合,视图只供查询,数据不可更改,不影响原表的数据和结构。简化了数据访问操作,还加强了安全性

*****************************************************************
・【CREATE VIEW】创建视图,用来保存动态数据
	CREATE VIEW view_name AS 
	SELECT
		column_name ( s ) 
	FROM
		table_name 
	WHERE
		CONDITION
*****************************************************************	
・【SELECT】查看视图
	SELECT * FROM view_name
*****************************************************************	
・【CREATE VIEW】更新视图
	CREATE OR REPLACE VIEW view_name AS 
	SELECT
		column_name ( s ) 
	FROM
		table_name 
	WHERE
		CONDITION
*****************************************************************	
・【DROP】删除视图
	DROP VIEW view_name
*****************************************************************		

 


10. FUNCTION 函数

 

  • NULL 函数
    用于规定如何处理 NULL 值
*****************************************************************
・【 NVL()】Oracle
	SELECT
		NVL ( column_name, 0 )
	FROM
		table_name
*****************************************************************
・【IFNULL() / COALESCE()】MySQL
	SELECT
		COALESCE / IFNULL ( column_name, 0 ) 
	FROM
		table_name
*****************************************************************		

 


  • AGGREGATE 聚合函数
    是指对一组值进行操作,返回单一的结果
函数 说明
AVG() 平均值
COUNT() 统计数目
FIRST() 返回第一个记录的值
LAST() 返回最后一个记录的值
MAX() 最大值
MIN() 最小值
SUM() 求和

 


  • SCALAR 标量函数
    是指对单一值进行操作,返回单一的结果
函数 说明
UCASE() 将某个字段转换为大写
LCASE() 将某个字段转换为小写
MID() 从某个文本字段提取字符,MySql 中使用
SubString (str_exp,start,end) 从某个文本字段提取字符
LEN() 返回某个文本字段的长度
ROUND() 对某个数值字段进行指定小数位数的四舍五入
FORMAT() 格式化某个字段的显示方式
NOW() 返回当前的系统日期和时间

 


  • MATH 数学函数
函数 说明
ABS ( num_exp ) 绝对值
CEIL ( num_exp ) 上舍入
FLOOR ( num_exp ) 下舍入
ROUND ( num_exp [ , length ] ) 按指定长度四舍五入
MOD ( num_exp , num_exp2 ) 取模
POWER ( num_exp , n ) 返回表达式的n次方
SQRT ( num_exp ) 返回表达式的平方根
DBMS_RANDOM.VALUE 返回 0 - 1 之间的随机数
SIGN ( num_exp ) 返回表达式的正、负、或零
TRUNC ( num_exp [ , length ] ) 按指定长度进行截断
LEAST ( value_list ) 返回所给值列表中的最小值
GREATEST ( value_list ) 返回所给值列表中的最大值

 


  • STRING 字符串函数
函数 说明
ASCII ( str_exp ) 返回所给字符串表达式最左端所对应的ascii值
CHR ( num ) 返回所给整数对应的字符chr(9)空格 chr(13)换行
CONCAT( char_exp1 , char_exp2 ) 返回将两个字符串串联后的新字符串
INITCAP ( char_exp ) 返回将字符串首字符转换成大写后的字符串
REPLACE ( char_exp1 , char_exp2 , char_exp3 ) 原串、查找串、替换串 – 将第一个字符串出现的第二个字符串用第三个字符串替换
INSTR ( char_exp1 , char_exp2 [ , start_index , times ] ) 原串、查找串、起始值、次数 – 返回第二个字符串在第一个字符串中第几次出现的位置
SUBSTR( char_exp , start_index , length ) 返回指定位置截取指定个数的字符(从什么地方开始截取几个)
LOWER ( char_exp ) 返回指定字符转换成小写
UPPER ( char_exp ) 返回指定字符转换成大写
LENGTH ( char_exp ) 返回指定字符表达式的个数或长度
LTRIM ( char_exp1 [ , char_exp2 ] ) 返回删除指定字符串最左边字符或空格
RTRIM ( char_exp1 [ , char_exp2 ] ) 返回删除指定字符串最右边字符或空格
LPAD ( char_exp1 , length [ , char_exp2 ] ) 返回使用空格或字符串的左边补齐到指定长度位置处
RPAD ( char_exp1 , length [ , char_exp2 ] ) 返回使用空格或字符串的右边补齐到指定长度位置处

 


  • DATE 日期函数
函数 说明
sysdate 返回系统当前日期(只包含年月日)
systimestamp 返回系统当前日期(包含时分秒)
add_months(date_exp , num) 在指定日期表达式上增加一定的月份值
last_day(date_exp) 返回指定日期表达式所在月份的最后一天
months_between(date_exp1 , date_exp2) 返回两个日期相差的月份值
trunc(date_exp [ , format ]) 返回按指定日期格式截断后的日期

 


  • TRANSFORM 转换函数
函数 说明
TO_CHAR ( exp [ , format ] ) 将指定的表达式转换成指定格式的字符串
TO_DATE ( char_exp , format ) 将指定字符串表达式转换成指定格式的日期
NVL ( exp , default_value ) 如果指定的表达式中存在空值的话,将以指定的默认值来替换

 


【每日一面】

DROP、TRUNCATE、 DELETE 的区别

DROP 语句是 ddl,操作立即生效,原数据不放到 rollback segment 中,不能回滚。 操作不触发 trigger;drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index),依赖于该表的存储过程/函数将保留, 但是变为 invalid 状态,将表所占用的空间全部释放
TRUNCATE 语句是 ddl,操作立即生效,原数据不放到 rollback segment 中,不能回滚。 操作不触发 trigger;truncate 语句只删除数据不删除表的结构
DELETE 语句是 dml,这个操作会放到 rollback segement 中,事务提交之后才生效。如果有相应的 trigger,执行的时候将被触发;delete 语句只删除数据不删除表的结构
速度:一般来说: drop > truncate > delete ;安全性: 小心使用 drop 和 truncate, 尤其没有备份的时候

你可能感兴趣的:(IT界大神成长之路,数据库,sql,oracle,mysql,字符串)