基础:
增:insert into emp(empno, ename, job, mgr, hiredate, sal) values(9999, 'zhangsan', 'MANAGER', NULL, NULL, 200)
删:delete from emp where comm is null;
改:update 表名 set 字段名称1=需要修改的值1, 字段名称2=需要修改的值2 where …….
查:select empno as 员工编号, ename 员工姓名, sal*12 年薪 from emp;
1. Like中%和下划线的差别? %匹配任意字符出现任意次数,下划线只匹配一个任意字符出现一次
2. 查询“%”或者“_” 使用 “@%”escape @ 和 “@_”escape @
3. mysql 中的 ifnull(sal,0)相当于oralce中的nvl(sal,0),若工资为null,在进行运算的时候,给值0
4. Count(*)表示取得所有记录,忽略null,有null值也会取得
5. distinct只能 出现在所有字段前面,后面出现的所有的字段联合去重。
6. Group by中不能使用聚合函数,如果想对分组数据再进行过滤需要使用having子句
7. 分组函数的执行顺序:1. 根据条件查询数据 2. 分组 3. 采用having过滤,取得正确的数据,
原则:可以在where语句中过滤的数据,不要使用having过滤。
8. SQL语句执行顺序:
1). 首先执行where语句过滤原始数据
2). 执行group by进行分组
3). 执行having对分组数据进行操作
4). 执行select选出数据
5). 执行order by排序
9. Sql92语法和sql99语法的区别:99语法可以做到表的连接和查询条件分离,特别是多个表进行连接的时候,会比sql92更清晰
10. 左联接和右连接都是外连接,左连接以左面的表为准和右边的表比较,和右面表相等的不相等都会显示出来,右连接恰恰相反,
以上左连接和右连接也可以加入outer关键字,但一般不建议这种写法
11. 使用union操作必须保证多个查询结果结合需要具有相同列数
12. mysql 不支持minus
13. 取工资最高的前五条记录:
mysql :select * from emp order by sal limit 5
oracle : select empno, ename, sal from (select empno, ename, sal from emp order by sal desc) where rownum <=5
14. 表内容的复制(克隆表只能克隆表的内容,约束无法克隆):
create table emp_bak as select * from emp;
create table my_table as select ename,sal from emp;
以上的语句会自动创建一张表,将所有的数据复制到新表中
15. 关于事务的回滚需要注意:只能回滚insert、delete和update语句,不能回滚select(回滚select没有任何意义),对于create、drop、alter这些无法回滚
16. 事务从微观角度讲是不可再分的最小的工作单元。事务从宏观的角度讲是一个完整的不可再分的业务。
17. 不同数据库增删字段语法不一定相同,例如:
oracle : alter table t_student drop(contact_tel);
mysql : alter table t_student drop column contact_tel;
18. 索引的目的是提高查询数据的速度,索引一本书的目录一样,索引的建立原则,比较少的DML(insert、update、delete),
经常出现在where语句中的字段,表数据比较庞大。
19. 如经常根据birthday进行查询,并且遇到了性能瓶颈,首先查看程序是否存算法问题,再考虑对birthday建立索引
20. 主键建立后,会相应的为主键建立索引,所以根据主键查询,通常比普通字段快
21. 为什么使用视图?,因为需求决定以上语句需要在多个地方使用,如果频繁的拷贝以上代码,会给维护带来成本,视图可以解决这个问题
创建视图举例:
create view v_dept_avg_sal as select a.deptno, a.avg_sal, b.grade from (select deptno, avg(sal) avg_sal from emp group
by deptno) a, salgrade b where a.avg_sal between b.losal and b.hisal;
22. 视图的使用和表的使用是一致,但是视图不能进行增删改,因为视图是表的结果,采用视图主要是为了操作的方便性,重复使用的结果集
考虑建成视图, 如果表的结构可能会频繁发生变化,那么最好设置视图
23. 序列有两个属性:1). 取得下一个值:seq_name.nextval 2). 取得当前值:seq_name.currval
24. 创建序列:create sequence my_seq_01 start with 100 minvalue 100 maxvalue 1000 increment by 10 cycle cache 10;
使用序列:insert into t_student(student_id, student_name, sex, email, classes_id) values(SEQ_STUDENT_ID.nextval, '',
'女','[email protected]', 10);
删除序列:drop sequence SEQ_STUDENT_ID;
25. 存储过程最直接的理解:就是保存了批量的sql(select,insert,if for),以后可以通过一个名字把这些批量的sql执行,使用存储过程在大批量
数据查询或计算时会带来高性能,存储过程编写和调试比较复杂,不同数据库产品存储过程差异非常大,很难实现平滑移植
26. 触发器是特殊的存储过程,它与数据库的insert、update和delete相关联,如定义完成触发器之后,会在insert、update或delete语句
执行前或执行后自动执行触发器中的内容
27. 三范式总结
第一范式:有主键,具有原子性,字段不可分割。数据库表中不能出现重复记录,每个字段是原子性的不能再分。
第二范式:完全依赖,没有部分依赖。第二范式是建立在第一范式基础上的,另外要求所有非主键字段完全依赖主键,不能产生部分依赖
第三范式:没有传递依赖。建立在第二范式基础上的,非主键字段不能传递依赖于主键字段。
数据库设计尽量遵循三范式,但是还是根据实际情况进行取舍,有时可能会拿冗余换速度,最终目的要满足客户需求。
补充:
1. SELECT * FROM Persons WHERE City NOT LIKE '%lon%'
2. SELECT * FROM Persons WHERE FirstName LIKE '_eorge' // _ 代表任意字符,且只代表一个
3. SELECT * FROM Persons WHERE LastName LIKE 'C_r_er'
4. between * and * 和 not between * and *
注:mysql的SQL语句中between * and * 语句中只能加数字,不能是字符串。
5. full join 列出两个表中的所有项,mysql不支持full join
6. UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列,列的类型可以不同。
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
7. CREATE DATABASE 用于创建数据库:CREATE DATABASE my_db
8. CREATE TABLE 语句用于创建数据库中的表:CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型,.... )
9. 下面的 SQL 语句强制 "Id_P" 列和 "LastName" 列不接受 NULL 值:
CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255))
10. UNIQUE 约束唯一标识数据库表中的每条记录。
CREATE TABLE Persons ( Id_P int NOT NULL,UNIQUE (Id_P))
CREATE TABLE Persons ( Id_P int NOT NULL UNIQUE)
CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName))
当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束,请使用下列 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons ADD UNIQUE (Id_P)
如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
撤销 UNIQUE 约束,如需撤销 UNIQUE 约束,请使用下面的 SQL:
ALTER TABLE Persons DROP CONSTRAINT uc_PersonID
10. PRIMARY KEY 约束唯一标识数据库表中的每条记录。
11. 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY:
CREATE TABLE Orders ( O_Id int NOT NULL,Id_P int , CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P))
12. CHECK 约束用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL,CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes'))
13. DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录
CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, City varchar(255) DEFAULT 'Sandnes')
14. 索引 : 您可以在表中创建索引,以便更加快速高效地查询数据。用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
SQL CREATE INDEX 语法在表上创建一个简单的索引。允许使用重复的值。CREATE INDEX index_name ON table_name (column_name)
15. 我们可以使用 DROP INDEX 命令删除表格中的索引。
用于 IBM DB2 和 Oracle 语法 : DROP INDEX index_name
用于 MySQL 的语法:ALTER TABLE table_name DROP INDEX index_name
16. DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除): DROP TABLE 表名称
DROP DATABASE 语句用于删除数据库:DROP DATABASE 数据库名称
TRUNCATE TABLE 命令(仅仅删除表格中的数据): TRUNCATE TABLE 表名称
17. ALTER TABLE 语句用于在已有的表中添加、修改或删除列:
如需在表中添加列,请使用下列语法: ALTER TABLE table_name ADD column_name datatype
要删除表中的列,请使用下列语法:ALTER TABLE table_name DROP COLUMN column_name
注释:某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)。
要改变表中列的数据类型,请使用下列语法:ALTER TABLE table_name ALTER COLUMN column_name datatype
18. 通过 sequence 对创建 auto-increment 字段(该对象生成数字序列):
CREATE SEQUENCE seq_person MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10
INSERT INTO Persons (P_Id,FirstName,LastName) VALUES (seq_person.nextval,'Lars','Monsen')
19. SQL CREATE VIEW 语法:CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
20. 如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其他值不同。NULL 用作未知的或不适用的值的占位符。注释:无法比较 NULL 和 0;它们是不等价的。
IS NULL ; IS NOT NULL
21. oracle:nvl() ; mysql: ifnull
22. COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)
23. 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。SQL HAVING 语法:
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value
GROUP BY column_name HAVING aggregate_function(column_name) operator value
24. UCASE 函数把字段的值转换为大写:SELECT UCASE(column_name) FROM table_name // oracle 用upper
25. LCASE 函数把字段的值转换为小写: SELECT LCASE(column_name) FROM table_name // oralce 用lower
26. ROUND 函数用于把数值字段舍入为指定的小数位数 : SELECT ROUND(column_name,decimals) FROM table_name
27. NOW 函数返回当前的日期和时间。提示:如果您在使用 Sql Server 数据库,请使用 getdate() 函数来获得当前的日期时间。
SQL NOW() 语法 : SELECT NOW() FROM table_name // oralce 使用 sysdate