初识数据库(SQL/DDL/DML/DQL/约束)

1.SQL简介

SQL:Structured Query Language  的缩写(操作关系数据库中的数据)
中文名称:结构化查询语言
作用:是一种定义、操作、管理关系数据库的句法。大多数关系型数据库都支持。
结构化查询语言的工业标准由ANSI(美国国家标准学会,ISO的成员之一)维护。
组成:
DDL:数据定义语言
DML:数据操作语言
DCL:数据控制语言
DQL:数据查询语言(sql最难的部分就是查询)

数据库管理软件  可以帮我们隔离具体的物理数据存储的方式,通过逻辑结构,来操作物理数据。
          即我们操作的都是  二维表所有的数据都是以二维表的形式存在
那么二维表是如何组织起来的呢?
        一个数据库管理软件中,可以存在多个数据库;一个数据库类中可以有多个二维表。
        通过二维数据表,将数据库的数据组织起来

区分两个概念:
        数据库管理系统:用于管理数据的软件和工具。
        数据库系统:上层应用,数据库管理系统,数据,DBA(database administer)

数据库管理软件 工作过程 简介,见图:


            

常用的数据库(软件)

    Oracle(只做数据库和数据服务) / DB2(IBM)/ informix(专注于数据库中的事务处理)
    / Sybase(发明了一个power desgin,辅助软件)/ SQLServer2000,2005 /
    MySQL(开源免费) / Access(office中) / SQLite(Android)等


MySQL 的安装和配置:

    5.5版本要设置两个目录:服务的安装目录,数据的安装目录(Innodb)
    此目录需要记住
    还要记住root的账号密码。
    见教程。


数据库服务器、数据库软件、数据库和表的关系:

1.所谓安装数据库服务器,只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每       一个应用创建一个数据库。
    为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。  
2.一个user对象的数据,在表中可能就是一行数据记录(bean类),一行中有多列。
    表与表之间的区别就在于:表结构的不同,即每个表所对应的数据的 属性的  个数/属性名/类型等不同
    DDL语言就是用来定义表的结构的(增加、删除一列或者一行)。


MySQL常见数据类型:

VARCHAR、BLOB和TEXT类是变长类型。每个类型的存储需求取决于列值的实际长度。

在整数类型中,我们要注意bit类型bit类型,是指位类型,bit(M),表示数据用多少个二进制位来表示

范围:




DDL语言

Data Definition Language

概述:

作用:
    用于描述数据库中要存储的现实世界实体的语言。即创建数据库和表的结构  管理数据库和表的结构。
创建/管理 :数据库(的操作)  和  表结构(增删改查).

常用关键字:
CREATE   ALTER   DROP


使用流程:

1.进入数据库:cmd 打开DOS窗口,输入mysql -uroot -p密码

2.会跳转到 mysql>
对数据的操作:

3.查看数据库软件中所有数据库: show databases;

4.创建一个数据库mydb1 : create database mydb1;

    创建时加入额外信息: 
                                //创建使用指定字符集的数据库:
                                create database mydb1 character set gbk;
                               //创建一个带有校对规则的指定字符集的数据库:
                              create database mydb1 character set gbk collate gbk_chinese_ci;

5.查看数据库:
            show databases ; ——查看当前服务中有哪些数据库。
            show create database mydb2; —— 查看之前创建的数据库的基本信息

6.修改数据库:
对数据库的修改:
            只能修改 字符集 和 校对集。
         alter database mydb2 character set utf8;

7.删除数据库:
        drop database mydb3; ——删除之前创建的数据库。

对表的操作:

首先表长什么样子?

            ------------------------------------------------------
            Field    |  type            | Null  | Key  | Default |  Extra |
              id       | int(11)         | YES   |         |  NULL   |            |
              name |varchar(30)  | YES   |         |  NULL   |            |
            ------------------------------------------------------

基本语法:create table

1.创建数据表:

    先创建一个数据库
            create database sql01;
            use sql01;    进入这个数据表
            显示当前处在哪个数据库: select database();
        
      1.  向表中添加数据:
            create table t_employee(id int, name varchar(10),gender varchar(3), birthday date, entry_data date,
                resume text);

      2.加入到数据表中
            insert into t_employee value(97);
            select keng from t_employee; 默认的取出方法
        //取出一个a;
        select keng+0 form t_employee;

        //取出一个97;

        select oct(keng) form t_employee;取出97的八进制表示
        select hex(keng) from t_employee;取出97的十六进制表示

       
        显示表:
            ****显示全表:desc t_employee;


显示数据表中添加的所有项目的信息:


2.修改表结构:alter table ....

            添加一列:add
                alter table t_employee add 列名 类型;
                alter table t_employee add image blog;

            
            修改一列的长度为60:modify
                alter table  t_employee  modify  Field列的属性名  varchar(60)
                (只能修改列的数据类型,不能修改其列名Field)
                eg. alter table t_employee modify name int;
            
            删除某一列:drop

                later table t_employee  drop  image;
                
            修改表名:rename
                rename table t_employee to user;(重新命名表,为user)
                
            查看一个数据库中有多少张表:
                show tables;
                
            设置表的字符集:character set gbk;
                alter table user character set gbk;
                (一般直接设置set names gbk;就行了)

          
           修改列名:change
                alter table user change 列名 新列名 新数据类型;
                alter table user change name username varchar(20);

            
            设置默认值:default
                alter table 表名 modify 列名 对应的类型 default '修改的默认值';
                alter table user modify username varchar(20) default ''; //设置username的Type属性为空串






DML语言和DQL语言:

这两个语言需要放在一起配合使用:

        作用:操作表中数据。(DQL专门进行数据查询)

1.DML:Data Manipulation Language

作用:
            用于向数据库表中插入、删除、修改数据。

常用关键字:
        INSERT 、UPDATE 、 DELETE(insert,update,delete)

在修改表结构的时候,修改的是某一列。而表中的数据是以行为单位的。
    DML 则是以行为单位进行数据修改。

DML语句基本操作:

插入数据:insert
        可以选择在一行中的某几个位置插入数据,其他位置会自动补null;
        数据类型要相同,长度不能超过原本的长度。
        字符串和日期型数据应该包含在单引号中。
        可以插入null;

        语句:insert  into table(column1,column2,...)  value(value1 , value2,....)

eg.   create table employee(id int,name varchar(20),sex bit,birthday date,...);
        //创建所有属性列,并给每个属性列创建值,

        insert into employee(id,name,sex,birthday,...)values(1,'zs',0,'2000-01-01');  
        //如果所有数据都要初始化的话,可以简便写法:
        **insert into employee(id,name,sex,birthday,...)values(1,'王五',1,'1999-01-01');    
        插入时还可以:
            insert into employee values(1,'lisi',1,'1999-01-01'),(2,'zs','1999-02-03'),(...);
            (不过这样是默认对这一行的每一个属性列都进行插入)

        但是————会报错,因为编码的问题,见后面,这里需要设置 set names gbk; 就可以解决这个问题了;

修改(更新)表中数据:update
        将id 修改:(所有行/特定行)
        1.update employee set id=10; —— (没有where指定行)则会修改 id 所在列的所有元素,都改为10;
        2.update employee set id=10 where name='zs'; ——指定了行(where),修改其原本的id为10;
                                        (where 某行的属性键值对)
                                        类比:java中的name.equals("zs")
        3.在原有基础上加减
            update employee set id=id+10 where name='zs';
    
 删除表中数据:delete
        删除的单位是:行
        delete from employee where id=1;     //删除定位的行
        delete from employee;      //不使用where,直接删除这个表中所有数据
        它只能删除表中数据,不能删除表本身,如果要删除表,要使用drop table

    


DQL语句:

    
1. select语句:
        基本select语句:
            查询表中所有列:select * from 表名;
            (*相当于一个通配符,可以选择某几行属性来输出,select   name,id,..   from student;)
            查询表中某些属性列的值: select 属性列1,属性列2 * from 表名;
            在查询时 过滤 表中重复数据:select distinct * from 表名;
            
            可对 列通过 表达式进行运算:
            select name,math+10 from 表名;  //对math列的所有值都加了10
            
            查询成绩的总分:
            select name,chinese+english+mash from 表名;
            但是列的名字叫:chinese+english+mash
            可以通过起别名的方式: as 别名
            select name,chinese+english+mash as score from 表名;
            
            查询某个姓名为李的信息:
            select * from 表名 where name like'李%';
            

在where中经常使用的操作符:

                1.like  :   模糊查询
                      Like语句中,pattern  为 % 代表零个或多个任意字符,_ 代表一个字符,
                        例first_name like ‘_a%’;
               
                2.between  and   :  表示数据在某一个区间范围内(闭区间)。
                    select * from 表名 where id between 80 and 100;
                
                3.isnull:   如果表中数据有null时,那么在向找到某个属性值是否为null,不能通过=null,而是isnull;
                    select * from 表名 where id isnull;
                    
                4.in(set)    表示判断属性值是否在集合中存在。
                    select * from 表名 where math in(55,77,100);找出具有这几个元素的行。
                    
                5.逻辑运算符: and / or / not
                    and : 表示多个条件同时成立
                    or: 表示其中一个条件成立的;
                    not : 不成立(where not(salary > 1000))
                                (select name from student where math not in(50,70));
                                —— 表示math的成绩不是50和70的学生的姓名;
    

              6.关系运算符:< > =  <= ..  不等于:<>


            查询的过程:
                
通过筛选满足条件的数据,然后将这些数据放在一张临时表中,显示出来。
                    重命名也是在临时表中进行重命名。
                eg. select name,math+chinese from 表名 as score where score>100;//这样找不到socre
                那么就要用到 order by :
                    select name,math+chinese as score from 表名 order by socre;
                基本语法:select * from table where ... order by column1 desc(ASC是默认,升序,DESC为降序), column2 asc(desc), column3 asc(desc)...;
                (实现同一个表下的多种排序)



mysql的中文乱码:

        查看所有地方的字符编码:show variables like 'character%'
        确定字符编码的地方一共有六处:client——>connection——>数据库服务器内部(database/)——>results
        内部字符集不会出错,则只需要关注 client、connection、results
        但是还需要注意:客户端(console命令行)只支持GBK,编码模式。
    ****做法:
        set names gbk;(将client/connection/result的编码格式改为gbk)只要这三个编码一致,就不会出现乱码
        查看mysql所使用的字符集:show variables like 'character';
        set character_set_result=utf8;设置某一个的字符集:中文就会出现乱码;
        (转换流程见下图):

       


约束

概述:   

约束作用:
  (1)定义规则
  (2)确保完整性:包括数据的精确性、可靠性。以确保数据不会出错,或者尽量减少出错。

约束的类型:
  (1)非空约束
  (2)主键约束
  (3)外键约束(右外键约束)(左外键约束)
  (4)唯一约束
  (5)检查约束

1.数据完整性约束:

    数据完整性是为了保证插入到数据中的数据是正确的,它防止了用户输入的错误。
    
    1.实体完整性(唯一性)
        规定表中的一行记录在表中是唯一的实体,通过表的  主键  来约束。
        主键:一个或多个  可以唯一表示  一个实体的属性或属性集合。(如果不能在本列中唯一,则不是主键)
        tid(主键)   name  age  (name也可能重名,所以不能作为主键)  
          1              'zx'   18
          2              'lisi' 18
        
    设置主键约束:
        1.primary :
            primary id int primary key;
    
    主键有两层含义:
        1.实体存在:
            不能给主键设置为null,因为这样就表示这个记录不存在,那么就没有意义。
            
        2.实体在表中唯一:
            如果没有设置主键约束,那么可以随意向表中添加  重复记录。
            如果设置了主键,那么表中如果再插入同样的记录,则不会插入成功。
            
            

2.域完整性约束:

        指数据库表的列(即字段)必须符合某种 特定的数据类型 或 约束
        not null; //非空约束 : 字段名 数据类型 not null;
        unique; // 唯一性约束 :字段名 数据类型 unique;
        设置了某列的两个约束 not null unique的时候,那么相当于给此列变成主键;
                
        ***一个表中可以有多个unique声明,但是只能有一个主键primary key 声明。
        

3.参照完整性约束(外键):

        
        在显示生活当中,存在很多实体,实体之间存在着联系。
        在数据库中通过表的实体数据的引用 在关系表中表示他们之间的关系。
        
        在一个数据库中:
            有两个实体表(主键表)(学生表,选课表),和一张关系表(选课表),可以表示不同学生的选课的信息。
            在关系表中,如果,一个学生选择了一个不存在的课程,或者一个不存在的学生,选择了一个存在的课程,这些都是不合理的数据。
            
       在参照完整性中,你所引入的必须是存在的实体数据。
                    课程表(sid)          |                   学生表(tid)                 |      (关系表)选课表
            classid(主键)   name   |   studentid(主键)   name   age   |    classid    studentid   score
                1            java           |            1                   'zs'      18    |       1                2              100
                2            c++           |         2                   'lisi'      20     |       1               1               80
                                                                           3(这就是一个不存在的数据项)
                也就是说在进行inter into 关系表 values(3,1,90);将无法插入,因为3无法在对应的主键中找到列表项。
                但是insert into 关系表 values(1,1,100);可以插入。
                
      添加参照完整性约束的语法:
            (学生表 :create table st(sid int premary key;)
             课程表 :create table coures(tid int )
            create table cs(ssid int,ttid int,score int,
                            constraint sid_st_fk foreign key(ssid) reference st(sid); //引用了外界的sid,
                            constraint tid_course_fk foreign key(ttid) reference course(tid);
                            )
     外键约束的语法:
                constraint 外键名 foreign key(字段名1,字段名2..) reference 主表名(主键列1,主键列2,...);
                    外键名:定义的外键约束的名称,一个表中不能有相同的外键名;
                    字段名:表示子表需要添加外键约束的字段列;
                    主表名:表示被子表外键所依赖的表的名称(主键所在的表);
                    主键列:表示主表中定义的 主键列或列组合;
                
     什么是外键?
                首先它是表中的一个字段,,它可以不是本表的主键,但对应另外一个表的主键。
                作用:外键用来保证数据引用的完整性
                

2.多表设计        

    主键可以是一个组合(所有设置了主键的属性就是主属性,主属性不能为null)
    
多对多关系:
    例如学生选课:
    一个学生可以选择多门课;多门课可以被多个同学选择
    
    现在要存储选课学生的数据:
    tid(主键) | name  |  pointdis(主键)  |  name  |  age
        1         |  java   |      2                    |   zs       |  18
        1         |   c       |      1                   |   zs       |  18
        2         |   c       |      2                   |   lisi     |  20
    有几个异常:
        插入异常
            有些学生还没有选课,那么他在选课表中没有数据,那么就加入不进
            
        删除异常:
            删除几个选课信息之后,发现某些课程没了
            
        更新异常:
            修改一个名字,需要修改相关的所有学生的姓名(同一个数据需要修改很多次)
            
    解决方案:将所有数据分散到不同的表当中,那么修改相应的主键属性就可以达到目的了。
    (消除数据的冗余)            
    将 多对多的关系:
        放入多张表中存储:三张表中两张实体表,一张关系表
    

一对多的关系:
    例如:一个学生和所在的省份
            一个省可以包含多个学生,一个学生只能选择一个省份
    
    两种存法:
        1.也是三张表,省份一张表,学生一张表,关系一张表
        2.两张表:一张存省份(多的实体),一张存学生(一的实体),并有一个外界引用 prevince_id
        
一对一的关系:
    一表即可。
    

多表设计的规范:
    范式等。




















猜你喜欢

转载自blog.csdn.net/qq_38962004/article/details/80290449