当前位置 博文首页 > 文章内容

    MySQL基础知识和常用命令总结

    作者:1663631723 栏目:最新时讯 时间:2020-04-29 9:31:27

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



         说明:以下内容是阅读书籍<<MySQL必知必会>>的摘要和总结

    1. 检索数据

    2. 排序检索数据

    3. 过滤数据

    4. 使用通配符过滤

    5. 使用正则表达式进行搜索

    6. 创建计算字段

    7. 使用数据处理函数

    8. 汇总数据

    9. 分组数据

    10. 使用子查询

    11. 联结表

    12. 创建高级联结

    13. 组合查询

    14. 全文本搜索

    15. 插入数据

    16. 更新和删除数据

    17. 创建和操纵表

    18. 使用视图

    19. 使用存储过程

    20. 使用游标

    21. 使用触发器

    22. 管理事务处理

    23. 全球化和本地化

    24. 安全管理

    25. 数据库维护

    26. 改善性能.

    模式可以用来描述数据库中特定的表以及整个数据库,和其中表的关系
    行(row) 表中的一个记录

    必须先使用use命令打开数据库,才能读取其中的数据。

    Copymysql> show columns from user;//DESCRIBEhelp show;
    > select  distinct prod_id prod_name,prod_price from products;//返回不同的行!DISTINCT,限制返回结果。LIMITSELECT prod_name,FROM products LIMIT 3,3(start,rows)

    help 命令

    如果使用DISTINCT关键字,它必须直接放在所有列的前面,完全限定符:表名.列名
    子句(clause) SQL语句由子句构成,有些子句是必需的,而有的是可选的。

    不同行distinct,排序order by XXX DESC

    CopySELECT DISTINCT FOROM prod_name FROM products ORDER BY prod_name LIMIT 2,4;

    结构体排序。先,,然后。。指定多列,用逗号隔开,DESC关键字只应用到直接位于其前面的列名,多列降序排列,则每个列都需要指定DESC关键字。

    子句次序 SELECT xx FROM XXX WHERE xxxx ORDER BY xx DESC LIMIT 1

    单引号用来限定字符串。如果将值与串类型的列进行比较,则需要限定引号。用来与数值列进行比较的值不用引号。范围运算符between

    CopySELECT prod_name,prod_price FROM prodects WHERE prod_price BETWEEN 4 AND 5;SELECT prod_id ,prod_prices FROM produts WHERE  prod_id=1002 AND prod_price<=10;SELECT prod_id ,prod_prices FROM produts WHERE  prod_id NOT IN(1002,1004)AND prod_price<=10;SELECT prod_name FROM prodects WHERE prod_name LIKE jar%;SELECT prod_name FROM prodects WHERE prod_name LIKE j_r%;
    //WHERE prod_price is null

    MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用,AND在计算次序中优先级更高,使用括号改变优先级,OR的泛化-- -- IN
    IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句
    WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。

    为在搜索子句中使用通配符,必须使用LIKE操作符,%表示任何字符出现任意次数,下划线只匹配单个字符,通配符不要放在开始。正则表达式

    CopySELECT prod_name FROM products 
    WHERE prod_name REGEXP '1000'ORDER BY prod_name ;//替代了LIKE

    LIKE匹配整个列,而REGEXP在列值内进行匹配。使用^(开始)和$(结束)定位符(anchor)即可,为了匹配特殊字符,必须用\ \为前导。

    区分通配符和正则表达式(匹配范围、匹配几个字符之一,或者)

    可以使用预定义的字符集,称为字符类(character class)
    存储在表中的数据都不是应用程序所需要的。需要转换-- -计算字段,例如,拼接。没有列名,需要用AS来指定。计算字段的另一常见用途是对检索出的数据进行算术计算.

    CopySELECT Concat(RTrim(vend_name),' (',vend_country,')') AS vend_titleFROM vendors ORDER BY vend_name;SELECT 2*4 XXX;//算术运算符

    使用处理函数,字符串,数字,日期,DBMS信息

    日期和时间函数在MySQL语言中具有重要的作用。

    DateDiff() 计算两个日期之差

    无论你什么时候指定一个日期,不管是插入或更新表值还是用WHERE子句进行过滤,日期必须为
    格式yyyy-mm-dd。

    datatime与date类型比较,截取相同部分比较Date(xxx)

    汇总数据aggregate function

    针对对象,列:avg,max(单列、忽略null),min ,sum,count()返回某列的行数

    AVG()只用于单个列

    COUNT()函数进行计数。可利用COUNT()确定表中行的数目或符合特定条件的行的数目

    • COUNT(*):对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。

    • COUNT(column):对特定列中具有值的行进行计数,忽略NULL值。

    CopySELECT SUM(item*quantity) AS total_price 
    FROM orderitemsWHERE order_num=23000;SELECT AVG(DISTINCT prod_price) AS avg_priceFROM productsWHERE vend_id=2003;SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg,FROM products
    这些函数是高效设计的

    select语句只有select子句是必须的,且select后面跟的是表达式

    利用子查询进行过滤,select的结果可用于另一条SELECT语句的WHERE子句。内层的SELECT语句的列和外层的WHERE列相同

    CopySELECT order_num FROM orderitems WHERE prod_id='INIT2';//20002,20004SELECT cust_id FROM orders WHERE order_num IN(20002,20004)
           合并SELECT cust_id 
           FROM ordersWHERE order_num IN(SELECT order_num 
           FROM orderitems                   WHERE prod_id='INT2');//执行流程:从内向外。
           //查询ID的信息。SELECT cust_name,cust_contactFROM customersWHERE cust_id IN(SELECT cust_id//返回客户ID
           FROM orders 
           WHERE order_num IN(SELECT order_num//返回订单号列表

           FROM orderitems

           WHERE prod_id='INT2'));

    作为计算字段使用子查询,子查询:过滤或者使用计算字段

    Copy--每个客户的总订单数思路:先求单个客户的,然后使用子查询SELECT COUNT(*) AS ordersFROM ordersWHERE cust_id=10001;
           //为了对每个可以执行COUNT(*) ,子查询SELECT cust_name,
           cust_state,
           (SELECT COUNT(*)        

           FROM orders        

           WHERE orders.cust_id=customers.cust_id) AS orders FROM customers ORDER BY cust_name;

    子查询构造过程:从内到外,逐渐进行。

    测试时外层循环用硬编码,eg:where cust_id=23223;

    子查询最常见的使用是在WHERE子句的IN操作符中,以及用来填充计算列
    一类数据一个表。各表通过某些常用的值(即关系设计中的关系(relational))互相关联。
    外键(foreign key) 外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。

    连接:要连接的所有表和连接方式

    CopySELECT vend_name,prod_name,prod_priceFROM vendors AS v,products AS p--所有表WHERE v.vend_id=p.vend_id-- 连接方式:equijoin,等值连接,又称内部联结ORDER BY vend_name,prod_name;
    完全限定列名消除二义性!!SELECT vend_name,prod_name,prod_priceFROM vendors INNER JOIN productsON vendors.vend_id=products.vend_id;
    //多个表。列出所有,然后关联!!

    其实,对于这种联结(等值连接、内部连接)可以使用稍微不同的语法来明确指定联结的类型。FROM A,B WHERE A.col1=B.col2可以简写为:inner join。联结是SQL中最重要最强大的特性

    使用哪种语法? ANSI SQL规范首选INNER JOIN语法,连接条件。

    别名除了用于列名和计算字段外,SQL还允许给表名起别名。

    • 缩短SQL语句;

    • 允许在单条SELECT语句中多次使用相同的表。自连接

    Copy--物品有问题,该供应商的其他商品是否也有问题SELECT prod_id,prod_nameFROM productsWHERE vend_id=(SELECT Vend_id               FROM products              WHERE prod_id='DTNTR') --子查询-- 联结SELECT p1.prod_id,p1.prod_nameFROM products AS p1,products AS p2WHERE p1.vend_id=p2.vend_id AND p2.prod_id='DTNTR' --级联操作和过滤数据。

    联结包含了那些在相关表中没有关联行的行。这种类型的联结称为外部联结,需要与left或者right来指明

    在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)

    CopySELECT customers.cust_id,COUNT(orders.order_num) AS num_ordFROM customers RIGHT OUTER JION ordersON orders.cust_id=customers.cust_id

    应该总是提供联结条件,否则会得出笛卡儿积。

    多条SQL 的组合查询 UNION

    MySQL也允许执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回,union或者复合查询(compound query),组合查询和多个WHERE条件

    所需做的只是给出每条SELECT语句,在各条语句之间放上关键字UNION。UNION中的每个查询必须包含相同的列、表达式或聚集函数,因为返回的结果合为一个表

    Copy--UNION从查询结果集中自动去除了重复的行SELECT vend_id,prod_id,prod_priceFROM productsWHERE prod_price<=5UNION ALL--保留重复SELECT vend_id,prod_id,prod_priceFROM prouctsWHERE vend_id IN(1001,1002)ORDER BY vend_id,prod_price;--能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后----等价于多个where条件SELECT vend_id ,prod_id,prod_priceFROM productsWHERE prod_price<=5
    OR vend_id IN (1001,1002)

    UNION几乎总是完成与多个WHERE条件相同的工作。UNION ALL为UNION的一种形式,它完成WHERE子句完成不了的工作。如果确实需要每个条件的匹配行全部出现(包括重复行),则必须使用UNION ALL而不是WHERE。

    在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后

    总是使用列的列表。插入时提高整体性能,可以使用INSERT LOW_PRIORITY INTO

    插入检索出的数据 insert select,列的位置。

    CopyINSERT INTO customers(cust_id,cust_contact,cust_email,cust_name) SELECT cust_id,cust_contact,cust_email,cust_name 
    FROM custnew;

    创建表:表名+列名

    CopyCREATE TABLE orders(
           order_num int NOT NULL AUTO_INCREMENT,
           cust_id int NOT NULL DEFAULT 1,-- 默认值PRIMARY KEY(order_num)
           )ENGINE=InnoDB;

    NULL为默认设置.使用的最简单的编号是下一个编号.AUTO_INCREMENT;

    每个表只允许一个AUTO_INCREMENT列,而且它必须被索引(如,通过使它成为主键)。通过last_insert_id()函数获得最后一个AUTO_INCREMENT.存储引擎负责创建表等操作。

    在表的设计过程中需要花费大量时间来考虑,以便后期不对该表进行大的改动。

    更新表 alter table

    CopyALTER TABLE vendorsADD vend_phone CHAR(20);-- 增加列。ALTER TABLE vendorsDROP COLUMN vend_phone;

    ALTER TABLE的一种常见用途是定义外键

    CopyALTER TABLE order_itemsADD CONSTRAINT fk_item_orders
    FOREIGN KEY(order_num) REFERECES orders(order_num);

    使用ALTER TABLE要极为小心,应该在进行改动前做一个完整的备份,没有撤回操作。
    删除表:DROP TABLE 表名

    重命名表:RENAME TABLE 原来的表名 TO 新的表名

    CopyRENAME TABLE backup_a TO a,
    backup_b TO b;

    使用存储过程

    存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。
    MySQL称存储过程的执行为调用,CALL

    CopyCALL product_pricing(
          @pricelow,
          @pricehigh,
          @price_average);-- 调用。-- -- --  MYSQL 调用时需要修改结束分割符号。DELEMITER //CREATE PROCEDURE prices()BEGINSELECT Avg(prod_price) AS price_avgFROM products;END//
    DELEMITER ;-- 应用CALL prices();-- 删除 DROP PROCEDURE IF EXISTS prices;

    带参数的存过程

           Copy-- 声明变量;DECLARE price_low DECIMAL(8,2);            DELEMITER //CREATE PROCEDURE prices(OUT p1 DECIMAL(8,2),OUT ph DECIMAL(8,2))BEGINSELECT MIN(prod_price) INTO p1 FROM products;SELECT MAX(prod_price) INTO ph FROM products;END //
    DELEMITER ;CALL prices(@price_low,@proce_high);所有MySQL变量都必须以@开始。--  以上调用不显示任何的数据,它返回变量;应用SELECT @price_low;--  COMMENT关键字SHOW CREATE PROCEDURE

    触发器:SQL语句与事件关联

    应用场景:

    • insert时检查电话号格式。

    • delete时保存副本等。

    触发器是MySQL响应以下语句(DELETE、INSERT、UPDATE)而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句).

    CopyCREATE TRIGGER new_product AFTER INSERT ON productsFOR EACH ROW SELECT 'product added';-- 删除,触发器不支持更新DROP TRIGGER new_product;

    只有表才支持触发器,视图不支持(临时表也不支持)。每个表最多支持6个触发器(每条INSERT、UPDATE和DELETE的之前和之后)

    CopyCREATE TRIGGER new_order AFTER INSERT ON orders 
    FOR EACH ROW SELECT NEW.order_num;-- FOR EACH ROW 跟具体的SQL语句。-- 应用INSERT INTO orders(order_date,cust_id) 
    VALUES(Now(),10001); -- 返回值就是触发器定义的内容。-- DELETE 触发器CREATE TRIGGER delete_order BEFORE DELETE ON ordersFOR EACH ROWBEGIN
    INSERT INTO archive_orders VALUES(OLD.order_num,OLD.order_date,OLD.cust_id);END-- 引用一个名为OLD的虚拟表-- UPDATE 触发器的应用,数据验证CREATE TRIGGER update_vendor BEFORE UPDATE ON vendorsFOR EACH ROW SET NEW.vend_state=Upper(NEW.vend_state)

    触发器的一种非常有意义的使用是创建审计跟踪。使用触发器,把更改(如果需要,甚至还有之前和之后的状态)记录到另一个表非常容易.

    全球化和本地化:字符集

    • [ ] 字符集为字母和符号的集合;

    • [ ] 编码为某个字符集成员的内部表示;

    • [ ] 校对COLLATE:规定字符如何比较的指令。

    CopySHOW CHARACTER SET;SHOW COLLATION;SHOW VARIABLES LIKE 'character%'-- 创建表时指定字符集和校对。-- 当不指定COLLATE,则使用数据库默认。CREATE TABLE mytable(
        column1 INT,
        columns2 VARCHAR(10)

    )DEFAULT CHARACTER SET  hebrewCOLLATE hebrew_general_ci;

    校对在对用ORDER BY子句 检索出来的数据排序时起重要的作用。
    COLLATE可用于ORDER BY、GROUP BY、HAVING、聚集函数、别名等。

    CopySELECT * FROM customersORDER BY lastname,firstname COLLATE latin1_general_cs;

    安 全 管 理

    访问控制:设置权限,使用GRANT语句

    MySQL用户账号和信息存储在名为mysql的库中.

    CopyUSE mysql;SELECT user FROM user;

    MySQL的权限用用户名和主机名结合定义,不指定采用默认值

    CopyCREATE USER 'yyq' identified by '密码' ;-- 可以不指定密码,指定时需要用identified byRENAME USER yyq TO 'new_name';

    GRANT:权限名称-数据库或者表-用户名。回收权限:revoke

    CopyGRANT SELECT on test.* TO yyq;REVOKE SELECT ON test.* TO yyq;

    GRANT和REVOKE可在几个层次上控制访问权限:

     整个服务器,使用GRANT ALL和REVOKE ALL;

     整个数据库,使用ON database.*;

     特定的表,使用ON database.table;

     特定的列;

     特定的存储过程。

    简化多次授权:GRANT SELECT,INSERT ON test.* TO yyq

    更改口令

    CopySET PASSWORD FOR yyq=Password('ddd');

    数据库维护:备份mysqldump

    mysqlhotcopy,BACKUP TABLE

    Copyanalyze table user;check table user;

    查看日志:1.错误日志·hostname.err;2.查询日志hostname.log;3.二进制日志(更新):hostname-bin;4.慢查询日志hostname-slow.log

    改善性能

    SHOW VARIABLES;SHOW STATUS;SHOW PROCESSLIST。

    总是有不止一种方法编写同一条SELECT语句。应该试验联结、并、子查询等,找出最佳的方法
    使用EXPLAIN命令检查SQL执行过程。

    • [x] 应该总是使用正确的数据类型。串类型、数值类型、日期和时间、二进制类型Blob(Binary long Object)


    • [ ] LIKE很慢。一般来说,最好是使用FULLTEXT而不是LIKE。

    如果数值是计算(求和、平均等)中使用的数值,则应该存储在数值数据类型列中。如果作为字符串(可能只包含数字)使用,则应该保存在串数据类型列中。
    不使用引号 与串不一样,数值不应该括在引号内。



    文章来源:博客园

    文章链接:https://www.cnblogs.com/justisme/p/12797955.html

    如有侵权,请联系删除