mysql学习笔记

【前言】以前学过mongodb,几天的学习,也算入了MySQL的门。参考下面一个网站,慢慢的系统学习一下。一个系统的网站(点我)

一、基础介绍

  1、数据库——表——列(及其指定的数据类型)。

  2、行,表中的数据是按行存储的,保存的每个记录存储在自己的行内。

  3、主键(primary key):一列或一组列,其值能够唯一区分表中的每一行;唯一标识表中每行的这个列(或这组列)称为主键。例如我设计的(Id)。要求:任意两行都不具有相同的主键值;每个行都必须具有一个主键值(主键列不允许NULL值);

#一个表有多个候选键,我们选择一个作为主键
CREATE TABLE student_info (
    number INT PRIMARY KEY,
    name VARCHAR(5) '注释信息',    #注释以单引号放在,里面
    sex ENUM('男', '女'),
    major VARCHAR(30),
    enrollment_time DATE
);
#也可以把主键声明单独提取出来:PRIMARY KEY (列名1, 列名2, ...)
#多个列组成的候选主键,必须单独列出
CREATE TABLE student_score (
    number INT,
    subject VARCHAR(30) UNIQUE,  #唯一性约束,不允许列中有相同的
    score TINYINT,
    PRIMARY KEY (number, subject)
);

 4、外键

 5、自增:id int UNSIGNED AUTO_INCREMENT PRIMARY KEY,   #int UNSIGNED类型的自增的主键

  一个表最多只能有一个自增列;必须建立索引

  6、修改表名

  ALTER TABLE 旧表名 RENAME TO 新表名;

  7、增加列

  ALTER TABLE 表名 ADD COLUMN 列名 列的类型 [列的属性];

  alter table ksdata add column qihuoshuju char(4) not null;

  增加到指定的位置:ALTER TABLE 表名 ADD COLUMN 列名 列的类型 [列的属性] AFTER 指定列名;

  8、删除列

  alter table drop column 列名;

  9、通配符

  格式上需要LIKE和NOT LIKE的搭配,a LIKE b  :  a匹配b;a NOT LIKE b  :  a不匹配b

  %:代表任意一个字符串;

  _:代表任意一个字符;

  eg:   select name from name_list where name LIKE '黄%';

  若想匹配%和_可以使用转义字符“/”。也不能匹配NULL,需要使用IS NULL 或者IS NOT NULL来唯一标识NULL。

  10、函数

  MAX、MIN、AVG(求平均数)

二、基本操作

  1、select排序检索

  • 检索最高或最低值

  select column from table orderby column desc limit 1;

  column desc告诉MySQL按照降序排列,limit 1告诉MySQL只返回一行的数据

  2、abc.sql文件导入数据库

mysqldump -uroot -p abc > abc.sql

  abc.sql文件里面是什么样的呢?很简单,多张表就有多个数据段,每个数据段基本类似。举例一个数据段:

/*Table structure for table `auth_user_groups` */

DROP TABLE IF EXISTS `auth_user_groups`;

CREATE TABLE `auth_user_groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `group_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_id` (`user_id`,`group_id`),
  KEY `auth_user_groups_group_id_30a071c9_fk_auth_group_id` (`group_id`),
  CONSTRAINT `auth_user_groups_group_id_30a071c9_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`),
  CONSTRAINT `auth_user_groups_user_id_24702650_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;

/*Data for the table `auth_user_groups` */

insert  into `auth_user_groups`(`id`,`user_id`,`group_id`) values (15,12,1),(23,13,1),(21,14,1),(22,15,1),(20,16,1),(24,17,1);

  三步:判断表是否存在;建立表;插入数据。

  3、视图(view)

  我们在写SQL查询语句时,可能写的非常长。可以把它定义成一个视图,这样就不要每次使用同样的语句时再敲一遍了。只需要使用定义 的视图就好了。

  对视图更新也能更新到数据库底层,但是反之不可以。但是底层数据库可能对应多个视图,不建议在视图上进行更新。具体语法百度。

三、事务

  MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  • 事务用来管理 insert,update,delete 语句

3.0、回滚

  回滚是分情况的,有时会回滚整个事务,有时候会回滚错误的那一条,其他的任然会被提交,这需要设置。https://blog.csdn.net/z10843087/article/details/79206973

3.1、一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,数据库操作中不可分割的最小工作单元。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。(但是未提交的数据是可以被看到的,在命令行模式下面。此时银行的例子合适了,因为没有转移那一说https://www.cnblogs.com/huanongying/p/7021555.html)

  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏,数据库总是从一个一致性的状态到达另一个一致性的状态,没有稳定的中间态可以查询到。在银行存款的例子中,只有一些列的操作都完成,事务才会提交,钱才会转移。

  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

  在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

3.2、隔离的级别

    图文讲解https://www.cnblogs.com/huanongying/p/7021555.html

  (1)未提交读:并发中一个线程可以读取未提交的数据,导致脏读。有可能在读取之后,未提交之前,源数据被另一线程也读取了,但是源线程做了回滚操作,相当于第二个线程读取了数据库实例中的临时数据。所以,原子性和脏数据的存在并不矛盾,原子性是对于一个事务的,隔离性是对于多个事务操作同一个数据的。

  (2)提交读:解决了脏读,必须等其他线程B提交后才能读取。但是如果线程A先读取了数据,然后B进行一些列的读取修改提交,然后A再次读取时,数据已经发生了变化,这就是导致了问题:不可重复读。

    (3)可重复读:该级别保证了同一个事务的多次读取同一条数据是一致的,即使另一个事务提交了修改。解决了脏读,但是会出现幻读,就是同一个事务多次读取数据时,另一个事务插入了数据,导致第一个事务产生幻行,致使第一个事务也会读取第二个事务变化的值;mysql默认这种

  不可重复读和幻读区别:大致的区别在于不可重复读是由于另一个事务对数据的更改所造成的,而幻读是由于另一个事务插入或删除引起的

   (4)可串行化:级别最高的隔离手段。解决了幻读。

    后记:以上所说的四种隔离性本质在于何处何时加锁,锁机制应用是数据库自动完成的,不需要人为干预。隔离级别的设置只对当前链接有效。对于使用MySQL命令窗口而言,一个窗口就相当于一个链接,当前窗口设置的隔离级别只对当前窗口中的事务有效。

  3.3、死锁

  多个事务争夺同一个资源,互相等待对方释放锁。innodb的解决方法是将持有最少行级排他锁的事务进行回滚。

  3.4mysql中的事务

  mysql默认自动commit,当然可以手动提交set autocommit=1;会自动提交。

四、优化

  https://mp.weixin.qq.com/s/peP-vu6lSGYWEx0MCD8pGA

五、存储

  有时候为了完成一个常用的功能需要执行许多条语句,每次都在客户端里一条一条的去输入这么多语句是很烦的,我们希望有一种批处理的形式,让我们以很简单的方式一次性的执行完这些语句,MySQL中的存储程序本质上封装了一些可执行的语句,然后给用户提供一种简单的调用方式来执行这些语句,根据调用方式的不同,我们可以把存储程序分为存储例程触发器事件这几种类型。其中,存储例程又可以被细分为存储函数存储过程。我们画个图表示一下:

  在正式介绍存储程序之前,我们需要先了解一下MySQL中的自定义变量和复合语句的概念。

1、自定义变量

  MySQL中对我们自定义的变量的命名有个要求,那就是变量名称前必须加一个@符号。我们自定义变量的值的类型可以是任意MySQL支持的类型。可是存储整数、字符串,且定义的时候无需指定,各种类型之间可以相互赋值。格式上:mysql>SET @a=1;定义变量要用@来指定。 

mysql> SELECT @a;
+------+
| @a   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

#同一个变量可以存储不同类型的值
mysql> SET @a = '哈哈哈';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @b = @a;
Query OK, 0 rows affected (0.00 sec)

#最重要的,可以将某个查询结果赋值给变量
mysql> SET @a = (SELECT m1 FROM t1 LIMIT 1);
mysql> SELECT n1 FROM t1 LIMIT 1 INTO @b;

2、复合语句

  方法一:在同一行输入多个“;”

  方法二:更改默认的结束标志;、g和G。使用delimiter $。

3、存储函数

  就是对SQL语句的一个封装,封装成函数就可以不要写那么长的SQL语句了。

CREATE FUNCTION 存储函数名称([参数列表])
RETURNS 返回值类型
BEGIN
    函数体内容      #带RETURN
END
mysql> delimiter $;
mysql> CREATE FUNCTION var_demo()
->    RETURNS INT
->    BEGIN
       --函数体内的注释用--来标识 ->     RETURN(SELECT AVG(SCORE)FROM student_score WHERE subect=yuwen); ->    END $ Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; #再将结束符号转换过来

4、存储过程

  存储函数存储过程都属于存储例程,都是对某些语句的一个封装。存储函数侧重于执行这些语句并返回一个值,而存储过程更侧重于单纯的去执行这些语句。

CREATE PROCEDURE 存储过程名称([参数列表])
BEGIN
    需要执行的语句
END    

  与存储函数最直观的不同点就是,存储过程的定义不需要声明返回值类型

  二者的区别不在叙述,可以查到。

 5、存储程序的总结:

  1. 存储程序本质上是一些可执行的MySQL语句,根据调用情况不同分为3种类型,分别是存储例程触发器事件

  2. 存储例程需要我们手动去掉用,具体分为存储函数存储过程两种类型。

  3. 触发器是在执行某条语句之前或者之后自动去调用另外一些语句。

  4. 事件是定时执行的。

六、从存储到存储引擎

  我们知道在一台计算机上可以同时运行多个程序,比如微信、QQ、音乐播放器、文本编辑器啥的,每一个运行着的程序也被称为一个进程。我们的MySQL服务器程序本质上就是计算机上的一个进程,这个代表着MySQL服务器程序的进程也被称为MySQL数据库实例,简称数据库实例

  数据库有服务器端和客户端,二者通信方式就是进程间通信的方式,总共有三种。

  1、TCP/IP

  一般的工作环境中,MySQL服务器程序通常会被运行到一个独立的机器中,所以其他客户端程序只能通过TCP/IP网络来与服务器程序进行通信,尤其在linux服务器上只能tcp/ip。需要指定驱动,默认端口3306,本地地址localcast,回环地址127.0.0.1都可以。

  2、命名管道和共享内存

  如果我们的服务器程序和客户端程序都运行在同一台操作系统为Windows的机器上的话,我们可以下边这两种方式来通信:

  • 使用命名管道来进行线程间通信,不过需要在启动服务器程序的命令中加上--enable-named-pipe参数,然后在启动客户端程序的命令中加入--protocal=pipe参数。

  • 使用共享内存来进行线程间通信,不过需要在启动服务器程序的命令中加上--shared-memory参数,在成功启动服务器后,共享内存便成为本地客户端程序的默认连接方式,不过我们也可以在启动客户端程序的命令中加入--protocal=pipe参数来显式的指定使用共享内存进行通信。 ·

七、服务器运维——启动细节

  mysqld

  我们知道MySQL服务器程序的进程名称就是mysqld,运行这个可执行文件会直接启动MySQL服务器程序。但这个命令不常用,我们继续往下看更牛逼的启动命令。

  mysql_safe

  运行mysql_safe不仅可以启动MySQL服务器程序,而且启动另外一个监控进程,在MySQL服务器程序挂了的时候,可以帮助重启它。另外,使用mysql_safe启动服务器程序时,它会将服务器程序的出错信息和其他诊断信息重定向到某个文件中,产生出错日志,我们之后在说日志管理的时候会详细说这些错误日志。

  mysql.server

  mysql.server只是对mysql_safe的一个封装,在调用mysql.server时需要在后边指定start参数,就像这样:mysql.server start 

  mysql_multi

  其实我们一台计算机上也可以运行多个MySQL实例,也就是运行多个MySQL服务器程序。如果想运行多个的话,就需要使用到mysql_multi了。

  更多运维管理:https://mp.weixin.qq.com/s/P2d4bpLgKrfR7JzAeJI36A

  

原文地址:https://www.cnblogs.com/huangfuyuan/p/9398258.html