Sql总结:
Sql:结构化查询语句 Structured Query Language
Sql语句对大小写不敏感
Sql分两个部分:DML,DDL
DML:data manipulation language 数据操作语言。
DDL:data definition language 数据定义语言。
DML: 重要的DML语句
• SELECT - 从数据库表中获取数据
• UPDATE - 更新数据库表中的数据
• DELETE - 从数据库表中删除数据
• INSERT INTO - 向数据库表中插入数据
DDL:重要的DDL语句
• CREATE DATABASE - 创建新数据库
• ALTER DATABASE - 修改数据库
• CREATE TABLE - 创建新表
• ALTER TABLE - 变更(改变)数据库表
• DROP TABLE - 删除表
• CREATE INDEX - 创建索引(搜索键)
• DROP INDEX - 删除索引
一些需要注意的sql例子:
Distinct关键字用来去除重复:
例:
Orders”表:
Company OrderNumber
IBM 3532
W3School 2356
Apple 4698
W3School 6953
Select distinct company from orders
执行以上语句显示结果为:
Company
IBM
W3School
Apple
“W3Schoo“ 只被列出一次
Sql中注意引号的使用:
请注意,我们在例子中的条件值周围使用的是单引号。
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
这是正确的:
SELECT * FROM Persons WHERE FirstName=’Bush’
这是错误的:
SELECT * FROM Persons WHERE FirstName=Bush
这是正确的:
SELECT * FROM Persons WHERE Year>1965
这是错误的:
SELECT * FROM Persons WHERE Year>’1965’
Order by字句
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
例:
SELECT Company, OrderNumber FROM Orders ORDER BY Company
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
默认是:ASC
INSERT INTO语句
两种写法:
INSERT INTO 表名称 VALUES (值1, 值2,….)
INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,….)
注意:第一种不叫列名的方式必须添加所有列的值
Update
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
注:这里也可以更新这条数据的若干列
Delete语句
删除某一行数据:
DELETE FROM 表名称 WHERE 列名称 = 值
删除表中的所有数据:
DELETE FROM table_name
或者
DELETE * FROM table_name
注意:这里只删除了表中的数据,没有删除表
Limit字句:
Mysql中使用的是limit,而在sql service中使用的是top,在oracle中使用又有不同
Mysql:select * from student limit 2;
Sql service: select top 2 from student;
Oracle: select * from student where rownumber<=2
LIKE
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
模糊查询需要使用通配符“%“来使用,三个例子说明如何使用模糊查询
例1:现在,我们希望从上面的 “Persons” 表中选取居住在以 “N” 开始的城市里的人:
SELECT * FROM Persons
WHERE City LIKE ‘N%’
例2:,我们希望从 “Persons” 表中选取居住在以 “g” 结尾的城市里的人。
SELECT * FROM Persons
WHERE City LIKE ‘%g’
例3:我们希望从 “Persons” 表中选取居住在包含 “lon” 的城市里的人:
SELECT * FROM Persons
WHERE City LIKE ‘%lon%’
关于sql中如何使用通配符:
通配符 描述
% 替代一个或多个字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]
或者
[!charlist] 不在字符列中的任何单一字符
例4:我们希望从上面的 “Persons” 表中选取名字的第一个字符之后是 “eorge” 的人:
SELECT * FROM Persons
WHERE FirstName LIKE ‘_eorge’
例5:我们希望从上面的 “Persons” 表中选取居住的城市以 “A” 或 “L” 或 “N” 开头的人:
SELECT * FROM Persons
WHERE City LIKE ‘[ALN]%’
例6:我们希望从上面的 “Persons” 表中选取居住的城市不以 “A” 或 “L” 或 “N” 开头的人
SELECT * FROM Persons
WHERE City LIKE ‘[!ALN]%’
Between…And
SELECT * FROM Persons WHERE LastName BETWEEN ‘Adams’ AND ‘Carter’
注意:
不同的数据库对 BETWEEN…AND 操作符的处理方式是有差异的。某些数据库会列出介于 “Adams” 和 “Carter” 之间的人,但不包括 “Adams” 和 “Carter” ;某些数据库会列出介于 “Adams” 和 “Carter” 之间并包括 “Adams” 和 “Carter” 的人;而另一些数据库会列出介于 “Adams” 和 “Carter” 之间的人,包括 “Adams” ,但不包括 “Carter” 。
所以,请检查你的数据库是如何处理 BETWEEN….AND 操作符的
对于我电脑所安装的mysql5.1.62是上下都包括的。
如需使用上面的例子显示范围之外的人,请使用 NOT 操作符:
SELECT * FROM Persons
WHERE LastName
NOT BETWEEN ‘Adams’ AND ‘Carter’
使用别名
1. 对查询的表起别名。
2. 对查询的列起别名。
略
Join 和 Key
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。
• JOIN: 如果表中有至少一个匹配,则返回行(inner join)
• LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
• RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
• FULL JOIN: 只要其中一个表中存在匹配,就返回行
INNER JOIN 关键字语法
• SELECT column_name(s)
• FROM table_name1
• INNER JOIN table_name2
• ON table_name1.column_name=table_name2.column_name
查询的结果只列出两个表相匹配的结果
LEFT JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
EFT JOIN 关键字会从左表那里返回所有的行,即使在右表中没有匹配的行。
RIGHT JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
RIGHT JOIN 关键字会从右表那里返回所有的行,即使在左表中没有匹配的行。
FULL JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name
FULL JOIN 关键字会从左表和右那里返回所有的行。如果左表中的行在右表中没有匹配,或者如果右表中的行在表左边中没有匹配,这些行同样会列出。
SQL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
Union与Union 啊All
使用Union两张表如果中如果有相同的数据,这条数据只会出现一次
使用Union All两张表中相同的数据会重复出现。
SELECT INTO 语句
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
语法:
SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
或者只把希望的列插入新表:
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
其中:IN 子句可用于向另一个数据库中拷贝表
SQL 约束 (Constraints)
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。
我们将主要探讨以下几种约束:
• NOT NULL
• UNIQUE
• PRIMARY KEY
• FOREIGN KEY
• CHECK
• DEFAULT
注意:每个表中只能有一个主键
Not null:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
Unique
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
)
注意这是mysql中unique的写法,不同的数据库中有些不同
PRIMARY KEY
主键,略去
FOREIGN KEY
外键
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)
CREATE INDEX 语句
您可以在表中创建索引,以便更加快速高效地查询数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
注:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
TRUNCATE TABLE 语句
只删除表中内容,不删除表除了用delete,还可以用truncate table
TRUNCATE TABLE 表名称
GROUP BY 语句
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
SQL GROUP BY 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
Group通常会与一些函数共同使用
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
存储过程是什么?
定义:
存储过程(stored procedure)是一组为了完成特定功能的SQL语句集合,经编译后存储在服务器端的数据库中,利用存储过程可以加速SQL语句的执行。
存储过程分为系统存储过程和自定义存储过程。
系统存储过程在master数据库中,但是在其他的数据库中可以直接调用,并且在调用时不必在存储过程前加上数据库名,因为在创建一个新数据库时,系统存储过程在新的数据库中会自动创建。
自定义存储过程,由用户创建并能完成某一特定功能的存储过程,存储过程既可以有参数又有返回值,但是它与函数不同,存储过程的返回值只是指明执行是否成功,并不能像函数那样被直接调用,只能利用execute来执行存储过程。
2:存储过程的优点
提高应用程序的通用性和可移植性:存储过程创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。并且数据库专业人员可以随时对存储过程进行修改,且对程序源代码没有影响,这样就极大的提高了程序的可移植性。
可以更有效的管理用户操作数据库的权限:在Sql Server数据库中,系统管理员可以通过对执行某一存储过程的权限进行限制,从而实现对相应的数据访问进行控制,避免非授权用户对数据库的访问,保证数据的安全。
可以提高SQL的速度,存储过程是编译过的,如果某一个操作包含大量的SQL代码或分别被执行多次,那么使用存储过程比直接使用单条SQL语句执行速度快的多。
减轻服务器的负担:当用户的操作是针对数据库对象的操作时,如果使用单条调用的方式,那么网络上还必须传输大量的SQL语句,如果使用存储过程,则直接发送过程的调用命令即可,降低了网络的负担。
(1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
(2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
(3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
(4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。
(5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全
3.格式
MySQL存储过程创建的格式:CREATE PROCEDURE 过程名 ([过程参数[,…]])
[特性 …] 过程体
例:
mysql> DELIMITER //
mysql> CREATE PROCEDURE proc1(OUT s int)
-> BEGIN
-> SELECT COUNT(*) INTO s FROM user;
-> END
-> //
mysql> DELIMITER ;
这里需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以”;”为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将”;”当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
存储过程和函数的区别是什么?
答:存储过程是用户定义的一系列SQL语句集合,涉及特定表或其他对象的任务,用户可以调用存储过程。而函数通常时数据库已定义的方法,它接受参数并返回某种类型的值,并且不涉及特定的用户表。
存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。
存储过程和函数存在以下几个区别:
1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。存储过程,功能强大,可以执行包括修改表等一系列数据库操作;用户定义函数不能用于执行一组修改全局数据库状态的操作。
2)对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象。函数只能返回一个变量;而存储过程可以返回多个。存储过程的参数可以有IN,OUT,INOUT三种类型,而函数只能有IN类~~存储过程声明时不需要返回类型,而函数声明时需要描述返回类型,且函数体中必须包含一个有效的RETURN语句。
3)存储过程,可以使用非确定函数,不允许在用户定义函数主体中内置非确定函数。
4)存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。 SQL语句中不可用存储过程,而可以使用函数。
什么是数据库事务?
数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全部做,是一个不可分割的工作单位。
如果用户没有显式地定义事务,则由DBMS按默认的规定自动划分实物。事务具有原子性、一致性、独立性及持久性等特点
(1) 事务的原子性指一个事务要么全部执行,要么不执行。也就是说,一个事务不可能只执行一半就停止。例如银行存钱过程。
(2) 事务的一致性是指事务的运行并不改变数据库中数据的一致性。例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。
(3) 事务的独立性是指两个以上的事务不会出现交错执行的状态,因为这样可能会导致数据不一致
(4) 事务的持久性是指事务运行成功以后,系统的更新是永久的,不会无缘无故的回滚。
查询数据库时,如果查询的数量很多,假设1000万条,用什么办法可以提高查询效率?在数据库方面或者java方面有什么优化的办法?
1. 在数据库设计方面
(1) 建立索引
(2) 分区(例如按照时间分区)
(3) 尽量使用固定长度的字段
(4) 限制字段的长度
2. 在数据库I/O方面
(1) 增加缓存区
(2) 如果涉及表的级联,不同的表存储在不同的磁盘上,以增加I/O速度。
3. 在SQL语句方面
(1) 优化SQL语句,减少比较次数。
(2) 限制返回的条目数(使用limit)
4. 在java方面
如果是反复使用的查询,使用preparedStatement减少查询次数