zoukankan      html  css  js  c++  java
  • MySQL基础笔记

    1.SQL(Structured Query Language)结构化查询语言,用来和数据库大交道完成和数据库的通信,SQL是一套标准,每个数据库都有自己的个性之处
     
      2.数据库(DataBase),简称DB,通常是一个或一组文件,保存了一些符合特定规则的数据

      3.数据库管理系统(DataBase Managerment System),MySQL就是一个数据库管理系统;

      4.SQL语言通过使用DBMS操作DB,完成对地城数据的增删查改;

      5.MySQL的端口号是3306,在一个网络区域中,端口号是定义计算机地址的标准

      6.可以在服务里面手动打开或关闭mySQL服务,也可以用DOS命令,net start MySQL80打开服务或关闭服务;

      7.表(table)是一种结构化的文件,可以用来存储特定类型的数据,如:学生信息,课表等,此外表
       都有特定的名称,而且不能重复,表的几个概念:列,行,主键;
       列叫做字段(column),行叫做表中的记录,
       每一个字段都有:字段名称/字段数据类型/字段约束/字段长度

      8.字段有规定的数据类型,有规定的名称,有约束,有长度;

      9.SQL语言的分类:1)数据查询语言(DQL Data Query Language)代表关键字:select
                       2)数据操纵语言(DML Data Manipulate Language)代表关键字:insert,delete,uptate
                       3)数据定义语言(DDL Data Definition Language)代表关键字:create(创建),drop(删除),alter(改动表结构)
                       4)事物控制语言(TCL Transactional contral Language)代表关键字:commit,rollback
                       5)数据控制语言(DCL Data Contral Language)代表关键字:grant,revoke

      10.MySQL初学基本操作:1)创建数据库:create database 数据库名称;
                            2)使用数据库:use 数据库名称
                            3)source 文件
                            4)show tables;(查看数据库里的所有表格)
                            4)drop 数据库名(撤销此数据库)

      11.小提示:当忘记敲分号而敲了换行符,用c来终止命令;

      12.查看一张表的结构:desc 表名;这里面的desc是description(描述)的缩写;

      13.查看当前数据管理系统有多少个数据库:show databases;MySQL自带四个默认的数据库;

      14.查看数据库管理系统的版本命令:MySQL --version,如果已经进入了:select version();  

      15.如果用着用着忘了自己用的哪个数据库:select database();

      16.退出数据库管理系统:直接ctrl+c;或者exit,quit

      17.从一个数据库中看其他数据库有哪些表:show tables from 数据库名;

      18.查看数据库中的表当初是怎么创建的:show create table 表名;

      20.从此处开始讲简单查询语句:select name from employee; 表示从employee表中查询name字段;如果要多字段查询,字段名之间用逗号隔开;
         查询所有字段,可用*来表示;(但是可读性差,效率低,不建议用)

      21.注意:SQL语句不区分大小写,SQL语句以分号结尾;

      22.基本步骤:1)查看数据管理系统有哪些数据库  show databases;
                   2)然后选中你要使用的数据库  use 数据库名;
                   3)然后查看此数据库中有哪些表  show tables;
                   4)查看你想要看的表的结构  desc 表名;
                   5)查询此表的字段  select 字段名 fron 表名;

      23.select关键字不会修改底层数据,只是检索数据而已;查询语句:select salary*12 from employee;里面可以写表达式,
         此时屏幕显示的字段是salary*10,不好看,可以修改为:select salary*10 as '年薪' from employee;这样显示的就是年薪字段了;

      24.标准的SQL语句的字符串都是单引号括起来,没有双引号;

      25.下面是条件查询语句:select 字段名 from 表名 where 条件;
     select emp sala from yugong where sala>=300 and sala<=500等价于select emp sala from yugong where sala between 300 and sala 500
      如果between and 用于字符,则前闭后开;

      26.在数据库中NULL表示什么也没有,不是一个值,在条件查询中,不能用=号连接,用is连接
         例如:select 字段名 from 表名 where sal is null;表示查询工资不存在的员工;

      27.模糊查找:%o%  数据里面含有o的;     s% :找出第一个字符为s的是数据  %t:找出最后一个字符为t的数据;
         _a%:找出第二个字符为a的数据;_下划线表示任意一个字符;%百分号表示零到任意一个字符;

      28.下面是排序语句:select ename,sal from 表名 order by sal desc,ename asc;表示从表中选择ename和sal字段进行排序,且sal进行
          降序,当sal中有相同数据时,在将ename字段进行升序;起决定性作用的是前面的语句;

      29.下面是数据处理函数:

      30.下面讲创建表:创建表的语法:CREATE TABLE tablename
                                    (  columnname dataType(length),
                                       columnname dataType(length),
                                       columnname dataType(length),
                                       .........
                                    );

      31.关于MySQL数据库中的数据类型?
          -VARCHAR (可变长度字符串)
          -CHAR  (定长字符串)
          -INT (整型)
          -BIGING  (长整型)
          -FLOAT  (浮点型单精度)
          -DOUBLE  (浮点型双精度)  DOUBLE(7,2)表示有7位有效数字,保留两位小数;
          -DATE  (日期类型)在实际开发中,为了通用,通常用字符串来表示日期;
          -BLOG  (Binary Large Object 二进制大对象) 存图片,声音和视频;数据库中存放图片是很常见的,
                                                        但是一般不存储大容量的视频,一般是存储它的链接地址;
          -CLOG  (Character Large Object 字符大对象)存储比较的字符串,如4G+的字符串;
          -......

      32.VARCHAR和CHAR的区别:例如  name Varchar(10)  输入jack数据,varchar会动态的分配内存,前提是不超过它指定的长度大小;
         但是CHAR就是底层数据分配十个空间内存;VARCHAR能够节省硬盘的内存,但是效率低,而CHAR相反;
         在实际中,有伸缩性的数据用VARCHAR

      33.建表注意事项;  1)建表最好以 t_开头,可读性好;
                        2)VARCHAR的长度最好是2的倍数,方便存储中文;

      34.CREATE TABLE t_student(
         no INT(10),
         name VARCHAR(32),
         sex CHAR(1),
         birth DATE,
         email VARCHAR(128)
         );

      35.desc t_student;
      mysql> desc t_student;
      +-------+--------------+------+-----+---------+-------+
      | Field | Type         | Null | Key | Default | Extra |
      +-------+--------------+------+-----+---------+-------+
      | no    | int(10)      | YES  |     | NULL    |       |
      | name  | varchar(32)  | YES  |     | NULL    |       |
      | sex   | char(1)      | YES  |     | NULL    |       |
      | birth | date         | YES  |     | NULL    |       |
      | email | varchar(128) | YES  |     | NULL    |       |
      +-------+--------------+------+-----+---------+-------+

      36.删除表格:drop table t_student; 这种方式如果数据库中没有这张表,则报错
                   drop table if exists t_student;  最好采用这种方式,但这种方式是MySQL的特色,其他数据库中没有;

      37.向t_student表格中插入数据
             37.1 向表格中插入数据必须使用insert语句,它属于DML语句;
             37.2 DML语句包括insert delete update(增,删,改);
             37.3 Insert语句的语法格式
                     INSERT INTO tablename(column1,column2,column3....) VALUES(value1,value2,value3,.....);
                     字段和值必须一一对应,数据类型一致,个数相同;
             37.4 向t_student中插入数据
                     INSERT INTO t_student(no,name,sex,birth,email) VALUES(1,'zhangsan','m','2000-10-11','zhangsan@bjpowernode.com');
                     INSERT INTO t_student(no,name,sex,birth,email) VALUES(1,'lisi','m','2003-10-11','lisi@bjpowernode.com');

                        mysql> select *from t_student;
          +------+----------+------+------------+--------------------------+
          | no   | name     | sex  | birth      | email                    |
          +------+----------+------+------------+--------------------------+
          |    1 | zhangsan | m    | 2000-10-11 | zhangsan@bjpowernode.com |
          |    1 | lisi     | m    | 2003-10-11 | lisi@bjpowernode.com     |
          +------+----------+------+------------+--------------------------+

      38.默认情况下,当一张表被创建时,没有指定约束的话,可以为NULL,并且没有指定任何默认值的话,默认值就是NULL;
         每执行一次insert语句,向底层数据添加一行记录,若要修改字段的值,要用update语句;

      39.建议不要省去前面的字段,如省去,则默认的是全部写上,省去之后程序不健壮;

      40.讨论加中文?
            40.1 设置查询结果集为GBK 语句: show variables like '%char%';
                                            set character _set_results ='GBK';
       
             在DOS窗口中插入中文会乱码,因为DOS窗口是GBK编码,而数据库表只接受utf8
             解决办法:使用MySQL Front工具插入数据(MySQL的客户端软件,在实际开发中使用较多)
             
      41.创建表是给字段添加默认值:
          drop table if exists t_student;
          create table t_student(
                  no int(10),
                  name varchar(32),
                  sex char(1) default 'm'
          );
          insert into t_student(no,name) values(1,'jack');
          insert into t_student(no,name) values(2,'lucy');
          select * from t_student;

       mysql>      
       +------+------+------+
       | no   | name | sex  |
       +------+------+------+
       |    1 | jack | m    |
       |    2 | lucy | m    |
       +------+------+------+

        mysql> desc t_student;
      +-------+-------------+------+-----+---------+-------+
      | Field | Type        | Null | Key | Default | Extra |
      +-------+-------------+------+-----+---------+-------+
      | no    | int(10)     | YES  |     | NULL    |       |
      | name  | varchar(32) | YES  |     | NULL    |       |
      | sex   | char(1)     | YES  |     | m       |       |
      +-------+-------------+------+-----+---------+-------+

      42.关于SQL脚本:-该文件是一个普通的文本文档,后缀名为.sql,被称为SQL脚本
                      -在SQL脚本中有大量的SQL语句,想批量的执行SQL语句,可以将这些SQL语句写入脚本文件中,直接执行source执行脚本
                      -若项目中期就职,可能数据库表和表中的记录都已准备好,Team leader会直接给程序员一个sql脚本,直接执行脚本,完成底层数据的初始化,然后开发;
     
      43.获取系统当前时间:mysql> select now();
         +---------------------+
         | now()               |
         +---------------------+
         | 2019-12-26 08:29:57 |
         +---------------------+

      44.语法格式:CREATE TABLE tablename AS SELECT columnname....FROM tablename;
         将查询结果当做一张表创建;

      45.将查询结果插入到表中:select *from emp2;
                               insert into emp2 select *from emp2 where sal=900;
                               select *from emp2;

      46.增/删/改 表结构:DDL语句(不是很重要)-给t_student表格添加一个电话字段
                        ALTER TABLE  t_student ADD VALCGAR(10);
                         -将t_student表格中的tel字段长度修改为20
                        ALTER TABLE t_student MODIFY tel VARCHAR(20);

      47.增/删/改 表中的数据:DML语句(insert delete update)
         mysql> select * from t_student;
       +------+------+------+
       | no   | name | sex  |
       +------+------+------+
       |    1 | jack | m    |
       |    2 | lucy | m    |
       +------+------+------+
       -将sex字段no为2的改为f:UPDATE tablename SET sex='f' WHERE no=2;
       +------+----------+------+
       | no   | name     | sex  |
       +------+----------+------+
       |    1 | jack     | m    |
       |    2 | zhangsan | f    |
       +------+----------+------+
       如果不加条件,则修改全部;
       -将学号为2的学生删除:DELETE FROM tablename WHERE no=2;
       如果不加条件,则将表中数据全部清空
       +-------+-------------+------+-----+---------+-------+
       | Field | Type        | Null | Key | Default | Extra |
       +-------+-------------+------+-----+---------+-------+
       | no    | int(10)     | YES  |     | NULL    |       |
       | name  | varchar(32) | YES  |     | NULL    |       |
       | sex   | char(1)     | YES  |     | m       |       |
       +-------+-------------+------+-----+---------+-------+

    48.什么是约束?为什么使用约束?
        -约束对应的英语单词为:constraint
        -约束实际上就是表中数据的限制条件
        -表在设计的时候加入约束的目的是为了保证表中的记录完整和有效

      49.约束包括哪些?
        -非空约束  not null
        -唯一性约束  unique
        -主键约束  primary key
        -外键约束  foreign key
        -检查约束(目前MySQL不支持,Qracle数据库支持)
        
      50.非空约束 not null约束的字段不能为NULL值,必须给定具体的数据;
         -创建表,给字段添加非空约束
          drop table if exists t_user;
          create table t_user(
              id int(10),
              name varchar(32) not null,
              email varchar(128)
          );
          insert into t_user(id,name,email) values(1,'jack','jack@baidu.com');
          mysql> select * from t_user;
      +------+------+----------------+
      | id   | name | email          |
      +------+------+----------------+
      |    1 | jack | jack@baidu.com |
      +------+------+----------------+
        mysql>  insert into t_user(id,email) values(2,'zhangsan@baidu.com');
        结果:ERROR 1364 (HY000): Field 'name' doesn't have a default value
        如果不给默认值,则为NULL

      51.唯一性约束 unique约束的字段具有唯一性
        //列级约束
        -创建对象,保证邮箱地址唯一
        drop table if exists t_user;
          create table t_user(
              id int(10),
              name varchar(32) not null,
              email varchar(128) unique
          );
        insert into t_user(id,name,email) values(1,'jack','jack@baidu.com');
        insert into t_user(id,name,email) values(2,'lucy','jack@baidu.com');//邮箱一致
        结果:ERROR 1062 (23000): Duplicate entry 'jack@baidu.com' for key 'email'
      //表级约束(有语法错误)
        drop table if exists t_user;
          create table t_user(
              id int(10),
              name varchar(32) not null,
              email varchar(128),
              unique(name,email)
          );
         insert into t_user(id,name,email) values(1,'jack','jack@baidu.com');
         insert into t_user(id,name,email) values(2,'lucy','lucy@baidu.com');
         insert into t_user(id,name,email) values(2,'lucy','jbj@baidu.com');

      //表级约束还可以起名字,以后可以通过这个名字删除约束
        drop table if exists t_user;
          create table t_user(
              id int(10),
              name varchar(32) not null,
              email varchar(128),
              constraint t_user_email_unique unique(email)
          );
      //查询约束名字 (有语法问题)
                      -mysql> use information_schema;
                      -mysql> show tables;
                      -mysql> desc TABLE_CONSTRAINTS;
        +--------------------+-------------+------+-----+---------+-------+
      | Field              | Type        | Null | Key | Default | Extra |
      +--------------------+-------------+------+-----+---------+-------+
      | CONSTRAINT_CATALOG | varchar(64) | YES  |     | NULL    |       |
      | CONSTRAINT_SCHEMA  | varchar(64) | YES  |     | NULL    |       |
      | CONSTRAINT_NAME    | varchar(64) | YES  |     | NULL    |       |
      | TABLE_SCHEMA       | varchar(64) | YES  |     | NULL    |       |
      | TABLE_NAME         | varchar(64) | YES  |     | NULL    |       |
      | CONSTRAINT_TYPE    | varchar(11) | NO   |     |         |       |
      | ENFORCED           | varchar(3)  | NO   |     |         |       |
      +--------------------+-------------+------+-----+---------+-------+
       这张表用来存储约束信息
                      -selecct constraint_name from table_constraint where table_name='t_user';

      52.not null和unique可以联合使用,表示不为空且不能重复;
          create table t_user(
              id int(10),
              name varchar(32) not null unique
          );

      53.主键约束:primary key
           -主键约束
           -主键字段
           -主键值
       关系:表中的某个字段添加主键约束之后,该字段被称为主键字段,主键字段中出现的每一个数据都被称为主键值;
     
      54.给某个字段添加主键约束之后,该字段不能重复,而且不能为空;效果和“not null unique”约束相同,但是本质不同,主键约束除了可以做到“not null nuique”
        
      55.一张表应该有主键字段,若没有,表示这张表无效,“主键值”是当前行数据的唯一标识,“主键值”是当前行
         数据的身份;即使表中的两行数据完全相同,但是主键值不同,就是两行完全不同的数据;

      56.给一个字段添加主键约束,被称为单一主键,给多个字段添加主键约束,被称为复合主键;
         无论是单一主键还是复合主键,一张表主键约束只能有一个;

      57.主键根据性质分:-自然主键:主键值若是一个自然数,这个自然数和当前表的业务没有任何关系,
                         -业务主键:主键值和当前表的业务紧密相关,使用较少;

      58.单一主键列级约束
          drop table if exists t_user;
          create table t_user(
          id int(10) primary key,
          name varchar(32)
          );
          单一主键表级约束(起名)(有问题)
          drop table if exists t_user;
          create table t_user(
          id int(10),
          name varchar(32)
          constraint t_user_id_pk primary(id)
          );

      59.在MySQL数据管理系统中提供了一个自增的数字,专门用来自动生成主键值;
         主键值不需要用户维护,也不需要用户提供,自动生成,默认从1开始递增;
         drop table if exists t_user;
          create table t_user(
              id int(10) primary key auto_increment,
              name varchar(32)
          );
          insert into t_user(name) values('jack');
          insert into t_user(name) values('jack');
          insert into t_user(name) values('jack');
          insert into t_user(name) values('jack');

      60.外键约束-foreign key
          60.1-术语和关系与主键约束雷同,不做讲述,区别在于一张表中可以有多个外键字段
          60.2-分析场景:设计数据库表来存储学生和班级信息,一个班级有多个学生,这是一对多的关系;
          60.3-解决方案:将学生和班级分开,做成两张表
          60.4-学生表  t_student  字段 sno(pk)  sname
               班级表  t_class    字段 cno(pk) cname
          60.5-怎么联系两张表? 在学生表中添加一个字段,但这个字段的值必须来自于班级表,这时候就要给这个字段添加外键约束(foreign key)
          60.6-注意:外键值可以为NULL,外键字段去引用一张表的字段时,被医用的字段必须有unique约束;

      61.级联更新和级联删除
         -添加级联删除和级联添加要在外键约束后面添加
         -在删除父表中数据时,级联删除子表中的数据  on delete cascade
             *删除外键约束  alter table t_student drop foreign key 外键名
             *添加外键约束  alter table t_student add constraint 外键名 foreign key(classno) reference t_class(cno) on delete cascade;        

         -在更新父表中数据时,级联更新子表中的数据  on update cascade
         -谨慎使用,因为级联操作会将数据改变或者删除(数据无价啊!)

      62. 在数据库里边,有空值NULL参与运算,结果还为空;

      下面讲数据处理函数: 1)select lower(字段名) as 新名字 from  tablename; 将查询的结果转为小写
             2)select upper(字段名) as 新名字 from  tablename; 将查询的结果转为大写
             3)select round(rank(),2);将查询到的随机数四舍五入,取两位小数
             4)select substr(字段名,1,2) from tablename;
             5)select columnName from tablename where trim('  lucy  ');去空格键(好像没用,执行不了)
             6)select ename from tablename where ename like'%v%';模糊查找(引申,不是函数)
             7)select length(columnName) from tablename; 查询表中字段值的长度
             8)ifnull(空值处理函数,很重要) select ifnull(name,0) from t_user;  意思为查询name字段的值,碰到有NULL,转为0
             

      63.总结条件查询运算符: 等于: =   不等于:<>或!=   小于、大于、小于等于、大于等于
          两值之间:betwee...and...   为空:is null  并且:and   或者:or   包含:in
          取非:not   模糊查询:like(支持%和_)

      64.关于MySQL中的日期处理:-在每一个数据库处理日期的时候,采用的机制是不一样的,日期处理都有自己的一套机制,所以在实际开发中,表中的字段定义为varchar类型,
         -MySQL数据库管理系统中对日期的处理提供两种函数:
                        1)str_t_date   将字符串(varchar)转化成日期类型(date)
                        2)date_format

     
         -回顾Java中的日期格式:
                    yyyy  年
                    MM  月
                    dd  日
                    HH  时
                    mm  分
                    ss  秒
                    sss 毫秒
         -Java中将字符串转化成 日期类型:
           simpleDtateFormat sdf=new simpleDtateFormat("yyy-MM-dd");
           Date date=sdf.parse("1970-9-8");
         -MySQL日期格式:
                    %Y  年
                    %m  月
                    %d  日
                    %H  时
                    %i  分
                    %s  秒
         -总结:str_to_date函数通常使用在插入操作中。字段时date类型,不接受字符串varchar类型,需要先通过该函数转化。
                例如:str_to_date('10-11-1998','%m-%d-%Y')

      65.date_format: -该函数的作用是将日期类型转化成具有特定格式的日期字符串varchar
          -语法格式:date_format(日期类型数据,'日期格式')
          -案例/查询一张表中的日期以月-日-年的格式显示:select date_format(edate,'%d-%m-%Y') as DATE from t_user;
          -结论:date_format函数主要使用在查询操作中,客户需要以特定格式展示的时候,使用该函数;

      66.下面讲 多行数据处理函数(分组函数):-取得记录数:count  -求和:sum  -取平均值:avg  -取最大:max  -取最小:min
           -注意:这些函数自动忽略空值/不能直接使用在where关键字后面(还没分组呢!)

      67.怎么将查询结果去重? -用distinct关键字 例如:select distinct ColumnName from tablename;
      -distinct关键字只能用在最前边修饰 select distinct ColumnName1,ColumnName2 from tablename;表示字段1和字段2联合起来没有相同的
       
      68.分组查询涉及到的两个子句:  -group by     -having
                1)-order by:表示通过字段进行排序
                  -group by:表示通过字段进行分组
                  -案例:找出每个工作岗位的最高薪水(先按照工作岗位分组,使用max函数求每组的最高薪水)
              代码:select max(sal) from tablename group by job;
                  -注意:若一条DQL语句有group by子句,那么select关键字后面只能跟参与分组的字段和分组函数;       
                  -案例:计算不同部门中不同工作岗位的最高薪水
              代码:select deptno,job,max(sal) from tablename group by deptno,job;意思为这两个字段完全一样时才看成一组;
                 2)
                  -having和where功能都是对数据过滤
                  -where和having后面都是添加条件
                  -having在group by之后完成过滤,where在group之前完成过滤
                  -案例:找出每个工作岗位的平均薪水,要求显示平均薪水大于5677;
               代码:select job,avg(sal) from tablename group by job having avg(sal)>5677;
                  -原则:尽量在where中完成过滤,无法过滤的数据,通常是需要先分组再过滤,这时候使用having。效率问题

       69.一个完整的DQL语句的总结:select ... from ... where ... group by ... having ... order by ...
          -以上关键字顺序不能变,严格遵守
          -执行顺序:from      从某张表中检索数据
                     where     经过某条件进行过滤
                     group by  然后分组
                     having    分组之后不满意在过滤
                     select    查询结果
                     order by  排序输出           

      70.下面讲连接查询(跨表查询):-什么是连接查询? 在实际开发中,数据时存储在多张表中,表之间存在关系,我们在检索是通
         常需要将多张表联合起来取得有效数据,这种多表查询被称为连接查询或跨表查询
         -连接查询根据年代分类:
                        -SQL92
                        -SQL99(更新版)
         -连接查询根据连接方式分类:
                        -内连接
                           *等值连接
                           *非等值连接
                           *自连接
                        -外连接
                           *左外连接
                           *右外连接
                        -全连接(不重要)
         -案例:查询每个员工所在的部门名,要求最终显示员工名和所对应的部门名
         -select e.ename,d.dname from emp e,edep d;
         -在进行多表连接查询时,尽量给表器别名,效率高
         若两张表连接查询时,没有任何条件限制,最终的结果总数是两张表记录条数乘积,这种现象为笛卡尔积现象,所以
         为避免,要添加条件限制;
         代码(内连接中的等值连接):
               SQL92 select e.ename,d.dname from emp e,edep d where ename.deptno=dname.deptno;          
               SQL99 select e.ename,d.dname from emp e join edep d on ename.deptno=dname.deptno;(结构清晰)
         -案例:找出每个员工对应的工资等级,要求显示员工名,工资和等级
         -SQL99(内连接中的等值连接):select e.name,e.sal,s.grade from emp e join salarygrade on  e.sal between s.losal and s.hisal;
         -SQL92: select e.name,e.sal,s.grade from emp e,salarygrade where e.sal between s.losal and s.hisal;
         
         -案例:找出每个员工的上级领导,要求显示员工名以及对应的领导名
         -分析:所有信息在一张表中,可以把这一张表看成是两张表,自连接
         -SQL99:(内连接中的自连接):select a.ename as empname,b.ename as leadername from emp a join emp b on a.mgr=b.empno;
         -SQL92:select a.ename as empname,b.ename as leadername from emp a, emp b where a.mgr=b.empno;

      71.内连接和外连接? -内连接:A表和B表能够完全匹配的记录查询出来
                          -外连接:A表和B表能够完全匹配的记录查询出来之外,将其中一张表的记录无条件的完全查询出来,对方表没有匹配的记录,会自动模拟出NULL与之匹配
       
                外连接案例:找出每个员工对应的部门名,要求部门名全部显示
                 -SQL99代码(外连接中的右外连接/右连接):select e.ename,d.dname from emp e left outer join edep d on ename.deptno=dname.deptno;
                 -这个代码的意思为将join右边的表的dname值全部显示出来,这里outer可以省略;
                 -SQL99代码(外连接中的左外连接/左连接):select e.ename,d.dname from emp e left outer join edep d on ename.deptno=dname.deptno;
                 -这个代码的意思为将join左边的表的dname值全部显示出来,这里outer可以省略;
                 -inner和outer可以省略,但是加上去可读性高

      72.多表连接语法格式:select xxx from a join b on 条件 join c on 条件;
         原理:a表与b表连接,a表再与c表连接;

      73.子查询:select语句的嵌套
         -案例:找出薪水比公司平均薪水高的员工,要求显示员工名和薪水
         -解题第一步:找出公司的平均薪水  select avg(sal) from emp;
         -解题第二步:找出薪水大于平均薪水的员工信息  select ename,sal from emp where sal>上面计算的值;
         -合并:select ename,sal from emp where sal>(select avg(sal) from emp);(实现了select的嵌套,子查询)
     
      74.union:合并集合
         例如: select ename,job from emp where job='engineer';
                union
                select ename,enpno from emp where job='teacher';
            -要求字段的数量相同,早oracle中语法更加严格,要求数据类型也要相同;

      75.limit:-用来获取一张表中某部分数据
               -只有在MySQKL数据库中存在,是MySQKL数据库的特色
               -尽量别用,不通用
               案例:找出员工表中的前五条记录:select ename from emp limit 5;
               -此代码中‘limit 5’中5表示从表中记录下标0开始,取5条,等价于:select ename from emp limit 0,5;
               -limit语法:limit 起始下标,长度 若没指定起始下标,默认从0 开始;

      76.MySQL中通用的分页SQL语句:
           要求每页显示3条记录:第一页:0,3  第二页:3,3  第三页:6,3.....
           第pageNo页:(pageNo-1)*pageSize,pageSize
           代码:select ename,sal from emp order by sal desc limit (pageNo-1)*pageSize,pageSize;(只限于MySQL)

      77.存储引擎:是MySQL数据库管理系统特有的功能,提供给程序员存储数据的方式
         -三个常用的存储引擎:Engine: MEMORY  Engine: MyISAM  Engine: InnoDB
         -查看存储引擎的代码:show engnesG;
         -选择合适的存储引擎:MyISAM适合大量的数据读而少量的数据更新
              如果查询中包含较多的数据更新操作,用 InnoDB
              MEMORY来存储费永久需要的数据

      78.事务(很重要) -什么是事务?对应的英语单词:transaction  一个最小的不可再分的工作单元
         -通常一个事务对应一个完整的业务,而一个完整的业务需要批量的DML语句共同联合完成
         -DML语句才有事务,DML语句的条数和业务逻辑有关系
         -关于银行账户转账操作:
               t_act(账户表)
            actno           balance
            act-001         50000
            act-002         10000
               update t_act set balance=40000 where actno='act-001';
               update t_act set balance=20000 where actno='act-002';
          以上两条代码要求同时成功或同时失败,意思是当第一条语句执行成功后,并不能将底层数据修改,只是在内存中修改,等第二条
          语句执行成功后,才修改底层数据
          若第二条执行失败,则清空所有历史操作记录(借助事务)

      79.事务的四个特性:-原子性 事务是最小的工作单元,不可分割
         -一致性  事务要求所有的DML语句同时成功或同时失败
         -隔离性  事务之间具有隔离
         -持久性  是事务的保证,事务终结的标志

      80.关于一些术语:-开启事务:start transaction
         -事务结束:end transaction  提交事务:commit transaction  回滚事务:rollback transaction

      81.和事务有关的重要SQL语句(TCL):commit:提交  rollback:回滚

      82.事务开启的标志和事务结束的标志是什么?
         -开启的标志:任何一条DML语句执行
         -结束的标志:提交(将历史操作和底层数据同步)或者回滚(清空历史记录)

      83.在MySQL数据库管理系统中,事务的提交与演示
            -在MySQL中,默认情况下,事务是自动提交的
            -关闭自动提交的第一种方式
                 start transactiom;(手动开启事务)  -rollback;(手动回滚事务)  - commit;(手动提交事务)
            -关闭自动提交的第二种方式
                 查看变量值:show variables like '%commit%';  打开自动提交:set autocommit =off;/set session autocommit=off;

      84.事务的隔离性: -read uncommitted 读未提交  -read committed 读已提交  -repeatable read 可重复读  -serializable 串行化
          -read uncommitted 读未提交:事务A未提交的数据,事务B可以读取到,B读取到的数据叫‘脏数据’/drity read;(最低级别隔离)
          - read committed 读已提交:事务A提交的数据,事务B才能读取到(隔离级别高于上),可避免‘脏数据’,会导致不可重复读取
                这是oracle默认的隔离级别
          -repeatable read 可重复读:事务A提交的数据,事务B读取不到,事务B可重复读取已缓存的数据,达到可重复读取(例如银行月总账),会导致‘幻想读’
                这是MySQL默认的隔离级别
          -serializable 串行化:数据A在操作数据库表中数据时,事务B只能排队等待,这种隔离级别很少用,级别太高,但是吞吐量太低,用户体验不好
              意思是事务A和事务B是排队执行,不是并发;
         
      85.设置事务的隔离级别:1)第一种方式:修改my.ini配置文件   
         2)使用命令设置事务的隔离级别:命令的格式:set transaction level <isolation-level>;
            可选值:-read uncommitted   - read committed    -repeatable read   -serializable

      86.隔离级别的作用范围:-全局级:set global transaction level <isolation-level>;
                             -会话级:set session transaction level <isolation-level>;
                             -默认(会话级):set session transaction level <isolation-level>;

      87.查看隔离级别:-查看当前会话:select @@tx_isolation;  select @@session.tx_isolation;(有问题)
                      -查看全局:select @@global.tx_isolation; (有问题)


      88.索引(了解)Index:-作用是提高程序的检索效率
         -主键自动添加索引,所以能够通过主键查询尽量用主键查询,效率很高
         -索引和表相同,都是一个对象,表是存储在硬盘文件中的,索引是表的一部分
         -在Mysql数据库管理系统中,对表的记录进行检索时,包括以下几种检索方式:
              1)全表扫描
                 假如有一张员工表:select * from emp where ename='king';
                 若没有索引,ename字段全部扫描
              2)通过索引检索(提高查询效率)
         -什么情况下适合添加索引? -该字段数据量庞大  -该字段很少的DML操作  -该字段经常出现在where条件当中;
         -怎么创建索引? create index dept_dname_index on dept(dname);
         -怎么删除索引? drop index dept_dname on dept;

      89.视图;可以隐藏表的实现细节(在实际开发中客户不希望暴露表的具体数据)
         create view myview as select * from emp;

      90.DBA命令:(看看就行,不用记,记住常用的增删查改就行)
           -修改密码:use mysql;  select * from user;  update user password= password('qwe') where user='p890';
                   flush privileges;

           -新建用户:create user username identified by'password';

      91.数据库设计三范式:1)要求有主键,并且要求每个字段原子性不可再分
         2)要求所有非主键字段完全依赖主键,不能产生部分依赖
         3)所有非主键字段和主键字段之间不能产生传递依赖

       

     92.下面还有10节事务和30道练习题

  • 相关阅读:
    【转】 mysql反引号的使用(防冲突)
    【百度一键分享功能】百度一键分享插件
    【WEB2.0】 网页调用QQ聊天(PC+M站)
    python : takes 0 positional arguments but 1 was given
    python : 设计模式之外观模式(Facade Pattern)
    Tosca : 扩展dll动态语言 识别点击下拉, 识别成table
    Tosca : 把 inner text 放到变量里,定义变量,使用变量
    Tosca:键盘输入字符串
    Tosca 给定义变量,取内容放到变量里
    Tosca :配置环境参数
  • 原文地址:https://www.cnblogs.com/1877chl/p/12100351.html
Copyright © 2011-2022 走看看