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

  • 相关阅读:
    angular11源码探索十四[表单校验器]
    2020年终总结
    vue使用腾讯地图获取当前位置
    腾讯地图+element-ui 实现地址搜索标记功能
    腾讯地图SDK公交路线规划Demo2
    腾讯地图SDK公交路线规划Demo
    腾讯位置服务地图SDK自定义路况和字体
    腾讯地图SDK自定义地图和路况
    3D地图的定时高亮和点击事件
    vue+腾讯地图 实现坐标拾取器功能
  • 原文地址:https://www.cnblogs.com/zhouqi666/p/5870760.html
Copyright © 2020-2023  润新知