正经人z
菜鸟一个!

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 engnes\G;
     -选择合适的存储引擎: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道练习题

93.一张表可以有多个主键,但是只能有一个外键,外键的作用是保持数据的一致性和完整性,它是数据库中的一个完整性约束,不是必须!

posted on 2019-12-26 09:32  正经人z  阅读(332)  评论(0编辑  收藏  举报