MYSQL基本知识 学习笔记 1

1 distinct

查找不重复的行

distinct(列名)

2 and / or

多个条件的选择

SELECT"栏位名"FROM"表格名"WHERE"简单条件"{[AND|OR]"简单条件"}+

{}+代表{}之内的情况会发生一或多次

用()来代表条件的先后次序

 

3 in

不连续(discrete)的值

SELECT"栏位名"FROM"表格名"WHERE"栏位名"IN('值一','值二',...)

4 between

连续的范围(range)内

SELECT"栏位名"FROM"表格名"WHERE"栏位名"BETWEEN'值一'AND'值二'

 

5 like

依据一个模式(pattern)

SELECT"栏位名"FROM"表格名"WHERE"栏位名"LIKE{模式}

{模式}经常包括 通配符 (wildcard)

'A_Z':所有以'A'起头,另一个任何值的字原,且以'Z'为结尾的字符串。'ABZ'和'A2Z'都符合这一个模式,而'AKKZ'并不符合(因为在A和Z之间有两个字原,而不是一个字原)

'ABC%':所有以'ABC'起头的字符串。举例来说,'ABCD'和'ABCABC'都符合这个模式

'%XYZ':所有以'XYZ'结尾的字符串。举例来说,'WXYZ'和'ZZXYZ'都符合这个模式

'%AN%':所有含有'AN'这个模式的字符串。举例来说,'LOSANGELES'和'SANFRANCISCO'都符合这个模式

/*************有序排列***********/

orderby

由小往大(ascending)或是由大往小(descending)

SELECT"栏位名"FROM"表格名"[WHERE"条件"]ORDERBY"栏位名"[ASC,DESC]

 

/************函数***********/

数学运算

AVG(平均) COUNT(计数) MAX(最大值) MIN(最小值) SUM(总合)

 

对于文字类的资料,SQL也有好几个文字处理方面的函数,例如文字相连(concatenation),文字修整(trim),以及子字符串(substring)

 

SELECT"函数名"("列名") FROM"表格名"

 

count+is not null/distinct

 

SELECT COUNT(列名) FROM 表名 WHERE 列名 is not NULL

SELECT COUNT(DISTINCT 列名) FROM表名

 

group by

SELECT"列名1",SUM("列名2") FROM"表名" GROUP BY"列名1"

关系:首先需要选出两栏,然后栏2依据栏1计算

使用:当选择不止一个栏位且其中至少一个栏位有包含函数的运用时,除了应用函数的栏位,其他栏位都在group by子句中

 

Having

用来对函数产生的结果值设定条件

SELECT"列名1",SUM("列名2") FROM"表名" GROUP BY "列名1" HAVING(函数条件[SUM("列名2")>N])

 

alias

最常用到的别名有两种:栏位别名(包括选择产生的新栏位,如SUM("栏位2"))及表格别名

SELECT"表格别名"."列名1""列名别名" FROM"表名""表格别名"

 

表格链接?

左连接(leftjoin),又称内部连接(innerjoin)需要两个表格内都有同样的值,那一笔资料才会被选出

如果没有,就要用到SQLOUTERJOIN(外部连接)[不同数据库可能有不同语法]

 

concatenate串联

MySQL:CONCAT() Oracle:CONCAT(),|| SQLServer:+

CONCAT()的语法如下: CONCAT(字符串1,字符串2,字符串3,...)

 

[请注意,Oracle的CONCAT()只允许两个参数;换言之,一次只能将两个字符串串连起来。不过,在Oracle中,我们可以用'||'来一次串连多个字符串]

 

substring

MySQL:SUBSTR(),SUBSTRING()  Oracle:SUBSTR()  SQLServer:SUBSTRING() 

SUBSTR(str,pos):由<str>中,选出所有从第<pos>位置开始的字符。请注意,这个语法不适用于SQLServer上。  SUBSTR(str,pos,len):由<str>中的第<pos>位置开始,选出接下去的<len>个字符。

 

trim

MySQL:TRIM(),RTRIM(),LTRIM()  Oracle:RTRIM(),LTRIM()  SQLServer:RTRIM(),LTRIM()  TRIM([[位置][要移除的字符串]FROM]字符串):[位置]的可能值为LEADING(起头),TRAILING(结尾),orBOTH(起头及结尾)。这个函数将把[要移除的字符串]从字符串的起头、结尾,或是起头及结尾移除。如果我们没有列出[要移除的字符串]是什么的话,那空白就会被移除。  LTRIM(字符串):将所有字符串起头的空白移除。 RTRIM(字符串):将所有字符串结尾的空白移除。

 

 

/******************表格处理*****************************/

/********create table******/

column——row

CREATE TABLE"表 名" ("列1" "列1 数据类型", "列2" "列2数据类型", ...) 

constraint(声明在数据类型后)

常见的限制

not null/unique/check/primary key主键/foreign key外键

check限制用来保证栏位中所有资料符合某个条件SIDintegercheck(SID》0)

多个主键是组合键composite key

 

//设定主键语法

MySQL:  CREATETABLECustomer  (SIDinteger,  Last_Namevarchar(30), First_Namevarchar(30), PRIMARYKEY(SID));  Oracle:  CREATETABLECustomer (SIDintegerPRIMARYKEY, Last_Namevarchar(30), First_Namevarchar(30));  SQLServer:  CREATETABLECustomer (SIDintegerPRIMARYKEY, Last_Namevarchar(30), First_Namevarchar(30));  修改主键

ALTERTABLECustomerADDPRIMARYKEY(SID);确认被设定为主键的非空notnull

//外来键是一个(或数个)指向另外一个表格主键的栏位

create table声明语句中:

MySQL:  CREATETABLEORDERS (Order_IDinteger, Order_Datedate, Customer_SIDinteger,  Amountdouble, PrimaryKey(Order_ID), Foreign Key(Customer_SID) references CUSTOMER(SID)); 

Oracle:  CREATETABLEORDERS (Order_IDintegerprimarykey, Order_Datedate,  Customer_SIDintegerreferencesCUSTOMER(SID), Amountdouble); 

SQLServer:  CREATETABLEORDERS (Order_IDintegerprimarykey, Order_Datedatetime,  Customer_SIDintegerreferencesCUSTOMER(SID),  Amountdouble); 

/***********VIEW视图*************/

是建立在实际表格之上的一个架构,虚拟表格,并不真实存储数据。

CREATEVIEW"VIEW_NAME"AS"SQL语句"

 

/*************索引*******************/

在表格上建立索引是一件有利于系统效率的事。一个索引可以涵盖一或多个栏位。建立索引的语法:

CREATEINDEX"INDEX_NAME"ON"TABLE_NAME"(COLUMN_NAME)

索引的命名并没有一个固定的方式。通常会用的方式是在名称前加一个字首,例如"IDX_",另外,在索引名之内包括表格名及栏位名也是一个好的方式。 

索引只能删除重建,不能更改

 

/***********alter table**************/

加一个栏位:ADD"栏位1""栏位1资料种类"  删去一个栏位:DROP"栏位1"  改变栏位名称:CHANGE"原本栏位名""新栏位名""新栏位名资料种类"  改变栏位的资料种类:MODIFY"栏位1""新资料种类"  ALTER table表名 add 列名 char(1) 

 

/***********删除表格drop table***************/

DROPTABLE表格名   ——删除表格

TRUNCATETABLE表格名   ——清楚表格数据

 

/****************表格数据*******************/

插入新数据insert into

INSERT INTO"表格名"("栏位1","栏位2",...)VALUES("值1","值2",...)  修改更新数据update

UPDATE"表格名"SET"栏位1"=[新值] WHERE{条件} 

删除数据

DELETEFROM"表格名" WHERE{条件} 

/**************SQL概念及关键字运算***************/

SQL UNION  SQL UNIONALL  SQL  INTERSECT  SQL MINUS  SQL Subquery  SQL EXISTS  SQL CASE 

排名(Rank)  中位数(Median)  累积总计(RunningTotal)  总合百分比(PercenttoTotal)  累积总合百分比(CumulativePercenttoTotal) 

 

union

UNION指令的目的是将两个SQL语句的结果合并起来。从这个角度来看,UNION跟JOIN有些许类似,因为这两个指令都可以由多个表格中撷取资料。

UNION的一个限制是两个SQL语句所产生的栏位需要是同样的资料种类。另外,当我们用UNION这个指令时,我们只会看到不同的资料值(类似SELECT  DISTINCT)。结果无重复。

union all

UNION ALL 这个指令的目的也是要将两个SQL语句的结果合并在一起。UNION ALL和UNION不同之处在于UNION ALL会将每一笔符合条件的资料都列出来,无论资料值有无重复。  

 

intersect

和UNION指令类似,INTERSECT也是对两个SQL语句所产生的结果做处理的。不同的地方是,  UNION基本上是一个OR(如果这个值存在于第一句或是第二句,它就会被选出),而INTERSECT则比较 像AND(这个值要存在于第一句和第二句才会被选出)。UNION是联集,而INTERSECT是交集。

minus

MINUS指令是运用在两个SQL语句上。它先找出第一个SQL语句所产生的结果,然后看这些结果有没有 在第二个SQL语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。如果第 二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料也会被抛弃。

子查询

我们可以在一个SQL语句中放入另一个SQL语句。当我们在WHERE子句或HAVING子句中插入另一个  SQL语句时,我们就有一个子查询(subquery)的架构。子查询的作用是什么呢?第一,它可以被用来连 接表格。另外,有的时候子查询是唯一能够连接两个表格的方式。 SELECT"栏位1" FROM"表格" WHERE"栏位2"[比较运算素] (SELECT"栏位1" FROM"表格"WHERE[条件])  [比较运算素]可以是相等的运算素,例如=,>,<,>=,<=.这也可以是一个对文字的运算素,例如"LIKE"

 

exists

基本上,EXISTS是用来测试内查询有没有产生任何结果。如果有的话,系统就会执行外查询中的SQL。若是没有的话,那整个SQL语句就不会产生任何结果。而查询结果不一定与内查询有关系。 SELECT"栏位1"FROM"表格1"WHEREEXISTS (SELECT* FROM"表格2" WHERE[条件])

 

case

是SQL用来做为if-then-else之类逻辑的关键字。CASE的语法如下:  SELECTCASE("栏位名")   WHEN"条件1"THEN"结果1"   WHEN"条件2"THEN"结果2"   ...   [ELSE"结果N"]   END FROM"表格名" "条件"可以是一个数值或是公式。 ELSE子句则并不是必须的。

 

/**************SQL语法***********************/

select 列 from 表名

select distinct 列 from 表名

select distinct 列 from 表名 where 条件

select 列 from 表名 where 简单条件 {[and/or] 简单条件}+

select 列 from 表名 where 列in(值1,值2,..)

select 列 from 表名 where between值1 and 值2

select 列 from 表名 where like{模式}

select 列 from 表名 [whereᅠ条件]order by列 [asc,desc]

select count(列) from 表名

select 列1,sum(列2) from 表名 group by列1

select 列1,sum(列2) from 表名 group by 列1 having(函数条件)

 

create table表名(列1 列1数据类型,列2 列2数据类型,...)

drop table表名

truncate table表名

insert into表名(列1,列2,....) values(值1,值2,...)

insert into 表名(列1,列2,...) values(值1,值2,...),(值1,值2,...),(值1,值2,...),(值1,值2,...) //mysql特有的插入有限的多条记录

update表名 set 列1=新值 where 条件

delete from表名 where 条件 

 

posted @ 2013-04-12 12:22  bubu_步步  阅读(308)  评论(0编辑  收藏  举报