Mysql

作者: Gukson666 | 来源:发表于2018-04-09 14:28 被阅读0次

    Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS

    主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
    外键:外键用于关联两个表.。

    1.数据以表格的形式出现
    2.每行为各种记录名称
    3.每列为记录名称所对应的数据域
    4.许多的行和列组成一张表单
    5.若干的表单组成database

    具体连接参照node连接数据库笔记,使用navicat。

    这里主要记录需要重点掌握的:

    数值类型;INTEGER DECIMAL(M,D) NUMERIC FLOAT DOUBLE
    日期和时间类型:DATETIME(YYYY-MM-DD HH:MM:SS混合)、DATE(YYYY-MM-DD)、
    TIMESTAMP、TIME(HH:MM:SS)和YEAR(YYYY)
    字符串类型:CHAR(定长)、VARCHAR(变长)、TEXT(长文本数据)

    • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL
    • AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
    • PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。

    show databases 显示数据库 use 某个库 show tables 显示有什么表
    CREATE TABLE table_name;
    DROP TABLE table_name ;
    修改:修改数据表使用 RENAME 子句来实现。
    ALTER TABLE testalter_tbl RENAME TO alter_tbl;
    修改字段的默认值:
    ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
    修改字段类型及名称:把字段 c 的类型从 CHAR(1) 改为 CHAR(10)
    ALTER TABLE testalter_tbl MODIFY c CHAR(10);
    使用 ADD 子句来向数据表中添加列
    ALTER TABLE testalter_tbl ADD i INT;
    使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段:
    ALTER TABLE testalter_tbl DROP i;

    查询
    SELECT column_name,column_name FROM table_name [WHERE Clause] [OFFSET M ][LIMIT N]

    插入
    INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
    INSERT INTO table_name (field1, field2,...fieldN) VALUES (valueA1,valueA2,...valueAN),(valueB1,valueB2,...valueBN),(valueC1,valueC2,...valueCN)......;

    Where子句:
    你可以在 WHERE 子句中指定任何条件。
    你可以使用 AND 或者 OR 指定一个或多个条件。
    WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。

    更新
    UPDATE table_name SET field1=new-value1, field2=new-value2 可以同时更新一个或多个字段。
    [WHERE Clause] 可以在 WHERE 子句中指定任何条件。

    删除
    DELETE FROM table_name [WHERE Clause]

    • 没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。

    Like子句及通配符:
    SELECT field1, field2,...fieldN FROM table_name WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'

    • %表示任何字符出现任意次数
    • _表示匹配单个字符
    • [ ] 用来指定一个字符集
    • Mysql拼接字符串使用 ‘ ’ 单引号括起来

    UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。
    select ... UNION [ALL | DISTINCT] select ...

    排序:
    SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]]

    • 可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
    • 可以设定多个字段来排序。顺序从左到右
    • 使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列

    分组:
    GROUP BY 语句根据一个或多个列对结果集进行分组。
    在分组的列上我们可以使用 COUNT, SUM, AVG,等函数,所以一般有聚集函数都有分组
    SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;

    过滤分组:所有类型的where子句都可以用having代替,区别在于where过滤行,having过滤分组。
    一般使用group by子句时,应该也给出order by子句。

    联结:
    简单联结:通过where子句将两个表中相同属性列关联起来
    如:where Vendors.vend_id = Products.vend_id 多个表则用and拼在一起

    高级联结:
    自联结:select 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'

    • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
    • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
    • RIGHT JOIN(右连接):用于获取右表所有记录,即使左表没有对应匹配的记录。
    Select Customers.cust_id,Orders.order_num
    From Customers inner join Orders
    On Customers.cust_id = Orders.cust_id;
    
    Select Customers.cust_id,Orders.order_num
    From Customers left join Orders
    On Customers.cust_id = Orders.cust_id;
    
    Select Customers.cust_id,Orders.order_num
    From Customers right join Orders
    On Customers.cust_id = Orders.cust_id;
    

    NULL值:

    • IS NULL: 当列的值是 NULL,此运算符返回 true。
    • IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
    • NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回false
    • <=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true

    补充正则:
    [...] 字符集合。匹配所包含的任意一个字符
    [^...] 负值字符集合。匹配未包含的任意字符
    . 匹配除 "\n" 之外的任何单个字符
    *匹配前面的子表达式零次或多次
    ^ 匹配输入字符串的开始位置
    $ 匹配输入字符串的结束位置
    +匹配前面的子表达式一次或多次
    {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

    查找name字段中以'st'为开头的所有数据:
    SELECT name FROM person_tbl WHERE name REGEXP '^st';
    查找name字段中以'ok'为结尾的所有数据:
    SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

    Mysql事务处理

    1、事务的原子性:一组事务,要么成功;要么撤回。
    2、稳定性 :有非法数据(外键约束之类),事务撤回。
    3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
    4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit 选项 决定什么时候吧事务保存到日志里。

    事务控制语句:
    BEGIN或START TRANSACTION;显式地开启一个事务;
    COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
    ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
    SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
    RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
    ROLLBACK TO identifier;把事务回滚到标记点;
    实例:

    mysql> begin;  # 开始事务
    Query OK, 0 rows affected (0.00 sec)
    mysql> insert into runoob_transaction_test value(5);
    Query OK, 1 rows affected (0.01 sec)
    mysql> insert into runoob_transaction_test value(6);
    Query OK, 1 rows affected (0.00 sec)
    mysql> commit; # 提交事务
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> begin;    # 开始事务
    Query OK, 0 rows affected (0.00 sec)
    mysql>  insert into runoob_transaction_test values(7);
    Query OK, 1 rows affected (0.00 sec)
    mysql> rollback;   # 回滚
    Query OK, 0 rows affected (0.00 sec)
    

    补充: INSERT IGNORE INTO与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。

    所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
    我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。
    可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
    永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

    导出数据:可以使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件上。
    SELECT * FROM runoob_tbl INTO OUTFILE '/tmp/tutorials.txt';

    导入数据:LOAD DATA INFILE语句来插入数据。 以下实例中将从当前目录中读取文件 dump.txt ,将该文件中的数据插入到当前数据库的 mytbl 表中。
    LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;

    文本处理函数:LENGTH() LOWER() UPPER()
    聚集函数:AVG() COUNT() MAX() MIN() SUM()

    视图是虚拟的表:只包含使用时动态检索数据的查询。
    主要作用是保护基础数据,简化数据处理。
    create view pc as select........

    完全限定列名即表示字段前面要指明表名,这样不容易混淆,可读性好。

    补充子查询:从内向外处理,但是性能低。
    select id from orders where or_num in (select or_num from orderitems where prod_id = 'R01')

    相关文章

      网友评论

        本文标题:Mysql

        本文链接:https://www.haomeiwen.com/subject/dihmmxtx.html