zoukankan      html  css  js  c++  java
  • MySQL数据库学习

    MySQL数据库学习

    SQL分类

    1. DDL:Date Define Language 数据定义语言
      • 操作对象:数据库和表
      • 关键词:CREATE/ALTER/DROP/TRUNCATE
      • 特性:
        1. sql语句中都会有TABLE
          例如:CREATE TABLE TABLE_NAME XXX…… DROP TABLE TABLE_NAME...
        2. 操作的对象是数据库和表
        3. TRUNCATE和DROP和DELETE的区别
          • 当你不再需要该表时,用DROP
          • 当你仍要保留该表,但要删除所有记录时,用TRUNCATE(会重置一些自增的数据)
          • 当你要删除部分记录时(always with a WHERE clause),用DELETE.
    2. DML:Data Manager Language 数据操作语言
      • 操作对象:记录(行)
      • 关键词:INSERT/UPDATE/DELETE
      • 特性:
        1. sql语句中没有TABLE
          例如: INSERT INTO USER(列1,列2……) VALUES(value1,value2……)
    3. DCL:Data Controll Language 数据控制语言
      • 操作对象:用户/事务/权限
      • 一般由数据库工程师来管理操作,开发人员使用的频率不大
    4. DQL:Data Query Language 数据查询语言(非官方)

    总结:只有是涉及到对数据库和表结构的操作,才会加上TABLE,对记录(行)的操作不需要添加TABLE

    SQL分类的实例

    DDL:数据定义语言

    CREATE:创建数据库、表……

       CREATE TABLE USER(
           id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT "编号",
           password VARCHAR(256) NOT NULL COMMENT '密码',
           nickName VARCHAR(32) NOT NULL COMMENT '昵称',
           bio VARCHAR(256) COMMENT '简介' 
           PRIAMRY KEY(id)
       )
    

    ALTER:修改表、字段……

    • 修改表名(rename)
        ALTER TABEL 原表名  RENAME 新表名
    
    • 添加新的列 (add)
        ATTER TABLE table_name ADD cloumn_name datatype
        例如:
            ALTER TABLE USER ADD sid VARCHAR(128) NOT NULL COMMENT 'Cookie'
    
    • 删除列、删除索引(drop)
        ALTER TABLE table_name DROP COLUNM column_name
        ALTER TABLE table_name DROP INDEX index_name
        例如:
            ALTER TABLE USER DROP COLUMN sid1
    
    • 修改已经存在的列的属性(modify)
        ALTER TABLE table_name ALTER COLUMN column_name datatype
        例如:
            ALTER TABLE USER MODIFY COLUMN bio int COMMENT '简介'
    
    • 修改已经存在的列的列名(change)
        ALTER TABLE table_name CHANGE COLUMN column_name new_column_name datatype
        例如:
            ALTER TABLE USER CHANGE COLUMN id id1 INT UNSIGNED NOT NULL COMMENT '编号' 
    

    DROP:删除表、数据库

    *删除数据库/表

        DROP DATABASE 数据库名
        DROP TABLE 表名
    
    TRUNCATE/DROP/DELTE的区别
    • 当你不再需要该表时,用DROP
    • 当你仍要保留该表,但要删除所有记录时,用TRUNCATE(会重置一些自增的数据)
    • 当你要删除部分记录时(always with a WHERE clause),用DELETE.
        TRUNCATE TABLE 表名
        DROP TABLE 表名
        DELETE FROM 表名 WHERE……
    

    DML:数据操作语言INSERT/UPDATE/DELETE

    INSERT:插入数据

    • 方式1:属性与插入的值完全对齐
        INSERT INTO 表名 VALUES(value1,value2,value3……)
        例如:
            INSERT INTO USER VALUES('KyLin','123456')
    
    • 方式2:指定插入的列
        INSERT INTO 表名(列1,列2……) VALUES(值1,值2……)
        INSERT INTO User(id,nickName,password,email,votes) VALUES(1,'KyLin','123456','1803660046@qq.com',1)
    

    UPDATE:修改表中的数据

    • 修改表中数据
        UPDATE 表名 SET 列名1=新值1,列名2=新值2…… WHERE 条件
        例如:
            UPDATE USER SET nickName='overload',sid='you guess guess' WHERE id=1
    

    DELETE:删除表中的记录(行)

    • 按条件删除
        DELETE FROM 表 WHERE 条件
        例如:
            DELETE FROM USER WHERE id=1
    
    • 删除所有
        DELETE FROM USER
    

    DQL:数据查询语言(非官方叫法)

    SELECT

    • DISTINCT --去除重复值
        SLECT DISTINCT 列名 FROM 表
    
    • WHERE ---条件
        SELECT 列名 FROM 表 WHERE 列 运算符 值(条件)
        运算符
            = != > >= < <= BETWEEN(在某个范围内) LIKE(某种搜索方式) 
        例如:
            SELECT id FROM USER WHERE nickName='overload'
    
    • AND和OR ---用于基于一个以上的条件对记录进行过滤筛选
      • AND 连接多个条件---需要同时满足
      • OR 连接多个条件----满足其中之一即可
        AND和OR同时使用:
            选出姓为'Thomas'或者为'William'并且名为'Carter'的人的信息
        SELECT * FROM Persons WHERE (FirstName='Thomas' or FirstName=='William') AND LastName='Carter'
        小建议:尽可能的减少or的使用(用in代替),因为使用了or,效率呈指数型下降
    
    • ORDER BY ---对结果集进行排序
      • 默认ASC(升序),降序为DESC
        可以对多个列进行不同的排序,满足的条件是从左往右依次选择
        例如:
            SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC,OrderNumber ASC
        结果:
            先对所有的结果集按照Company降序排序,如果有相同的Company结果,则按照OrderNumber升序排序
    

    MYSQL高级查询

    LIMIT N,M---选取从第N开始的M条记录(下标从0开始)——可以延伸成为查找前n条记录

    • LIMIT 5 --选取最前面的5条记录
    • LIMIT 1,5 --从第1条开始(下标从0开始),选取5条记录
        SELECT * FROM book_borrow_history LIMIT 0,5
    

    LIKE--模糊查询

    • 选取姓广的童鞋 nickName LIKE '广%'
    • 选取名字中含有奇的童鞋 nickName LIKE '%奇%'
    • 选取名字以林结尾的童鞋 nickName LIKT '%林'
    • 选取不包含……则当作是包含,然后加个not即可 NOT LIKE
        SELECT * FROM USER WHERE nickName LIKE '广%'
    

    通配符

    通配符 描述
    % 代替一个或者多个字符
    _ 仅代替一个字符
    [charlist] 字符列中的任何单一字符
    [^charlist]或者[!charlist] 不在字符列中的任何单一字符
    • _通配符
        "Persons" 表中选取名字的第一个字符之后是 "eorge" 的人:
         SELECT * FROM Persons WHERE FirstName LIKE '_eorge'
    
    • [charlist]字符列中的任何单一字符
        选取居住的城市以 "A" 或 "L" 或 "N" 开头的人:
        SELECT * FROM Persons WHERE City LIKE '[ALN]%'
    
    • [!charlist]不在字符列中的任何单一字符
        选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人:
        SELECT * FROM Persons WHERE City LIKE '[!ALN]%'
    

    IN——允许我们在WHRER子句中规定多个值

    • 语法
        SELECT * FROM TABLE WHERE COLUMN_NAME IN (value1,value2……)
        例如: 选取姓氏为 Adams 和 Carter 的人
        SELECT *FROM Persons WHERE FirstName IN('Adams','Carter')
        则只要是满足这个条件(相当于OR)的都会显示出来
    

    BETWEEN……AND 选取介于两个值之间的记录(值可以为:数值、文本、日期)

    • 语法
        SELECT * FROM TABLE WHERE COLUNM_NAME BETWEEN VALUE1 AND VALUE2
        注意:mysql的是[value1,value2) 是这样一种范围
        如果想表示不在这个范围内,则加上NOT即可
    
    • 实例
        当BETWEEN……AND的值是文本的时候,则表明选取的是表中在这个范围之间的记录
        例如:
        SELECT * FROM Persons WHERE lastName BETWEEN 'Adams' ADN 'Carter'
        则选取出来的结果就是 Adams和Bush这两条的记录
    

    Persons表

    lastName firstName
    Adams John
    Bush George
    Carter Thomas
    Gates Bill

    AS---字段/表取别名(MySQL中)

    • 实例
        SELECT b.book_name AS BOOKNAME,b.stu_id AS ID FROM book_borrow_history AS b WHERE b.stu_id='1506200043'
    

    MySQL高级查询之多表查询

    join:根据两个或多个表中的列之间的关系,从这些表中查询数据

    • 这里的列一般指明的是:主键以及外键
    • 类型
      1. (INNER) JOIN: 如果表中有至少一个匹配,则返回行
      2. LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
      3. RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
      4. FULL JOIN: 只要其中一个表中存在匹配,就返回行
    INNER JOIN (内连接)
    • 说明:在表中存在至少一个匹配时,INNER JOIN 关键字返回行,如果两个表之间没有匹配上则不会返回东西——————即必须两个表都有的,才会显示
    • 语法:
        SELECT CLOUMN_NAME(S) FROM TABLE_NAME1 INNER JOIN TABLE_NAME2 ON TABLE_NAME1.COLUMN=TABLE_NAME2.COLUMN
        关键字:INNER JOIN……ON 条件
    
    • 例子:
        查询用户的订单,没有用户的订单不显示
        SELECT user.name,orders.* FROM user INNER JOIN orders ON user.id=orders.user_id
    
    LEFT JOIN (也写作 LEFT OUTER JOIN 左外连接)
    • 说明:会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行——————即左边的所有行一定会显示
    • 语法:
        SELECT COLUMN_NAME(S) FROM TABLE_NAME1 LEFT JOIN TABLE_NAME2 ON TABLE_NAME1.COLUMN=TABLE_NAME2.COLUMN ORDER BY COLUMN_NAME DESC(ASC)
        关键字:LEFT JOIN……ON 条件
    
    • 例子:
        查询所有用户的订单详情——即是以用户为主体,所有的用户都要显示
        SELECT user.name,orders.* FROM user LEFT JOIN orders ON user.id=orders.user_id
    
    RIGHT JOIN (RIGHT OUTER JOIN 右外连接)
    • 说明:会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行————即右边的行一定会显示
    • 语法:
        SELECT COLUMN_NAME(S) FROM TABLE_NAME1 RIGHT JOIN TABLE_NAME2 ON TABLE_NAME1.COLUMN=TABLE_NAME2.COLUMN
    
    FULL JOIN ( FULL OUTER JOIN 全连接 )
    • 说明:合并了左外/右外连接,即即使左边不匹配也会显示,同理右边不匹配也同样会显示,没有的值就为空
    • 语法:
        SELECT COLUMN_NAME(S) FROM TABLE_NAME1 FULL JOIN TABLE_NAME2 ON TABLE_NAME1.COLUMN=TABLE_NAME2.COLUMN
    

    MySQL高级查询之子查询

    • 说明:一个查询的结果依赖于另外一个查询
    • 分类:
      1. 其中一个查询的结果返回一行一列(即一个确定的值)
      2. 其中一个查询的结果返回一行多列(即多个值)
      3. 其中一个查询的结果返回多行多列(相当于另外的一个表)
        一行一列(单个值):使用 =
    • 查看用户为张三的订单详情
      1. 在用户表中查找到用户名为'张三'的童鞋的id
      2. 在订单表中查找出id为'张三'的订单
        SELECT id FROM Users WHERE NAME='张三'
        SELECT * FROM Orders WHERE user_id='张三的id'
        整合:
            SELECT *FROM Orders WHERE user_id=(SELECT id FROM Users WHERE NAME='张三')
    

    一行多列(多个值):使用 IN

    • 查询出订单的价格大于300的用户的所有信息
      1. 在订单表中查询出订单价格大于300的记录的用户id——因为需要和其他表关联
      2. 在用户表中查询出用户信息
        SELECT user_id FROM Orders WHERE price>300
        SELECT *FROM Users WHERE id='从订单表获取到的user_id'
        整合:
            SELECT *FROM Users WHERE id in(SELECT user_id FROM Orders WHERE price>300)
    

    多行多列(相当于另外一个表)

    • 查询订单价格大于300的订单信息及相关用户的信息
      1. 先查询出订单价格大于300的订单信息---作为一张临时表
      2. 把临时表和用户表进行内连接即可
        SELECT Orders.* FROM Orders WHERE price>300
        整合在一起(基本写法)
        SELECT Temp.*,Users.* FROM Users,(SELECT Orders.* FROM Orders WHERE price>300) AS Temp WHERE Temp.user_id=Users.id 
        内连接写法:
        SELECT  Orders.*,Users.* from Orders INNER JOIN Users ON Users.id=Orders.user_id and orders.price>300;
    

    总结

    1. 子查询中返回的是一个确定的值————用‘=’
    2. 子查询返回的是多个值—————用IN
    3. 返回的是多行多列的话—————用内连接

    MySQL高级查询之其他

    • UNION
    • Constraints(约束)
      • NOT NULL ————不为空
      • UNIQUE ————唯一标识数据库表中的每条记录
      • PRIMARY KEY
      • FOREIGN KEY
      • CHECK
      • DEFAULT
    * INDEX(索引)
    * VIEW(视图)
    

    UNION

    • 说明:用于合并两个或多个 SELECT 语句的结果集。
    • 注意:UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
    • 语法:
        SELECT COLUMN_NAME(S) FROM TABLE_NAME1
        UNION
        SELECT COLUMN_NAME(S) FROM TABLE_NAME2
        默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
    

    Employees_China:

    E_ID E_NAME
    01 Zhang, Hua
    02 Wang, Wei
    03 Carter, Thomas
    04 Yang, Ming

    Employees_USA:

    E_ID E_NAME
    01 Adams, John
    02 Bush, George
    03 Carter, Thomas
    04 Gates, Bill

    则如果想获取两个表的所有雇员的话

        SELECT E_NAME FROM Employees_China
        UNION
        SELECT E_NAME FROM Employees_USA
        这样会对重复的名字进行任意的选取其中之一,若想显示全部的话UNION ALL
    

    Constraints部分

    1. UNIQUE和PRIMARY KEY的区别和联系:
      • 联系:
        • PRIMARY KEY自动获取UNIQUE约束,两者都代表唯一性约束
      • 区别:
        • 一个表中只能有一个PRIMARY KEY,但是可以有多个UNIQUE
    2. FOREIGN KEY:一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY
    3. CHECK约束用于限制列中的值的范围
      CREATE INDEX创建索引(重要)
    • 作用:不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据
    • 注意:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
    • 语法
        在表上创建一个简单的索引。允许使用重复的值:
        CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN_NAME)
        注释:"COLUMN_NAME" 规定需要索引的列。
        在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
        CREATE UNIQUE INDEX index_name ON table_name (column_name)
        例如:
            如果希望以降序索引某个列中的值,可以在列名称之后添加保留字 DESC:
            CREATE INDEX PersonIndex On Person(firstName DESC)
            如果希望索引不止一个列,可以在括号中列出这些列的名称,用逗号隔开:
            CREATE INDEX PersonIndex ON Person (lastName, firstName)
    

    VIEW视图

    SQL函数

    • AVG(COLUMN) 平均值
    • COUNT(COLUMN) 返回行数
    • FIRST(COLUMN) 返回该列的第一个值,可使用 ORDER BY 语句对记录进行排序
    • LAST(COLUMN) 该列的最后一个值
    • MAX(COLUMN) ....
    • MIN(COLUMN) ....
    • SUM(COLUMN) 返回该列的总数(总额)
    • UCASE(COLUMN) 把字段的值转换成大写
    • LCASE(COLUMN) 把字段的值转换成小写

    GROUP BY从句

    • 说明:GROUP BY语句用于结合聚合函数,根据一个或多个列对结果集进行分组;——聚合函数是对GROUP BY后的结果进行计算
    • 例子:
        希望查找每个客户的订单总额
        错误:
            SELECT Customer,SUM(OrderPrice) FROM Orders
        错误原因:首先SUM(OrderPrice)返回的是一个值,如果没有使用group by
        的话,那么就是计算的所有客户的订单的总额
        正确:
            SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
        正确原因:因为使用的GROUP BY,那么相同客户的订单(一个客户可以有多个订单)就会合并在一起,那么SUM()出来的就是每个客户自己的订单的总额
        扩展:
            也可以对多个列进行GROUP BY操作
            SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders GROUP BY Customer,OrderDate
    

    HAVING子句

    • 说明:HAVING和WHERE都是用来做条件判断,但是因为WHERE无法与聚合函数一起使用,因而出现了HAVING
    • 语法:
        SELECT column_name,aggregate_function(column_name),FROM table_name where column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) OPERATOR VALUE
    
    • 例子:
        找出订单总金额少于2000元的客户
        SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice)<2000
        希望查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额
        SELECT Customer,SUM(OrderPrice) FROM Orders WHERE Customer in("Bush","Adams") GROUP BY Customer HAVING SUM(OrderPrice)>1500
    

    SQL语句的执行顺序

    去找找题来写一写,然后再去弄弄索引

  • 相关阅读:
    python 安装第三方插件库报错的解决方案
    vue.js helloword
    node.js HelloWord
    十一 —— 迭代器、生成器、装饰器
    十、函数——匿名函数、推导式
    九、函数 —— 参数
    八、数据类型——bytes类型+set类型
    七、数据类型 —— 字典
    六、数据类型 —— 字符串
    五、数据类型 —— 元组
  • 原文地址:https://www.cnblogs.com/shan-kylin/p/9746666.html
Copyright © 2011-2022 走看看