笔记-sql语句
笔记-sql语句
1. sql语句基础
虽然经常使用sql语句,但没有一个整体式的文档,整理了一下。
1.1. select
foundation:
select <colnum>,<column> from table where ….;
1.2. select distinct
返回唯一不同的值
语法:
SELECT DISTINCT column_name,column_name
FROM table_name;
需要注意的是distinct单列与多列
distinct单列select distinct(a) from tableA;
比较简单,没什么可说的。
distinct多列select distinct a,b,c from tableA;
注意此时是将a,b,c三列所有不同的组合全部列出来,而不仅仅只是distinct a
相当于以下语句:
select a,b,c from tableA group by a,b,c
另外一种的distinct多列
想分别查某一张表的几个字段的distinct值
select distinct a from tableA;
select distinct b from tableA;
select distinct c from tableA;
这样是可以达到目的的。但是这样要写三条语句,不爽,想着用一条语句达到目的。
思考了一会,想到用union来解决这个问题。
select distinct(a) || ' a' from tableA
union all
select distinct(b) || ' b' from tableA
union all
select distinct(c) || ' c' from tableA
这样就达到了一条语句查询出所有结果的目的。后面拼接的字符串是为了标识这个值属于哪个字段。
1.3. where
SELECT column_name,column_name
FROM table_name
WHERE column_name operator value;
WHERE 子句中的运算符:=,<>(!=),>,<,>=,<=,BETWEEN,LIKE,IN
1.4. and & or
略
需要注意的是组合式判断时需要留心运算优先级,使用括号是较好的习惯。
SELECT * FROM Websites WHERE alexa > 15 AND (country='CN' OR country='USA');
1.5. order by
语法
SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;
注意:MySQL中的排序,是以字节码进行排序的,当第一个字相同的时候,比较第二个字的字节码, 依次类推
多字段排序order by col1,col2 desc
是先按col1排序,如果col1值相同再按col2排序
1.6. insert into
insert into table_name values(v1,v2…)
insert into tablename (col1,col2….) values(v1,v2…..)
1.7. update
update tablename
set col1=v1, col2=v2….
where ……;
1.8. delete
delete from tablename where ….;
delete * from table_name;或delete from tablename;效果一样。
2. 进阶
2.1. select top
SELECT TOP 子句用于规定要返回的记录的数目。
SELECT TOP 子句对于拥有数千条记录的大型表来说,是非常有用的
注意:并非所有的数据库系统都支持 SELECT TOP 语句。 MySQL 支持 LIMIT 语句来选取指定的条数数据, Oracle 可以使用 ROWNUM 来选取。
select * from t where age > 30 limit 20;
2.2. like
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;
案例:SELECT * FROM db_store.em1 where name like '白%';
2.3. pattern
SQL 通配符
在 SQL 中,通配符与 SQL LIKE 操作符一起使用。
SQL 通配符用于搜索表中的数据。
通配符 描述
% 替代 0 个或多个字符
_ 替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]
或
[!charlist] 不在字符列
mysql只支持%_,其它和正则比较类似,不多言。
2.4. in
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
案例:select * from db_store.t where age in (22,23) limit 1000 ;
2.5. between
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
between包括边界:
select count(*) from db_store.t where age in (22,23);
select count(*) from db_store.t where age between 22 and 23;
2.6. 别名
列的 SQL 别名语法
SELECT column_name AS alias_name
FROM table_name;
表的 SQL 别名语法
SELECT column_name(s)
FROM table_name AS alias_name;
2.7. Join
2.8. union
UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。
默认情况下UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
注释:
- UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名;
- UNION 结果集中的列名总是等于第一个 SELECT 语句中的列名;
- UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
select col from table1
union [all]
select col from table2;
如果想使用ORDER BY或LIMIT子句来对全部UNION结果进行分类或限制,则应对单个地SELECT语句加圆括号,并把ORDER BY或LIMIT放到最后一个的后面:
(SELECT uid,umobile,realname FROM users WHERE vip IN (8, 9))
UNION
(SELECT uid,umobile,realname FROM use
2.9. select into
mysql不支持select ….into,对应的语法是insert into …. select …… from
insert into em2 select * from em1;
2.10. constraints
SQL 约束用于规定表中的数据规则。
如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
在 SQL 中,有如下约束:
NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。
DEFAULT - 规定没有给列赋值时的默认值。
2.10.1. null约束修改:
alter table x modify column_name null;
alter table x modify column_name not null;
案例:
alter table yy add column j int after e;
alter table yy modify j int not null;
alter table yy modify j int null;
2.10.2. unique
创建表时单列唯一性约束:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
)
创建表时多列唯一性约束:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)
当表已被创建时,如需添加UNIQUE约束:
ALTER TABLE Persons ADD UNIQUE (P_Id)
如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
撤销 UNIQUE 约束:
ALTER TABLE Persons DROP INDEX uc_PersonID
2.10.3. primary key
单列主键约束:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
多列主键约束:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)
当表已被创建时,创建 PRIMARY KEY 约束:
ALTER TABLE Persons ADD PRIMARY KEY (P_Id)
多列PRIMARY KEY约束:
ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
撤销PRIMARY KEY约束:
ALTER TABLE Persons DROP PRIMARY KEY
2.10.4. foreign key
一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)。
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)
表已创建时,创建FOREIGN KEY约束:
ALTER TABLE Orders ADD FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
定义多列FOREIGN KEY约束:
ALTER TABLE Orders ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
撤销FOREIGN KEY约束:
ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders
2.11. check
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)
ALTER SQL CHECK约束:
ALTER TABLE Persons ADD CHECK (P_Id>0)
ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
撤销CHECK约束:
ALTER TABLE Persons DROP CHECK chk_Person
2.12. default
DEFAULT 约束用于向列中插入默认值。
一般情况下创建表时使用:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
当表已被创建时:
ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES'
撤销DEFAULT约束:
ALTER TABLE Persons ALTER City DROP DEFAULT
2.13. index
CREATE INDEX 语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
创建索引:
CREATE INDEX index_name ON table_name (column_name)
CREATE UNIQUE INDEX index_name ON table_name (column_name)
如果希望索引不止一个列:
CREATE INDEX Pindex ON Persons (LastName, FirstName)
2.14. drop
alter table tablename frop index index_name;
drop table table_name;
drop database database_name;
# 删除表内数据,不删除表
truncate table table_name;
与delete的区别:
truncate:会清空表中所有的数据,速度快,不可回滚;实质是删除整张表包括数据再重新创建表;
delete:逐行删除数据,每步删除都是有日志记录的,可以回滚数据;实质是逐行删除表中的数据;
2.15. alter
ALTER TABLE 语句用于在已有的表中添加、删除或修改列。
在表中添加列:
ALTER TABLE table_name ADD column_name datatype
删除表中的列:
ALTER TABLE table_name DROP COLUMN column_name
要改变表中列的数据类型:
ALTER TABLE table_name MODIFY COLUMN column_name datatype
2.16. autoincrement
Auto-increment 会在新记录插入表中时生成一个唯一的数字。
CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (ID)
)
默认AUTO_INCREMENT的初始值为1,每条新记录递增1;
想让序列以其他的值起始:
ALTER TABLE Persons AUTO_INCREMENT=100
创建表后修改为自增,视为字段属性修改:
alter table em2 modify column id smallint not null auto_increment;
注意:复制表或select *都会导致表中的自增列数据为select出的数据,如果想要实现本表自增,需要只插入非自增列:
SELECT * FROM db_store.em2;
insert into em2 (name,sex,id_num,gjj_account,gzsj,jiguan) select name,sex,id_num,gjj_account,gzsj,jiguan from employer;
2.17. view
视图是可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也可以呈现数据,就像这些数据来自于某个单一的表一样。
创建视图:
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
更新视图:
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
删除视图。
DROP VIEW view_name
2.18. date
SQL Date 函数
SQL 日期(Dates)
处理日期时,有一点很麻烦-确保插入日期的格式,与数据库中日期列的格式相匹配。
在讨论日期查询的复杂性之前,我们先来看看最重要的内建日期处理函数。
MySQL Date 函数
下面的表格列出了 MySQL 中最重要的内建日期函数:
函数 |
描述 |
返回当前的日期和时间 |
|
返回当前的日期 |
|
返回当前的时间 |
|
提取日期或日期/时间表达式的日期部分 |
|
返回日期/时间的单独部分 |
|
向日期添加指定的时间间隔 |
|
从日期减去指定的时间间隔 |
|
返回两个日期之间的天数 |
|
用不同的格式显示日期/时间 |
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
DATE - 格式:YYYY-MM-DD
DATETIME - 格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
YEAR - 格式:YYYY 或 YY
注意:where time = ‘2012-12-12’只能匹配日期格式的2012-12-12,并不能匹配时间
如果将它与2012-12-12 13:34:32进行比较,会被自动转为2012-12-12 00:00:00,结果当然是否。
alter table em2 modify stamp timestamp not null default now();
2.19. null
NULL 值代表遗漏的未知数据。
默认地,表的列可以存放 NULL 值。
无法使用比较运算符来测试 NULL 值,比如 =、< 或 <>。
2.20.
3. sql函数
SQL Aggregate函数计算从列中取得的值,返回一个单一的值。
常用Aggregate函数:
AVG() - 返回平均值
COUNT() - 返回行数
FIRST() - 返回第一个记录的值
LAST() - 返回最后一个记录的值
MAX() - 返回最大值
MIN() - 返回最小值
SUM() - 返回总和
SQL Scalar函数:基于输入值,返回一个单一的值。
常用Scalar函数:
UCASE() - 将某个字段转换为大写
LCASE() - 将某个字段转换为小写
MID() - 从某个文本字段提取字符,MySql 中使用
SubString(字段,1,end) - 从某个文本字段提取字符
LEN() - 返回某个文本字段的长度
ROUND() - 对某个数值字段进行指定小数位数的四舍五入
NOW() - 返回当前的系统日期和时间
FORMAT() - 格式化某个字段的显示方式
笔记-sql语句的更多相关文章
- MYSQL学习笔记——sql语句优化工具
优化sql:思路: 使用explan->先查询type类型看看是all还是ref,然后判断 possible_keys (显示可能应用在这张表中的索引, 一个或多个.查询涉及到的字段是若存在索引 ...
- 金典 SQL笔记 SQL语句汇总
SELECT * FROM (SELECT ROW_NUMBER() OVER ( ORDER BY id) AS rowN,FNumber, FName,FSalary ,Fage FROM dbo ...
- Oracle笔记--Sql语句
1.SQL的三种类型语句: --1)DML(Data Manipulation Language)数据操纵语言 --2)DDL(Data Definition Language):数据定义语言 --3 ...
- MYSQL学习笔记——sql语句优化之索引
上一篇博客讲了可以使用慢查询日志定位耗时sql,使用explain命令查看mysql的执行计划,以及使用profiling工具查看语句执行真正耗时的地方,当定位了耗时之后怎样优化呢?这篇博客会介绍my ...
- SQL Server笔记——sql语句创建数据库
MS SQLServer的每个数据库包含: 1个主数据文件(.mdf)必须. 1个事务日志文件(.ldf)必须. 可以包含: 任意多个次要数据文件(.ndf) 多个事务日志文件 CREATE DATA ...
- (三)Oracle学习笔记—— sql语句
0. scott 用户默认表介绍 scott用户Tables目录下包含四张表 1. insert(插入)语句 给指定列插入数据: ,'xx'); 插入全部列数据: ,'xx','lll'); 2. u ...
- MySQL 笔记整理(18) --为什么这些SQL语句逻辑相同,性能却差异巨大?
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 18) --为什么这些SQL语句逻辑相同,性能却差异巨大? 本篇我们以三 ...
- SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 12(The End)
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 11------------------- 现在,我们希望从 " ...
随机推荐
- 学习Road map Part 03 编程和算法
方法: 优先重复已学过的内容 写学习笔记
- June 28th 2017 Week 26th Wednesday
Anger begins with folly, and ends in repentance. 愤怒以愚蠢开始,以后悔告终. Learn to control your temper, don't ...
- 41. First Missing Positive (sort) O(n) time
Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...
- WEB开发的jsp例子标签库(jstl)的使用
<!-- e1 --> <%@ page language="java" contentType="text/html; charset=UTF-8&q ...
- 阅读HandlerInterceptor接口源码的理解
一.阅读接口类注释 我先理解的方法,方法都看懂了类注释自然而然明白了.所以此处略. 二.阅读preHandle()方法注释 Intercept the execution of a handler. ...
- SOJ4459 skysky's game(贪心+优先队列)
天天最近迷上了天天爱消除游戏,现在他觉得这个游戏已经没有意思了.所以他发明一个新的消除游戏.有n堆糖果,每一个糖果有一个重量w,天天每次都选择两个糖果合并为一个糖果,新的糖果的重量等于这两个糖果的重量 ...
- functions and closures are reference types-函数和闭包是引用类型
Closures Are Reference Types In the example above, incrementBySeven and incrementByTen are constants ...
- Yii自定义验证规则
简单的方法:在 model 内部定义规则 最简单的定义验证规则的方法是在使用它的模型(model)内部定义. 比方说,你要检查用户的密码是否足够安全. 通常情况下你会使用 CRegularExpres ...
- Centos 安装libevent
1.在http://libevent.org/下载libevent-2.1.8-stable.tar.gz 2.解压缩 tar -zxvf libevent-2.1.8-stable.tar.gz c ...
- linux 重启 启动 apache服务
如何使用service httpd restart,不成功的话,直接去apache文件目录里去找可执行文件,执行启动. 一般apache目录 ./usr/local/httpd/bin ,在bin目 ...