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:删除表、数据库

*删除数据库/表mysql

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表sql

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:code

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语句的执行顺序

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

相关文章
相关标签/搜索