zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    leetcode Convert Sorted List to Binary Search Tree
    leetcode Convert Sorted Array to Binary Search Tree
    leetcode Binary Tree Level Order Traversal II
    leetcode Construct Binary Tree from Preorder and Inorder Traversal
    leetcode[105] Construct Binary Tree from Inorder and Postorder Traversal
    证明中序遍历O(n)
    leetcode Maximum Depth of Binary Tree
    限制 button 在 3 秒内不可重复点击
    HTML 和 CSS 画三角形和画多边行基本原理及实践
    在线前端 JS 或 HTML 或 CSS 编写 Demo 处 JSbin 与 jsFiddle 比较
  • 原文地址:https://www.cnblogs.com/zhouqi666/p/5870760.html
Copyright © 2011-2022 走看看