!注释方式
# -- 单行
/* */ 多行
1.SELECT column1,column2,column3 FROM tablename WHERE id <= 5;
2.SELECT DISTINCT column1,column2 FROM tablename WHERE id <= 5;
去掉所有column里的重复列
3.SELECT column1 FROM tablename WHERE id = 1 LIMIT 5 ;
选取 前5条
4.SELECT column1 FROM tablename WHERE id = 1 LIMIT 5 OFFSET 5;
从第5条开始 选取5条 下标从第0条开始计算
可以简写为 SELECT column1 FROM tablename WHERE id = 1 LIMIT 5 , 5;
5. 排序规则有DESC/DESCENDING 和 ASC/ASCENDING 默认是ASC 降序排列必须指明 DESC
如果没有指定排序,则不应该假定检索出来的数据的顺序有任何意义
SELECT column1,column FROM tablename WHERE id = 1 ORDER BY column DESC;
一定要确保 ORDER BY 是SQL语句的最后一条语句,否则将会出现问题
column可以是表中的任何字段,并不一定是要显示的列
SELECT column1,column2 FROM tablename WHERE id = 1 ORDER BY columnX,columnY ASC;
先按照columnX排列,再在此基础之上按照columnY排列
SELECT column1,column2 FROM tablename WHERE id = 1 ORDER BY 1,2;
支持相对列位置进行排列 先按照column1排列,再在此基础之上按照column2排列
SELECT column1,column2 FROM tablename WHERE id = 1 ORDER BY columnX DESC,columnY ASC;
先按照columnX降序排列,再在此基础之上按照columnY升序排列
6.检索指定数据要给予 过滤条件 即:WHERE子句
SELECT column1 FROM tablename WHERE id = 1;
常用操作符
操作符 说 明
= 等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN X AND Y 在指定的X,Y之间的值
IS NULL 为NULL值
NULL与字段0、空字符串、空格不同 只用用 IS NULL来验证
7.SQL允许给出多个WHERE子句。这些子句有两种使用方式,即以AND子句或OR子句的方式使用,
逻辑操作符用来联结或改变WHERE子句中的子句的关键字。
SELECT column1 FROM tablename WHERE id = 1 AND pid =>2;
同时满足两个条件id = 1,pid =>2的数据才会被检索出来
可以增加多个过滤条件,每个条件间都要使用AND关键字。
类似于交集
SELECT column1 FROM tablename WHERE id = 1 OR pid =>2;
只要满足其中一个条件id = 1 或者pid =>2的数据才会被检索出来
但是在第一个条件满足时,不管第二个条件是否满足,相应的行都将被检索出来
类似于并集
SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。
SELECT column1 FROM tablename WHERE id = 1 OR pid =>2 AND uid =2;
但是可以用括号提高优先级
SELECT column1 FROM tablename WHERE (id = 1 OR pid =>2) AND uid =2;
任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希望的那样。使用圆括号没有什么坏处,它能消除歧义。
8.IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号中的合法值。
SELECT column1 FROM tablename WHERE id in ('1','2','3');
选取id为1 或者2 或者3的数据,可以这样理解
SELECT column1 FROM tablename WHERE id=1 OR id=2 OR id=3;
选取的结果为并集,IN操作符一般比一组OR操作符执行得更快,并且可以包含其他SELECT语句
NOT 否定其后所跟的任何条件。因为NOT从不单独使用,所以它的语法与其他操作符有所不同。NOT关键字可以用在要过滤的列前,而不仅是在其后。
SELECT column1 FROM tablename WHERE NOT id=1;
选取除了id=1之外的所有数据
SELECT column1 FROM tablename WHERE id!=1;
!! NOT简单语句没有什么优势,但是可以和 IN BETWEEN EXISTS语句合并
9.模糊查询 LIKE NOT LIKE
通配符搜索只能用于文本字段(串),非文本数据类型字段不能使用通配符搜索。
百分号(%)通配符,在搜索串中,%表示任何字符出现任意次数 包括0
SELECT column1 FROM tablename WHERE username='A%';
所有username以A开头的用户
SELECT column1 FROM tablename WHERE username='%A%';
所有username包含字母A的用户
SELECT column1 FROM tablename WHERE username='A%s';
所有username以A开头B结尾的用户
通配符%看起来像是可以匹配任何东西,但有个例外,这就是NULL。
WHERE username LIKE '%'不会匹配用户名称为NULL的行。
通配符是下划线 _ 下划线的用途与%一样,但它只匹配单个字符,而不是多个字符。
SELECT column1 FROM tablename WHERE username='A_s';
所有username以A开头s结尾的,并且只能是三个字母 比如:ABs Abs
10.方括号[]通配符
类似于正则表达式的[],它必须匹配指定位置的一个指定字符范围。
SELECT column1 FROM tablename WHERE username='[ABC]%';
所有username以A开头或者B开头的用户或者C开头的用户
否定 在[]中加上^否定符号
SELECT column1 FROM tablename WHERE username='[^ABC]%';
所有username不以A开头或者B开头的用户或者C开头的用户
正如所见,SQL的通配符很有用。但这种功能是有代价的,即通配符搜索一般比前面讨论的其他搜索要耗费更长的处理时间。这里给出一些使用通配符时要记住的技巧。
a.不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
b.在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
c.仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
11.计算字段是运行时在SELECT语句内创建的,是直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户端应用程序中重新格式化。计算字段并不实际存在于数据库表中。需要特别注意,只有数据库知道SELECT语句中哪些列是实际的表列,哪些列是计算字段。从客户端(如应用程序)来看,计算字段的数据与其
他列的数据的返回方式相同。
SELECT user_name +'('+user_sex+')' FROM user;
取出格式为 zhou(man) 类似的数据
'+'号拼接类似于 JS中的拼接字符串操作
RTRIM()(正如刚才所见,它去掉字符串右边的空格)、
LTRIM()(去掉字符串左边的空格)以及
TRIM()(去掉字符串左右两边的空格)。
SELECT TRIM(user_money) FROM user;
取出去掉两遍空格的user_money
12.使用别名 SELECT从数据库取出值以后,这个列没有名字,只是一个值
SQL支持列别名。别名(alias)是一个字段或值的替换名。别名用AS关键字赋予。
SELECT Coder AS PHPer FROM user;
从user表中取出Coder,并且重新命名为PHPer,其中的AS是可以省略的,但是最好写上
SELECT Coder PHPer FROM user;
别名还有其他用途。常见的用途包括在实际的表列名包含不合法的字符(如空格)时重新命名它,在原来的名字含混或容易误解时扩充它。
别名既可以是一个单词也可以是一个字符串。如果是后者,字符串应该括在引号中。虽然这种做法是合法的,但不建议这么去做。多单词的名字可读性高,不过会给客户端应用带来各种问题。因此,别名最常见的使用是将多个单词的列名重命名为一个单词的名字。
13. SELECT pid,num,price,
num*price AS total
FROM goods
WHERE pid = 2;
操 作 符 说 明
+ 加
- 减
* 乘
/ 除
圆括号可用来区分优先顺序
SELECT语句为测试、检验函数和计算提供了很好的方法。虽然SELECT通常用于从表中检索数据,但是省略了FROM子句后就是简单地访问和处理表达式,例如SELECT 3 * 2;将返回6,SELECT Trim(' abc ');将返回abc,SELECT Now();使用Now()函数返回当前日期和时间。
函 数 说 明
LEFT() (或使用子字符串函数) 返回字符串左边的字符
LENGTH() (也使用DATALENGTH()或LEN()) 返回字符串的长度
LOWER() (Access使用LCASE()) 将字符串转换为小写
LTRIM() 去掉字符串左边的空格
RIGHT() (或使用子字符串函数) 返回字符串右边的字符
RTRIM() 去掉字符串右边的空格
UPPER() (Access使用UCASE()) 将字符串转换为大写
14.MySQL里的日期函数说明
获得当前日期+时间(date + time)函数:now()
a.select now(); //获取当前日期 2016-09-06 11:37:50
b.获得当前时间戳函数:current_timestamp, current_timestamp()
SELECT current_timestamp, current_timestamp()//2016-09-06 11:38:10 2016-09-06 11:38:10
c.(日期/时间转换为字符串)函数:date_format(date,format), time_format(time,format)
select date_format('2016-09-06 11:37:50', '%Y-%m-%d'); //2016-09-06
15.5个聚集函数
函 数 说 明
AVG() 返回某列的平均值
COUNT() 返回某列的行数
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和
AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个AVG()函数。
使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。
使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。
MAX()返回指定列中的最大值。MAX()要求指定列名,忽略列值为NULL的行。
MIN()返回指定列中的最小值。MIN()要求指定列名,忽略列值为NULL的行。
SUM()用来返回指定列值的和(总计),忽略列值为NULL的行。
DISTINCT不能用于COUNT(*)
在指定别名以包含某个聚集函数的结果时,不应该使用表中实际的列名。虽然这样做也算合法,但许多SQL实现不支持,可能会产生模糊的错误消息。
SELECT id,pid,avg(price) as avg_price FROM goods GROUP BY pid;
根据pid对商品进行分组,筛选出 id,pid,avg_price
先分组再筛选
GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
参考网址:http://blog.csdn.net/xxpyeippx/article/details/8059910
16.HAVING非常类似于WHERE。事实上,目前为止所学过的所有类
型的WHERE子句都可以用HAVING来替代。唯一的差别是,WHERE过滤行,而HAVING过滤分组。
SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2; //过滤出分组以后,记录条数大于2的记录
说明:HAVING和WHERE的差别
这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组
中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2;
一般在使用GROUP BY子句时,应该也给出ORDER BY子句。这是保证数据正确排序的唯一方法。千万不要仅依赖GROUP BY排序数据。
17.解联结不是物理实体。换句话说,它在实际的数据库表中并不存在。DBMS会根据需要建立联结,它在查询执行期间一直存在。
创建联结非常简单,指定要联结的所有表以及关联它们的方式即可。
SELECT id,pid, FROM goods WHERE user.pid = product.pid;
在引用的列可能出现歧义时,必须使用完全限定列名(用一个句点分隔表名和列名)。如果引用一个没有用表名限制的具有歧义的列名,大多数DBMS会返回错误。
要保证所有联结都有WHERE子句,否则DBMS将返回比想要的数据多得多的数据。同理,要保证
WHERE子句的正确性。不正确的过滤条件会导致DBMS返回不正确的数据。
18.SQL不限制一条SELECT语句中可以联结的表的数目。创建联结的基本规则也相同。首先列出所有表,然后定义表之间的关系。
SELECT prod_name, vend_name, prod_price, quantity
FROM OrderItems, Products, Vendors
WHERE Products.vend_id = Vendors.vend_id
AND OrderItems.prod_id = Products.prod_id
AND order_num = 20007;
DBMS在运行时关联指定的每个表,以处理联结。这种处理可能非常耗费资源,因此应该注意,不要联结不必要的表。联结的表越多,性能
下降越厉害。
/*不推荐
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'));
*/
//推荐
SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num
AND prod_id = 'RGAN01';
19.SQL除了可以对列名和计算字段使用别名,还允许给表名起别名。
这样做有两个主要理由:
缩短SQL语句;
允许在一条SELECT语句中多次使用相同的表。
SELECT cust_name, cust_contact
FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';
别名不仅能用于WHERE子句,还可以用于SELECT的列表、ORDER BY子句以及其他语句部分。
20.联结:处理联结远比处理子查询快得多。
参考网址:http://www.cnblogs.com/Ewin/archive/2009/10/05/1578322.html
1.内联结 只连接匹配的行
内连接:利用内连接可获取两表的公共部分的记录,(默认联结方式)
SELECT A.Aid AS ID,A.AName,B.BName FROM A JOIN B ON A.Aid =B.Bid;
等价于
SELECT A.Aid AS ID,A.AName,B.BName FROM A,B WHERE A.Aid =B.Bid;
2.自联结
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM Customers AS c1, Customers AS c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';
3.自然联结
4.外联结
外连接分为两种,一种是左连接(Left JOIN)和右连接(Right JOIN)全外联结
a.左连接
SELECT A.Aid AS ID,A.AName,B.BName FROM A LEFT JOIN B ON A.Aid =B.Bid;
包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
b. SELECT * FROM A RIGHT JOIN B ON A.Aid =B.Bid;
以B为标准
右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
c.全外连接: 返回笛卡尔积
select * from A full join B
包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
21.组合查询
主要有两种情况需要使用组合查询:
在一个查询中从不同的表返回结构数据;
对一个表执行多个查询,按一个查询返回数据。
利用UNION,可给出多条SELECT语句,将它们的结果组合成一个结果集。
Union因为要进行重复值扫描,所以效率低。如果合并没有刻意要删除重复行,那么就使用Union All
两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致);
SELECT A.Aid AS ID FROM A
UNION
SELECT B.Bid AS NAME FROM B
SELECT A.Aid AS ID FROM A
UNION ALL
SELECT B.Bid AS NAME FROM B
union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。
22. INSERT用来将行插入(或添加)到数据库表。插入有几种方式:
插入完整的行;
INSERT INTO A VALUES (column1,column2,column3……); //必须是A表中完整列
//但是编写依赖于特定列次序的SQL语句是很不安全的,这样做迟早会出问题。
最好是一一对应
INSERT INTO A(C1,C2,C3……) VALUES (column1,column2,column3……);
//就算结构改变了,也没有关系
插入行的一部分;
INSERT INTO A(id) VALUES (idValue); //部分指定列
省略的列必须满足以下某个条件。
该列定义为允许NULL值(无值或空值)。
在表定义中给出默认值。这表示如果不给出值,将使用默认值。
如果对表中不允许NULL值且没有默认值的列不给出值,DBMS将产生错误消息,并且相应的行插入不成功。
插入某些查询的结果。
INSERT INTO B(Bid,BName)
SELECT Aid,Aname FROM A WHERE Aid=8 //注意这里是没有VALUES的
//对应的表结构是要一致的,而且主键不允许重复
SELECT语句从A检索出要插入的值,而不是列出它们。
23.SELECT INTO将数据复制到一个新表
SELECT INTO FROM语句
语句形式为:SELECT vale1, value2 into Table2 from Table1
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中
24. 更新(修改)表中的数据,可以使用UPDATE语句。有两种使用UPDATE的方式:
更新表中的特定行;
更新表中的所有行。
不要省略WHERE子句,在使用UPDATE时一定要细心。因为稍不注意,就会更新表中的所有行。
基本的UPDATE语句由三部分组成,分别是:
要更新的表;
列名和它们的新值;
确定要更新哪些行的过滤条件。
update A SET AName='zhouqi',Awork='PHP' WHERE Aid=8;
在UPDATE语句中使用子查询
UPDATE语句中可以使用子查询,使得能用SELECT语句检索出的数据更新列数据。
UPDATE tableA SET columnA=tableB.columnB FROM
(SELECT columnB FROM tableB WHERE ...)
WHERE ...
应该使用inner join,即:
UPDATE friends INNER JOIN users ON friends.friendid=users.userid
SET friends.friendname=users.username
25.在使用DELETE时一定要细心。因为稍不注意,就会错误地删除表中所有行。一定要有WHERE语句
DELETE FROM A WHERE id = 2;
如果省略WHERE 则删除A表中的所有数据,并且效率没有truncate好
truncate清空表数据,但是不清除表结构
26.利用CREATE TABLE创建表,必须给出下列信息:
新表的名字,在关键字CREATE TABLE之后给出;
表列的名字和定义,用逗号分隔;
CREATE TABLE ONE(
#表定义内容
);
27. 每个表列要么是NULL列,要么是NOT NULL列,这种状态在创建时由表的定义规定。
主键是其值唯一标识表中每一行的列。只有不允许NULL值的列可作为主键,允许NULL值的列不能作为唯一标识。
警告:理解NULL
不要把NULL值与空字符串相混淆。NULL值是没有值,不是空字符串。如果指定''(两个单引号,其间没有字符),这在NOT NULL列中是允许
的。空字符串是一个有效的值,它不是无值。NULL值用关键字NULL而不是空字符串指定。
默认值在CREATE TABLE语句的列定义中用关键字DEFAULT指定。
链接:http://www.cnblogs.com/aspnethot/articles/1397130.html
1:删除列
ALTER TABLE 【表名字】 DROP 【列名称】
2:增加列
ALTER TABLE 【表名字】 ADD 【列名称】 INT NOT NULL COMMENT '注释说明'
3:修改列的类型信息
ALTER TABLE 【表名字】 CHANGE 【列名称】【新列名称(这里可以用和原来列同名即可)】 BIGINT NOT NULL COMMENT '注释说明'
4:重命名列
ALTER TABLE 【表名字】 CHANGE 【列名称】【新列名称】 BIGINT NOT NULL COMMENT '注释说明'
5:重命名表
ALTER TABLE 【表名字】 RENAME 【表新名字】
6:删除表中主键
Alter TABLE 【表名字】 drop primary key
7:添加主键
ALTER TABLE tablename ADD CONSTRAINT PK_SJ_RESOURCE_CHARGES PRIMARY KEY (resid)
8:添加索引
ALTER TABLE sj_resource_charges add index INDEX_NAME (name);
9: 添加唯一限制条件索引
ALTER TABLE sj_resource_charges add unique emp_name2(cardnumber);
10: 删除索引
alter table tablename drop index emp_name;
28.删除表(删除整个表而不是其内容)使用DROP TABLE tablename;