MYSQL基础知识总结

!注释方式

#    --    单行

/*     */  多行

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 = 1pid =>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;

任何时候使用具有ANDOR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希望的那样。使用圆括号没有什么坏处,它能消除歧义。

8.IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号中的合法值。

SELECT  column1 FROM tablename WHERE id in ('1','2','3');

选取id1 或者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%';

所有usernameA开头的用户

SELECT  column1 FROM tablename WHERE username='%A%';

所有username包含字母A的用户

SELECT  column1 FROM tablename WHERE username='A%s';

所有usernameA开头B结尾的用户

通配符%看起来像是可以匹配任何东西,但有个例外,这就是NULL

WHERE username LIKE '%'不会匹配用户名称为NULL的行。

通配符是下划线 _ 下划线的用途与%一样,但它只匹配单个字符,而不是多个字符。

SELECT  column1 FROM tablename WHERE username='A_s';

所有usernameA开头s结尾的,并且只能是三个字母  比如:ABs   Abs

10.方括号[]通配符

类似于正则表达式的[],它必须匹配指定位置的一个指定字符范围。

SELECT  column1 FROM tablename WHERE username='[ABC]%';

所有usernameA开头或者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;将返回6SELECT Trim(' abc ');将返回abcSELECT 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的记录

说明:HAVINGWHERE的差别

这里有另一种理解方法,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

  unionunion 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;

原文地址:https://www.cnblogs.com/zhouqi666/p/5870760.html