• 《MySQL必知必会》学习笔记__第1章至第10章


    《MySQL必知必会》豆瓣读书链接 https://book.douban.com/subject/3354490/

    第1章 了解SQL

    一些重要的概念:

    1. 数据库(Database): 保存有组织的数据的容器(通常是一个文件或一组文件)。

    数据库软件称为数据库管理系统(DBMS)。

    2. 表(table): 表是一种结构化的文件,用来储存某种特定类型的数据。

    数据库中的每个表都有一个名字来标识自己,这个名字是唯一的。

    但是在不同的数据库中,却可以使用相同的表名。

    3. 模式(schema): 关于数据库和表的布局及特性的信息。

    4. 列(column): 列是表中的一个字段。所有表都是由一个或多个列组成的。

    5. 数据类型(datatype): 数据类型表示所容许的数据的类型。每个表列都有相应的数据类型,它限制或容许该列中储存的数据。

    6. 行(row): 表中的数据是按行储存的,所保存的每个记录存储在自己的行内。行表示表中的一个记录。

    7. 主键(primary key): 表中每一行都应该有可以唯一标识自己的一列(或一组列)。主键为一列(或一组列),其值能够唯一区分表中每个行。

    表中的任何列都可以作为主键,只要它满足以下条件:

    (1) 任意两行都不具有相同的主键值;

    (2) 每个行都必须具有一个主键值(主键列不允许NULL值)。

    主键可以定义在一列或者多个列上。

    8. SQL: SQL是一种专门用来与书海库通信的语言。

    9. 关键字 (key word): 作为MySQL语言组成部分的一个保留字。一定不能用关键字命名一个表或列。

    MySQL不区分大小写,但是关键字一般采用大写表示

    10. 自动增量(auto_increment):MySQL可以自动地为每个行分配下一个可用编号,不用在添加一行是手动分配唯一值,这个功能就是自动增量。

    11. NULL 无值 (no value): 它与字段包含0、空字符串或仅仅包含空格不同。

    第2章 MySQL简介

    MySQL是一种数据库管理软件,它是一种基于客户机-服务器的数据库

    在电脑终端输入mysql -uroot -p,然后输入密码进入MySQL。

    MySQL的命令输入在mysql>之后;

    用分号“;”或者g结束,仅按Enter不能执行命令;

    输入help或者h获得帮助,也可以输入更多的文本获得特定命令的帮助,如help SELECT 获得使用SELECT语句的帮助;

    输入quitexit退出后命令行实用程序。

    第3章 使用MySQL

    显示现有可用的数据库的一个列表:SHOW DATABASES;

    使用必知必会数据库:USE bizhibihui;

    获得bizhibihui数据库中的表的列表:SHOW TABLES;

    显示表列: SHOW COLUMNS FROM customers;   这种表示方法等价于  DESC customers;

    运行结果显示customers中的每个字段返回一行,行中包含字段名、数据类型、是否允许NULL 、键的信息、默认值以及其他信息。

    int() 代表整数型数据, char()代表字符型数据,auto_increment表示自动增量

    自动增量:MySQL可以自动地为每个行分配下一个可用编号,不用在添加一行是手动分配唯一值,这个功能就是自动增量。

    MySQL中的其他SHOW语句还有:

    SHOW STATUS: 用于显示广泛的服务器状态信息;

    SHOW CREATE DATABASESSHOW CREATE TABLE,分别用来显示创建特定数据库或表的MySQL语句;

    SHOW GRANTS: 用于显示授权用户的安全权限;

    SHOW ERRORSSHOW WARNINGS:用来显示服务器错误或警告消息。

     第4章 检索数据

    利用products表进行数据检索

    查看products的表内信息,DESC products;

    检索单列:从products表中检索名为prod_name的列:SELECT prod_name FROM products;

    MySQL不区分大小写,但是建议对SQL关键字时候用大写字母,所有的表名和列名使用小写字母,这样使代码更易于阅读和调试。在处理SQL语句时,所有的空格被忽略

    检索多个列:从products表中检索名为prod_id, prod_name, prod_price的列:SELECT prod_id, prod_name, prod_price FROM products;

    检索所有列:从products表中检索所有列:SELECT * FROM products;     其中,*通配符

    检索不同的行:SELECT DISTINCT vend_id FROM products;

    SELECT vend_id FROM products;

    DISTINCT作为关键字,可以使MySQL返回不同的vend_id。在使用DISTINCT关键字时,它必须直接放到列名之前

    限制结果:利用LIMIT关键字,使MySQL返回表的第一行或前几行:SELECT prod_name FROM products LIMIT 5;   返回prod_name的前五行

    为了得到下一个五行,需要制定检索的开始行和行数:SELECT prod_name FROM products LIMIT 5,5;  结果为prod_name的第6至10行

    SELECT prod_name FROM products;

    LIMIT检索出来的第一行行0,因此LIMIT 1, 1将检索出第二行而不是第一行。

    SELECT prod_name FROM products LIMIT 1, 1;

    使用完全限定的表名,即同时使用表名和列字:SELECT products.prod_name FROM bizhibihui.products;

     第5章 排序检索数据

    子句(clause): SQL语句由子句构成,有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。

    ORDER BY子句:对输出进行排序:SELECT prod_name FROM products ORDER BY prod_name;

    对prod_name列以字母顺序排序

    按多个列排序SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;

    先按照prod_price排序,再按照名称排序;仅仅在多个行具有相同的prod_price值时,才对产品按照prod_name进行排序;如果prod_price列中所有的值都是唯一的,则不会按照prod_name排序。

    指定排序方向:ORDER BY 的默认排序方式为升序排序(A->Z),若想降序排序,则需要使用DESC关键字。 SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;

    按照prod_price的值降序排序; DESC关键字只应用到直接位于其前面的列名。

    用多个列进行排序:SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;

    对prod_price 进行降序,对prod_name仍然进行升序排列。

    如果想在多个列都进行降序排序,必须对每个列指定DESC关键字。

    检索出最昂贵物品的值:SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;

    在使用ORDER BY子句时,子句的次序十分重要,必须为FROM->ORDER BY->LIMIT。

    第6章 过滤数据 

    搜索条件(search criteria) == 过滤条件(filter condition)

    使用WHERE子句,根据子句中指定的搜索条件进行过滤。

    SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50;

    从products表中检索两个列,只返回prod_price值为2.50的行。

    语序:在同时使用ORDER BY和WHERE语句时,语序应该为WHERE -> ORDER BY

    WHERE子句操作符:

    = 等于

    <>    !=   不等于

    < 小于   

    <= 小于等于

    > 大于

    >= 大于等于

    BETWEEN 在指定的两个值之间

    检查单个值:SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses';

    SELECT prod_name, prod_price FROM products WHERE prod_price < 10;

    SELECT prod_name, prod_price FROM products WHERE prod_price <= 10;

    不匹配检查:SELECT vend_id, prod_name FROM products WHERE vend_id != 1003;

    范围值检查:SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

    空值检查:

    NULL 无值 (no value): 它与字段包含0、空字符串或仅仅包含空格不同。

    SELECT prod_name FROM products WHERE prod_price IS NULL;

    SELECT cust_id FROM customers WHERE cust_email IS NULL;

     第7章 数据过滤

    MySQL允许给出多个WHERE子句,这些子句可以有以下两种使用方式:以AND子句的方式或OR子句的方式使用。

    AND操作符:SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;

    此句检索出由供应商1003制造且价格小于等于10美元的所有商品的ID number,名字和价格。

     

    AND:用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。

    OR操作符:SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003;

    OR: WHERE子句中使用的关键字,用来表示检所匹配任一给定条件的行

    计算次序:SELECT prod_name, prod_price FROM products WHERE vend_id  = 1002 OR vend_id = 1003 AND prod_price >= 10; 

    计算次序:在处理OR操作符之前,优先处理AND操作符。

    上述语句应当理解为:由供应商1003制造的任何价格为10美元(含)以上的产品,或者有供应商1002制造的任何产品,而不管其价格如何。 

    使用括号:SELECT prod_name, prod_price FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;

    上述语句应当理解为:由供应商1002或1003制造的且价格都在10美元(含)以上的任何产品。

    IN操作符:用来指定条件范围,范围中的每个条件都可以进行匹配。IN取值合法值 有逗号分隔的清单,全都括在圆括号中。

    SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003

    ORDER BY prod_name;

    等价于

    SELECT prod_name, prod_price FROM products WHERE vend_id IN (1002, 1003) ORDER BY prod_name;

    IN: WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。

    NOT操作符:WHERE 子句中用来否定它之后的任何条件

    SELECT prod_name, prod_price FROM products WHERE vend_id NOT IN (1002, 1003) ORDER BY prod_name;

    MySQL中的NOT仅支持对IN BETWEEN 和EXISTS子句取反

    第8章 用通配符进行过滤

    通配符(wildcard):  用来匹配值的一部分的特殊字符。

    搜索模式(search pattern): 由字面值、通配符或两者组合构成的搜索条件。

    通配符本身实际是SQL的WHERE子句中含有特殊含义的字符。

    在搜索子句中使用通配符,必须使用LIKE操作符。

    最常用的通配符是百分号(%) ,在搜索串中,%表示任何字符出现任意次数。

    找出所有以 jet 起头的产品:SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'jet%';

    通噢诶副可以在搜索模式中任意位置使用,并且可以使用多个通配符

    SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '%anvil%'; 

    通配符可以出现在搜索模式的中间:SELECT prod_name FROM products WHERE prod_name LIKE 's%e';

    除了一个或多个字符外,%还能匹配0个字符;%代表搜索模式中给定位置的0个、1个或多个字符%不能匹配NULL

     另外一个重要的通配符是下划线(_)

    下划线的用途与%一样,但下划线只能匹配单个字符而不是多个字符。

    SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil';

    SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '% ton anvil';

    第9章 用正则表达式进行搜索

    正则表达式使用来匹配文本的特殊的字符集合。

    检索prod_name包含文本1000的所有行SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;

    SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;

    . 是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符。 

     REGEXP '1000' 和 LIKE '1000'的区别:

    SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name; 

    SELECT prod_name FROM products WHERE prod_name LIKE '1000' ORDER BY prod_name;

    REGEXP是在列内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它;

    LIKE匹配整个列,如果被匹配的文本在列值中出现,LIKE将不会找到它;

    MySQL中的正则表达式不区分大小写,为了区分大小写可以使用关键字BINARY,如WHERE prod_name REGEXP BINARY 'JetPack .000'。

    进行OR匹配:SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;

    匹配几个字符之一:通过指定一组[和]括起来的字符完成SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;

    [123]定义了一组字符,它的意思是匹配1或2或3。

    SELECT prod_name FROM products WHERE prod_name REGEXP '1|2|3 Ton' ORDER BY prod_name; 

    否定一个字符集,可以再集合开始的地方放置一个^

    [123]可以匹配字符1、2或3,但[^123]却匹配除了这些字符外的任何东西。 

    匹配范围: 集合可以用来定义要匹配的一个或多个字符。[0123456789][0-9]可以匹配数字0到9

    SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;   匹配1到5

    匹配特殊字符SELECT vend_name FROM vendors WHERE vend_name REGEXP '.' ORDER BY vend_name;

    . 匹配任意字符,所以每个行都被检索出来

    转义:为了匹配特殊字符,必须使用\为前导。\-表示查找-,\.表示查找.。

    SELECT  vend_names FROM vendors WHERE vend_names REGEXP '\.' ORDER BY vend_name;

    空白元字符:

    \f  换页

    \n  换行

    \r   回车

    \t   制表

    \v   纵向制表

    为了匹配反斜杠本身,需要使用\

    匹配字符类:为了更方便的工作,可以适用预定义的字符集,称为字符类

    字符类及其含义: 

    [:alnum:]        任意字母和数字(同 [a-zA-Z0-9] )

    [:alpha:]         任意字符( 同[a-zA-Z] )

    [:blank:]         空格和制表(同 [\t] )

    [:cntrl:]          ASCII控制字符(ASCII 0 到31和127)

    [:digit:]          任意数字(同 [0-9] )

    [:graph:]        与[:print]相同,但不包括空格

    [:lower:]        任意小写字母(同 [a-z] )

    [:print:]         任意可打印字符

    [:punct:]        既不在[:alnum:]又不在[:cntrl:]中的任意字符

    [:space:]        包括空格在内的任意空白字符(同 [\f\n\r\t\v] )

    [:upper:]        任意大写字母(同 [A-Z] )

    [:xdigit:]        任意十六进制数字 (同 [a-fA-F0-9] )

    匹配多个实例:

    重复元字符: 

    *            0或多个匹配

    +            1或多个匹配(等于{1,})

    ?           0或1个匹配 (等于{0,1})

    {n}          指定数目的匹配

    {n,}         不少于指定数目的匹配

    {n,m}       匹配数目的范围(m不超过255)

    SELECT prod_name FROM products WHERE prod_name REGEXP '\([0-9] sticks?\)'; 

    \ 表示查找或者匹配,[0-9]匹配任意数字,sticks?  s后面的?使s可选,?匹配它前面的s出现0次或者1次。

    SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}';

    等同于

    SELECT prod_name FROM products WHERE prod_name REGEXP '[0-9][0-9][0-9][0-9]';

    此句匹配了连在一起的4位数字。

    定位符:

    定位元字符:

    ^ 文本的开始

    $ 文本的结尾

    [[:<:]] 词的开始

    [[:>:]] 词的结尾

    寻找一个数(包括以小数点开始的数)开始的所有产品:SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\.]' ORDER BY prod_name;

    ^的双重用途:否定串开始处:[^123] 除了123以外的字符;^[123] 串的开始处。

    REGEXP匹配子串,LIKE匹配整个串,用^开始每个表达式和$结束每个表达式,解一时REGEXP和LIKE的作用一样。

    第10章 创建计算字段 

    字段(field): 基本上与列(column)的意思相同,字段与列经常互换使用,不过数据库列一般称为列,而字段通常用在计算字段的连接上。

    拼接(concatenate):将值联结到一起构成单个值。

    在MySQL中的SELECT 语句中,可以使用Concat()函数拼接两个列

    SELECT Concat(vend_name, '(', vend_country, '(') FROM vendors ORDER BY vend_name;

    利用RTrim()函数删除数据右侧多余的空格:

    SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')' ) FROM vendors ORDER BY vend_name;

    LTrim() 去掉串左边的空格Trim() 去掉串左右两侧的空格

    使用别名:别名(alias)  是一个字段或值的替换名,别名用AS关键字赋予。

    SELECT Concat(RTrim (vend_name), '(', RTrim(vend_country), ')' ) AS vend_title FROM vendors ORDER BY vend_name;

    执行算数计算:SELECT prod_id, quantity, item_price FROM orderitems WHERE order_num = 20005;

    SELECT prod_id, quantity, item_price, quantity*item_price AS expander_price FROM orderitems WHERE order_num = 20005; 

    此句汇总了物品的价格(单价乘以订购数量) AS expander_price。

    MySQL算数操作符:

    +  加

    -  减

    *  乘

    /  除 

    测试计算:SELECT 3*2; 将返回6,SELECT Trim('abc');  将返回abc,SELECT Now(); 将返回当前日期和时间。

    以上内容是《MySQL必知必会》前十章的学习笔记,欢迎大家多多批评指正。

    祝好

    Violet HE

    2019.2.27 11:05

    你必须非常努力,才能看起来毫不费力。
  • 相关阅读:
    iOS构建流畅的交互界面--卡顿产生的原因
    iOS-tableViewCell重用机制带来的问题及解决
    完全背包
    poj1384
    RunLoop的使用--AFNetworking的网络线程实现+tableView延迟加载图片+App崩溃后立即重启
    poj 3624
    01背包
    poj1416
    java中 File文件常用操作方法的汇总
    线程中涉及到的知识点总结
  • 原文地址:https://www.cnblogs.com/violethjq/p/10435567.html
Copyright © 2020-2023  润新知