基本语法就不详细描述了,该文档主要记录复习sql语句时写的所有语句(以前总结的)
简单查找
select * from table;
查找不重复的项
select distinct * from table;
where语句查找
select * from table where name ='jack';
and or 语句
select * from table where name='jack' and age=18;
排序(默认升序asc,降序用desc)
select * from table where age>3 order by age (desc);
插入语句
insert into table(column_name) values ('jack',12,'1992-29-1');
更新语句
update table set colunmn_name='ppp' where name ='jack';
删除某条信息语句
delete from table where name='jack';
删除表
drop table if exists table_name;
SELECT - 从数据库中提取数据
UPDATE - 更新数据库中的数据
DELETE - 从数据库中删除数据
INSERT INTO - 向数据库中插入新数据
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
高级教程
得到查找到的信息的前几个
MySQL: select age from table order by age desc limit 10;
Oracle: select age from table where ROWNUM<=10;
SQL Server: select top 5 age from table;
select top 50 percent age from table order by age asc;
Like的用法
select * from table where name like 'j%';
select * from table where name like '_a%';
IN的用法
select * from table where name in ('jack','Simth','Fuck');
between的用法
select * from table where age between 0 and 10;
给表取别名(方便书写和理解)
select w.name,w.url from websites as w;
表的连接(几种写法)
内连接: select w.name ,a.age from websites as w join access_log as a on w.id=a.site_id;
select w.name ,a.age from websites as w,access_log as a where w.id=a.site_id
左连接: left join
右连接: right join
全连接: MySQL不支持,没详细学
交叉连接(笛卡尔积):select * from table1,table2;
UNION连接俩个select语句,保证俩列相同(数据类型,列数量)
元素不重复出现:select column_name from table1 union select colunm_name from table2;
元素可以重复出现: union all
select into将一个表中选择的项放进一个新表中用于备份
MySQL不支持:select * into newtable from table where ...
MySQL可以使用:create table newtable select * from table;
insert into select 将一个表中数据复制到另一个已经存在的表中
insert into table2 select * from table1;
约束条件:
NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。
DEFAULT - 规定没有给列赋值时的默认值。
not null不接受空值
unique 唯一性
创建表时:create table uniquetest(id int not null,tel char(20) not null,unique(id,tel));
已经有表的时候:
添加约束:alter table Persons add unique(id);
删除约束:alter table Persons drop index id;
primary key 主键约束(唯一性,不能为null,每个表都应该且仅有一个主键)
创建表时:create table pk(id int primary key);
已经有表的时候:
添加约束:alter table pk add primary key(id);
删除约束:alter table pk drop primary key;
foreign key 外键(一个表中的外键指向另一个表中的主键)
FOREIGN KEY 约束用于预防破坏表之间连接的行为。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
创建表时:CREATE TABLE Orders(O_Id int NOT NULL,P_Id int,PRIMARY KEY (O_Id),FOREIGN KEY (P_Id) REFERENCES Persons(P_Id));
已经有表时:
添加外键:alter table Orders add foreign key(P_Id) references Persons(P_Id);
删除外键:alter table Orders drop foreign key P_Id;
check约束条件,只允许特定的值(check在mysql中不起作用,这是一个bug)
创建表时:create table person(id int not null,check(id>0));
已经有表时:
添加check:alter table person add check (id>0);
撤销check约束:alter table person drop check id;
default约束,如果没有规定的其他值,就会将默认值添加到其中
创建表时:create table person(City varchar(255) default 'Beijing');
已经有表时:
添加:alter table person alter city set default 'Beijing';
删除: alter table person alter city drop default;
Index语句(索引)—-不同数据库的索引建立语法不同
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。
因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
在表上建立索引(允许重复的值):create index index_name on table_name (column_name);
在表上建立索引(不允许重复的值):create unique index index_name on table_name(column_name)
删除:(mysql)alter table table_name drop index index_name;
强制使用索引:indexed by indexname--SQLite/force index(indexname)--MySQL
仅删除表内数据,而不删除表
truncate table table_name;
alter table 语句,用于表中添加,删除或修改列
在表中添加列:alter table table_name add column_name datatype;
在表中删除列:alter table table_name drop column column_name;
在表中改变列的数据类型:alter table table_name alter column column_name datatype;
auto_increment 自动加1;identity(a,b)a表示开始数,b表示增长间隔
MySQL中:create table a(id int not null auto_increment);
SQL Server中:create table a(id int identity(1,1) not null);
触发器 (在指定的事件发生后自动触发)
1. create trigger :创建触发器
2. 触发器要说明是在after 还是before事务发生时触发
3. 要指明是insert 、delete、update操作
4. on 表名
5. begin和end之间写触发的动作
6. new 关键字表示更新后的表的字段 ,old表示更新前的表的字段
create trigger audit_log after insert on employees_test
begin
insert into audit values(NEW.ID,NEW.NAME);
end;
SQL视图 (更新视图会对基础表也进行处理)
视图是基于SQL语句的结果集的可视化的表
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
您可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也可以呈现数据,就像这些数据来自于某个单一的表一样。
创建视图:create view view_name as select column_name from table_name where...;
with check option:???
更新视图:update view_name set age=35 where ...;
删除视图:drop view view_name;
SQL Date函数
MySQL:
DATE - 格式:YYYY-MM-DD
DATETIME - 格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
YEAR - 格式:YYYY 或 YY
SQL Server:
DATE - 格式:YYYY-MM-DD
DATETIME - 格式:YYYY-MM-DD HH:MM:SS
SMALLDATETIME - 格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式:唯一的数字
null值的处理
判断:is null/ is not null
函数:如果a值为null,则用b值替换
SQL Server:ISNULL(a,b)
Oracle: NVL(a,b)
MySQL:ifnull(a,b)
coalesce(a,b)
SQL通用数据类型:(更多详情请查表)
数据类型 描述
CHARACTER(n) 字符/字符串。固定长度 n。
VARCHAR(n) 或
CHARACTER VARYING(n) 字符/字符串。可变长度。最大长度 n。
BINARY(n) 二进制串。固定长度 n。
BOOLEAN 存储 TRUE 或 FALSE 值
VARBINARY(n) 或
BINARY VARYING(n) 二进制串。可变长度。最大长度 n。
INTEGER(p) 整数值(没有小数点)。精度 p。
SMALLINT 整数值(没有小数点)。精度 5。
INTEGER 整数值(没有小数点)。精度 10。
BIGINT 整数值(没有小数点)。精度 19。
DECIMAL(p,s) 精确数值,精度 p,小数点后位数 s。例如:decimal(5,2) 是一个小数点前有 3 位数小数点后有 2 位数的数字。
NUMERIC(p,s) 精确数值,精度 p,小数点后位数 s。(与 DECIMAL 相同)
FLOAT(p) 近似数值,尾数精度 p。一个采用以 10 为基数的指数计数法的浮点数。该类型的 size 参数由一个指定最小精度的单一数字组成。
REAL 近似数值,尾数精度 7。
FLOAT 近似数值,尾数精度 16。
DOUBLE PRECISION 近似数值,尾数精度 16。
DATE 存储年、月、日的值。
TIME 存储小时、分、秒的值。
TIMESTAMP 存储年、月、日、小时、分、秒的值。
INTERVAL 由一些整数字段组成,代表一段时间,取决于区间的类型。
ARRAY 元素的固定长度的有序集合
MULTISET 元素的可变长度的无序集合
XML 存储 XML 数据
SQL函数
其中aggregate函数有:
AVG() - 返回平均值
-- 查询count这一列的平均数 -- select avg(count) as CountAverage from access_log;
-- 查询count这一列中大于平均数的所有数据 -- select * from access_log where count >(select avg(count) from access_log);
COUNT() - 返回行数
-- 查询所有记录的条数 -- select count(*) fom access_log;
-- 查询websites 表中 -- alexa列中不为空的记录的条数 select count(alexa) from websites;
-- 查询websites表中 -- country列中不重复的记录条数 select count(distinct country) from websites;
FIRST() - 返回第一个记录的值
-- SQL没有这个函数,用limit实现-- SELECT column_name FROM table_name LIMIT 1;
LAST() - 返回最后一个记录的值
-- SQL没有这个函数,用limit实现-- SELECT column_name FROM table_name ORDER BY column_name DESC LIMIT 1;
MAX() - 返回最大值
-- 返回指定列的最大值 -- select max(count) from access_log;
MIN() - 返回最小值
-- 返回指定列的最小值 -- select min(count) from access_log;
SUM() - 返回总和
-- 返回指定列的和 -- select sum(count) from access_log;
其中Group by 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
简单应用: -- 将相同site_id号的count值加起来,并重新命名为nums -- select site_id,sum(access_log.count) as nums from access_log group by site_id;
多表连接: -- -- select websites.name,count(access_log.site_id) as Nums from access_log left join websites on access_log.site_id=websites.id group by websites.name order by Nums;
其中having 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用,HAVING 子句可以让我们筛选分组后的各组数据。
having与聚合函数合用: -- 查找总访问量大于 200 的网站 -- select w.name,w.url,sum(a.count) as s from (websites as w join access_log as a on w.id=a.site_id) group by w.name having s>200;
Scalar函数
UCASE()/UPPER() - 将某个字段转换为大写 -- 只改变了显示,并没有改变基础表的内容 -- select upper(name) from websites;
LCASE()/LOWER() - 将某个字段转换为小写 -- 只改变了显示,并没有改变基础表的内容 -- select lower(name) from websites;
MID() - 从某个文本字段提取字符,MySql 中使用 -- 语法 -- SELECT MID(column_name,start,length) FROM table_name;
SubString(字段,1,end) - 从某个文本字段提取字符
LEN() - 返回某个文本字段的长度
-- SQL-- SELECT LEN(column_name) FROM table_name;
-- MySQL -- SELECT LENGTH(column_name) FROM table_name;
ROUND() - 对某个数值字段进行指定小数位数的四舍五入
-- ROUND(X): 返回参数X的四舍五入的一个整数。-- select ROUND(1.58); -> 2
-- ROUND(X,D): 返回参数X的四舍五入的有 D 位小数的一个数字。如果D为0,结果将没有小数点或小数部分。 -- select ROUND(1.298, 1); -> 1.3
NOW() - 返回当前的系统日期和时间 – 返回当前时间 – select now();
FORMAT() - 格式化某个字段的显示方式 – 语法 – SELECT FORMAT(column_name,format) FROM table_name;