笔记-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。

注释:

  1. UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名;
  2. UNION 结果集中的列名总是等于第一个 SELECT 语句中的列名;
  3. 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 中最重要的内建日期函数:

函数

描述

NOW()

返回当前的日期和时间

CURDATE()

返回当前的日期

CURTIME()

返回当前的时间

DATE()

提取日期或日期/时间表达式的日期部分

EXTRACT()

返回日期/时间的单独部分

DATE_ADD()

向日期添加指定的时间间隔

DATE_SUB()

从日期减去指定的时间间隔

DATEDIFF()

返回两个日期之间的天数

DATE_FORMAT()

用不同的格式显示日期/时间

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语句的更多相关文章

  1. MYSQL学习笔记——sql语句优化工具

    优化sql:思路: 使用explan->先查询type类型看看是all还是ref,然后判断 possible_keys (显示可能应用在这张表中的索引, 一个或多个.查询涉及到的字段是若存在索引 ...

  2. 金典 SQL笔记 SQL语句汇总

    SELECT * FROM (SELECT ROW_NUMBER() OVER ( ORDER BY id) AS rowN,FNumber, FName,FSalary ,Fage FROM dbo ...

  3. Oracle笔记--Sql语句

    1.SQL的三种类型语句: --1)DML(Data Manipulation Language)数据操纵语言 --2)DDL(Data Definition Language):数据定义语言 --3 ...

  4. MYSQL学习笔记——sql语句优化之索引

    上一篇博客讲了可以使用慢查询日志定位耗时sql,使用explain命令查看mysql的执行计划,以及使用profiling工具查看语句执行真正耗时的地方,当定位了耗时之后怎样优化呢?这篇博客会介绍my ...

  5. SQL Server笔记——sql语句创建数据库

    MS SQLServer的每个数据库包含: 1个主数据文件(.mdf)必须. 1个事务日志文件(.ldf)必须. 可以包含: 任意多个次要数据文件(.ndf) 多个事务日志文件 CREATE DATA ...

  6. (三)Oracle学习笔记—— sql语句

    0. scott 用户默认表介绍 scott用户Tables目录下包含四张表 1. insert(插入)语句 给指定列插入数据: ,'xx'); 插入全部列数据: ,'xx','lll'); 2. u ...

  7. MySQL 笔记整理(18) --为什么这些SQL语句逻辑相同,性能却差异巨大?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 18) --为什么这些SQL语句逻辑相同,性能却差异巨大? 本篇我们以三 ...

  8. SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

    目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...

  9. SQLServer 学习笔记之超详细基础SQL语句 Part 12(The End)

    Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 11------------------- 现在,我们希望从 " ...

随机推荐

  1. 阿里云免费ssl,https证书的申请和校验

    其实写这个之前一直在考虑要不要写出来 ,真的官方文档实在太强大了,连视频都给你录好了,配不好的,是不是可以考虑不用写程序了, 忽然想到第一次使用微信测试号,进行域名认证的时候,因为后台返回“echar ...

  2. 十一.安装Redis

    redis是一个NOSql数据库,在java web中,经常用来存储session等,官网是https://redis.io/ 当前官网指出的稳定版本为3.2.6,下载地址为http://downlo ...

  3. TraceWrite waittype

    今天上午突然开发人员叫起来说数据库非常慢,马上连上数据查看. 使用sp_who2和下面脚本可以看到大量的TraceWrite 等待事件.我的第一反应就是有人启用的Profiler在生产服务器上抓数据了 ...

  4. 20145223 杨梦云 《网络对抗》 Web安全基础实践

    20145223 杨梦云 <网络对抗> Web安全基础实践 1.实验后回答问题 (1)SQL注入攻击原理,如何防御 **原理**:SQL注入攻击是通过构建特殊的输入作为参数传入web应用程 ...

  5. es6之decorator

    //decorator //第三方库为:core-decorators //以下为代码实例 { //decorator //修饰器是一个函数 //是修改一个行为 //修改一个类的行为 console. ...

  6. window使用结束进程

    在cmd中输入下面信息: 1. 查看所有进程占用的端口 :netstat -ano 2.查看占用指定端口的程序:netstat –ano|findstr 指定端口号 3.杀死相关的进程: 方法一:使用 ...

  7. New Language Features in C# 6

    Source:https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6 This document describes ...

  8. springboot自定义异常页面

    废话不多,直接开始. 项目目录: 说明:springboot 静态文件放在static目录中,如images中放的图片:templates目录下error中存放的是错误页面,如500.html代表50 ...

  9. 一、hadoop 及 hadoop的环境搭建

    一.Hadoop引言 Hadoop是在2006年雅虎从Nutch(给予Java爬虫框架)工程中剥离一套分布式的解决方案.该方案参考了Goggle的GFS(Google File System)和Map ...

  10. js实现点击按钮可实现编辑

    <script type="text/javascript">//修改密码//抓取到的数据 function edit() { document.getElementB ...