SQL常用语句

来源:互联网 发布:网络版权保护 编辑:程序博客网 时间:2024/06/07 01:36

部分内容转载自
http://www.cnblogs.com/simplefrog/archive/2012/07/30/2615169.html
http://blog.sina.com.cn/s/blog_4acbd39c0100qpsb.html
参考书籍:MySQL必知必会。

1. SHOW

SHOW DATABASES;
返回可用数据库的一个列表
SHOW TABLES;
返回当前可用数据库内可用的列表


2. DESC

SHOW COLUMNS FROM table_name;显示表结构DESCRIBE table_name;显示表结构DESC table_name;显示表结构

3. SELECT

SELECT column_name FROM table_name;从表中检索列SELECT column_name FROM table_name LIMIT 2;从表中检索列的前两行。SELECT column_name FROM table_name LIMIT 1,2;显示从表中检索到的列的2-3行。

4. DISTINCT

SELECT DISTINCT column_name FROM table_name;从表中检索内容不同的列。SELECT DISTINCT column_name FROM table_name LIMIT 2;

5. 使用完全限定的表名

SELECT table_name.column_name FROM table_name;

6. 排序

SELECT column_name FROM table_name ORDER BY column_name;排序的列可以与检索的列不同。SELECT column_name1,column_name2 FROM table_name ORDER BY column_name;检索两个列。SELECT column_name1,column_name2 FROM table_name ORDER BY column_name_3,column_name4;将检索到的列先按列1排序,再按列2排序。

7. 排序

SELECT column_name1,column_name2 FROM table_name ORDER BY column_name(column_name1,2,3) DESC;
注:
  • DESC关键字只应用到直接位于其前面的排名,即只对列1降序,对其他列仍是升序排列。
  • 在多个列上降序排列,需要对每个列都指定DESC关键字。

  • ASC升序关键字


  • 使用 ORDER BY , 和LIMIT组合可以找出一个列中的最高或最低值.
  • ORDER BY 要位于FROM后,LIMIT要位于ORDER BY后。

8. 过滤数据 WHERE

  • WHERE 子句在表名(FROM table_name)之后给出。
SELECT column_name FROM table_name **WHERE**column_name=value;从表中检索值为1的所有行,显示这些行中的column_name列。
  • ORDER BY应位于WHERE字句之后。

WHERE子句操作符

操作符 说明 = 等于 <> 不等于 != 不等于 < 小于 <= 小于等于 > 大于 >= 大于等于 BETWEEN 在指定的两个值之间



检查单个值

SELECT column_name1 FROM table_name WHERE column_name=value;SELECT column_name1 FROM table_name WHERE column_name<=value;

不匹配检查

SELECT column_name FROM table_name WHERE column_name<>value;SELECT column_name FROM table_name WHERE column_name!=value;

BETWEEN

SELECT column_name FROM table_name BETWEEN value1 AND value2;

空值检查

SELECT column_name FROM table_name WHERE column_name IS NULL;

9. 组合WHERE子句

AND(可以添加多个过滤条件,每添加一条就要使用一个AND)

SELECT column_name1,column_name2 FROM table_name WHERE column_name1=value1 AND column_name2<>value2;

OR(条件中满足任一一个就可以)

SELECT column_name1,column_name2 FROM table_name WHERE column_name1=value1 OR column_name2<>value2;

计算次序
SQL在处理OR操作符之前,优先处理AND操作符。

SELECT column_name FROM table_name WHERE (column_name1=value1 OR column_name2=value2) AND column_name3=value3;

IN

SELECT column_name1,column_name2 FROM table_name WHERE column_name IN(value1,value2,value3) ORDER BY column_name;

NOT(MySQL中的NOT,支持对IN,BETWEEN和EXISTS子句取反。)

SELECT column_name FROM table_name WHERE column_name NOT IN(value1,value2,value3);

10. 用通配符进行过滤

LIKE指示MySQL后跟的搜索模式,利用通配符等匹配,而不是直接相等的匹配。

  • % 百分号

(%代表搜索模式中给定位置有0个1个或多个字符。LIKE ‘%’不匹配null)

SELECT column_name FROM table_name WHERE column_name LIKE '%jet';匹配jet结尾的词。
  • _ 下划线(下划线只匹配单个字符而不是多个字符)
SELECT column_name FROM table_name WHERE column_name LIKE '_jet';匹配jet结尾的词。

11. 使用别名

SELECT Concat(RTRIM(column_name1),’(‘,RTRIM(column_name2),’)’) AS column_name3 FROM table_name WHERE column_name4 = value ORDER BY column_name;

12. MySQL算术操作符

操作符 说明 + 加 - 减 * 乘 / 除

13. 数据处理函数

SELECT column_name,Upper(column_name) AS column_name1 FROM table_name;

常用的文本处理函数

函数 说明 Left() 返回串左边的字符 Length() 返回串的长度 Locate() 找出串的一个子串 Lower() 将串转换为小写 LTrim() 去掉串左边的空格 RTrim() 去掉串右边的空格 Right() 返回串右边的字符 Soundex() 返回串的Soundex值 SubString() 返回子串的字符 Upper() 将串转换为大写
SELECT column_name FROM table_name WHERE Soundex(column_name)=Soundex("values");

14. 常用日期和时间处理函数

函数 说明 AddData() 增加一个日期函数 AddTime() 增加一个时间 CurDate() 返回当前日期 CurTime() 返回当前时间 Date() 返回日期时间的时期部分 DateDiff() 返回两个日期只差 DateFormat() 返回一个格式化的日期或时间 Day() 返回一个日期的天数部分 DayOfWeek() 返回一个日期对应的是星期几 Hour() 返回一个日期的小时部分 Minute() 返回一个日期的分钟部分 Month() 返回一个日期的月份 Second() 返回一个日期的秒数 Year() 返回一个日期的年份
Select column_name1,column_name2 FROM table_name WHERE Data(column_date) BETWEEN value1 AND value2;SELECT column_name FROM table_name WHERE Year(column_name)=2005 AND Month(column_name)=9;

15. 数值处理函数

函数 说明 Abs() 绝对值 Cos() 余弦 Exp() 指数 Mod() 取余 pi() 返回圆周率 Rand() 返回随机数 Sin() 正弦 Squre() 返回平方根 Tan() 正切

16. 汇总数据

聚集函数,运行在行组上。计算和返回单个值的函数。
SQL聚集函数

函数 说明 AVG() 返回某个列的平均值 COUNT() 返回某个列的行数 MAX() 返回某个列的最大值 MIN() 返回否列的最小值 SUM() 返回某列值之和

* AVG()只能用于单列,只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出,为了获得多个列的平均值,必须使用多个AVG()函数。
* AVG()函数忽略列值为NULL的列。
* COUNT()函数进行计数,可利用COUNT()函数.
* 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是否是空值(NULL)还是非空值。
* 使用COUNT(column_name)对特定列具有值的行进行计数,忽略NULL值。

SELECT COUNT(column_name) AS column_name2 FROM table_name;只对列中有值的行进行计数。
SELECT SUN(column1*column2) AS column3 WHERE column4=value;返回指定行列1*列2的和。
SELECT AVG(DISTINCT column_name) AS column_name2 WHERE column_name3=value;聚集不同值

16. 分组数据

GROUP BY 和 HAVING
数据分组:分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。
分组在SELECT语句和GROUP BY语句中建立。

(1)创建分组

SELECT column_name,COUNT(*) AS new_cloumn FROM table_name GROUP BY column_name;
(2)过滤分组
SELECT column_name,COUNT(*) AS new_cloumn FROM table_name GROUP BY column_name HAVING COUNT(*)>=value;SELECT column_name,COUNT(*) AS new_cloumn FROM table_name WHEREGROUP BY column_name HAVING COUNT(*)>=value;

(3)ORDER BY 与 GROUP BY

ORDER BY GROUP BY 排序产生的输出 分组行,但输出可能不是分组的顺序 任意列都可以使用,甚至是非选择的列也可以使用 只能使用选择的列或表达式列,而且必须使用每个选择列表达式 一般使用GROUP BY子句时,会给出ORDER BY子句

17. SELECT 语句中子句的顺序

子句 说明 是否必须使用 SELECT 要返回的列或表达式 是 FROM 从中检索数据的表 仅在从表中选择数据时使用 WHERE 行级过滤 否 GROUP BY 分组说明 仅在按组计算聚集时使用 HAVING 组级过滤 否 ORDER BY 输出排序顺序 否 LIMIT 要检索的行数 否

18. 子查询

SELETE column_name FROM table_name WHERE column_name IN(SELETE column_name1 FROM table_name1 WHERE column_name=value );

19. 联结表join

  • 主键:一列(或一组列)其值能唯一区分表中每个行。
  • 外键:某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
SELECT column1,column2,column3 FROM table1,table2 WHERE table1.column1=table2.column2 ORDER BY column1,column2;

内部联结

SELETE column1,column2,column3 FROM table INNER JOIN ON table1.column1=table2=column2;

联结多个表时可以使用AND;

20. 插入数据

(1)INSERT

INSERT INTO table values(...value1,2,3),(...),(...);
  • 如果不提供列名,则对每个列提供值,如果列没有值,则为NULL.
  • 如果提供列名,则对每个列给出一个值。
  • 使用INSERT LOW_PRIORITY 降低优先级。

(2)插入多行数据

INSERT INTO table(column1,2,3..) VALUES(value1,2,3..),(1,2,3..);

21. 更新和删除数据

UPDATE table SET column=value WHERE column=value2;UPDATE table SET column=value,column1=value1 WHERE column3=value3;
  • UPDATE IGNORE table…忽略错误;

22. 删除数据

DELETE FROM table WHERE column=value;
DELETE 与TRUNCATE的区别

DELETE TRUNCATE DELETE FROM table_name TRUNCATE TABLE table_name

区别

  • 1.delete from后面可以写条件,truncate不可以。
  • 2.delete from记录是一条条删的,所删除的每行记录都会进日志,而truncate一次性删掉整个页,因此日至里面只记录页释放,简言之,delete from更新日志,truncate基本不,所用的事务日志空间较少。
  • 3.delete from删空表后,会保留一个空的页,truncate在表中不会留有任何页。
  • 4.当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。truncate始终锁定表和页,而不是锁定各行。
  • 5.如果有identity产生的自增id列,delete from后仍然从上次的数开始增加,即种子不变,而truncate后,种子会恢复初始。
  • 6.truncate不会触发delete的触发器,因为truncate操作不记录各个行删除。

总结

  • 1.truncate和 delete只删除数据不删除表的结构(定义)
    drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态。
  • 2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发
    truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger。
  • 3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动
    显然drop语句将表所占用的空间全部释放
    truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始)。
  • 4.速度,一般来说: drop> truncate > delete。
  • 5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及。
  • 6.使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大. 想删除表,当然用drop
    想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete
    如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。

23. 全文本搜索

(1)使用全文本搜索

为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断的重新索引,在索引后,SELETE 可与Match()和Against()一起使用已实际执行的索引。

(2)进行全文本搜索

SELETE column FROM table WHERE Match(column) Against('value');

(3)查询扩展

SELETE column FROM table WHERE Match(column) Against('value' WITH QUERY EXPANSION);

24. 布尔文本搜索

SELETE column FROM table WHERE Match(column) Against('value -abcde'  IN BOOLEAN MODE);

全文本布尔操作符

布尔操作符 说明 + 包含,词必须存在 - 排除。词必须不出现 > 包含,而且增加等级值 < 包含,而且减少等级值 () 括号用来将单词分成子表达式。括入括号的部分可以被嵌套。 ~ 取消一个词的排序值 * 词尾的通配符 “” 非单词字符不需要严密的匹配:短语搜索只要求符合搜索短语包含的单词且单词的排列顺序相同的内容。例如,”test phrase” 符合 “test, phrase”

创建和操纵表

http://blog.sina.com.cn/s/blog_4acbd39c0100qpsb.html

原创粉丝点击