MYSQL

1.什么是SQL

       结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统

2.SQL的分类

    SQL一共分成四类,如下所示:
       数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等,例如创建、删除、修改:数据库、表结构等;
       数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新,例如:增、删、改表记录;
       数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户;
       数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。
       特别说明:DDL是对数据库或表的结构进行操作,而DML是对表的记录进行操作(增、删、改)。以上四个分类,我们以后最常用的就是DDL、DML、DQL,其中,DQL是难点。

 

3.SQL的语法

       SQL语句可以单行或多行书写,以分号结尾;
       可使用空格和缩进来增强语句的可读性;
       MySQL数据库的SQL语句不区分大小写,建议使用大写,例如:SELECT * FROM user。

对应关系:

类-------表
类中属性-------表中的字段
对象--------记录。

mysql中数据类型:我们使用java的数据类型与mysql数据类型对比总结
            基本类型
                    byte-------TINYINT
                    short------SMALLINT
                    int -------INT
                    long-------BIGINT                    
                    float------float
                    double-----double                    
                    char
                    boolean----bool boolean 一般情况下直接使用数值类型来描述,直接使用int
                字符串
                    String   char  varchar
                    数据库中字符必须指定长度            
                    
                时间日期
                    java.sql.Date------Date datetime
                    java.sql.Time------Time
                    java.sql.Timestamp----Timestamp

 

创建数据库
        1.使用默认的字符集与校对 
        create database 数据库名;
        2.可以指定数据库字符        
        create database 数据库名  CHARACTER  set gbk;
        3.可以指定数据库字符与校对
        create database 数据库名 character set 编码 COLLATE 校对

查看数据库
        查看当前数据库服务器下所有数据库
        show databases;                
        查看创建数据库的语句
        show create database 数据库名;                

修改数据库
        修改数据库的编码集
        alter database 数据库名称  character set 编码 collate 校对
删除数据库
        删除数据库
        drop database 数据库名
其它关于库的操作
        1.切换数据库
         use 数据库名称
        2.查看当前所使用的事数据库
        select database();
char与varchar区别?
        char是一个定长字符串.指定长度不会随着内容的不足而改变
        varchar是一个可变长度的字符串,它根据信息自动改变长度.(只在字符串长度小于指定长度情况下)
 

 

创建表与约束

1.创建表
1.创建表---使用默认的字符集与校对
                create table 表名(
                    字段1 类型,
                    字段2 类型,
                    .....
                );
                
2.创建表--指定字符集与校对
                create table 表名(
                    字段1 类型,
                    字段2 类型,
                    .....
                ) character set 字符集  collate 校对;
表名后面的内容需要使用“()”括起来,里面的内容是表结构,由列名和列类型组成,列名与列类型之间用空格隔开,每一列之间用逗号隔开,最后一列后面不需要加逗号,语句结束后需要加“;”。

2.约束
它是用于限定表中字段。                
    5种约束(注意:数据库中一共有六种约束,而mysql只支持五种)    
①主键约束
        主键是用于标识当前记录的字段。它的特点是非空,唯一。        
        在开发中一般情况下主键是不具备任何意义,只是用于标识当前记录。
        创建主键:
            1.在创建表时,在字段后面加上  primary key.
            create table tablename(                        
                id int primary key,
                .......
            )
            2.也可以表创建的最后来指定主键                                                                create table tablename(                        
                id int,
                .......
                primary key(id)
)
            3.删除主键:alter table tablename drop primary key ;    

②唯一约束
        某一列的值不为重复可以使用唯一约束.    unique  
③非空约束
        not null
④默认值约束
        default 值
⑤自增约束

        auto_increment;

扩展:
        mysql : auto_increment 自动增长
        sqlserver: identity(1,1)
        oracle:sequence序列


查看表
查看表结构
        desc 表名;
查看当前数据库下所有表
        show tables;                
查看表的字符编码集
        show create table 表名;

修改表
修改表的结构语法格式:alter table 表名 关键字 ….;                    
        关键字有以下几个:
            1.add----添加列操作   alter table 表名  add 列名 类型;
            2.modify--修改列的类型 alter table 表名  modify 列名  类型;
            3.drop --删除列  alter table 表名  drop 列名.
            4.change--修改列名称  alter table 表名 change 旧列名  新列名  类型;
        
修改表的名称
        rename table 旧表名 to 新表名;
                    
修改表的字符编码集
        alter table 表名 character set 字符集;


 

记录操作-insert操作
            插入所有列值
                insert into 表名(列名1,列名2, ...) values(列值1, 列值2, ...);
                表名后面是当前表中所有字段名称    
            插入部分列值
                :    insert into 表名(列名1,列名2) values(列值1, 列值2);
                    表名后面是当前表中部分字段名称
            不指定列名
                :    insert into 表名 values(列值1, 列值2, ...);

注意事项:
没有给出要插入的列,那么表示插入所有列;
值的个数必须是该表的列的个数;
值的顺序,必须与表创建时给出的列的顺序相同。
插入操作注意事项
插入的数据应与字段的数据类型相同
数据的大小应该在列的长度范围内
在values中列出的数据位置必须与被加入的列的排列位置相对应。
.除了数值类型外,其它的字段类型的值必须使用引号引起。
如果要插入空值,可以不写字段,或者插入 null.                    
注意:对于自动增长的列在操作时,直接插入null值即可.

记录操作-update操作
            下面语句会将指定字段的值全部修改
                update 表名 set 字段名称=值;
            如果要修改多个字段
                update 表名 set 字段1名称=值 ,字段2名称=值,...;
                    
            以上方式,进行修改,会将表中这个字段所有值都修改.
            在实际开发中,对于修改操作,都是有条件修改.
                update 表名 set 字段=值 ,... where 条件.

记录操作-delete操作
            delete操作是删除数据.
                格式  delete from 表名.
                    这会将表中所有数据删除。在开发一般情况下有条件删除
                        delete from 表名 where 条件.

关于删除表与删除表数据区别:
                        
                        1.删除表   drop table 表名
                        2.删除表中记录    
                            1.delete from 表名
                            2.truncate table 表名
                            
关于delete 与truncate的区别?(笔试题)
                        
                        1.delete是一行一行删除   truncate是将表结构销毁,在重新创建表结构.
                            如果数据比较多,truncate的性能高。
                        
                        2.delete是dml语句  truncate dcl语句    
                            
                            delete是受事务控制. 可以回滚数据.
                            truncate是不受事务控制. 不能回滚.

 

记录操作-编码问题
            下面我们向user表中插入一条记录
            insert into user(username,password) values(‘张三’,’123’);        
            当执行这条sql时,会报错
            ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'username' at row 1
             
原因:
      因为mysql的客户端编码的问题我们的是utf8,而系统的cmd窗口编码是gbk
解决方案(临时解决方案):
                    修改mysql客户端编码就可以。
                    
命令行:show variables like 'character%'; 查看所有mysql的编码

                    在图中与客户端有关的编码设置:
                        client connetion result 和客户端相关 、
                        database server system 和服务器端相关 
                    
                    将客户端编码修改为gbk.
                    
                    set character_set_results=gbk; / set names gbk;
                    以上操作,只针对当前窗口有效果,如果关闭了服务器,失效。
                    
如果想要永久修改,通过以下方式:
                     在mysql安装目录下有my.ini文件,修改其中的配置
                     
                        default-character-set=gbk 客户端编码设置                        
                        character-set-server=utf8 服务器端编码设置
                    注意:修改完成配置文件,重启服务


记录操作-select基本查询
            查询指定列
                 select 字段 from 表名;
                    查询指定字段信息,如果要查询多个字段
                 select 字段1,字段2,...from 表名;                        
            查询所有列
                select * from 表名;
                    查询表中所有字段.
                    注意:使用"*"在练习,学习过程中可以使用,在实际开发中,不建议使用。        
            去掉重复记录
                select distinct 字段 from 表名;                
                distinct它的作用是去除重复.
            使用别名                
                使用as 别名可以给表中的字段,表设置别名.
            在查询中可以直接对列进行运算
                我们在sql操作中,可以直接对列进行运算。
            ifnull函数使用
               在对数值类型的列做运算的时候,如果做运算的列的值为null的时,运算结果都为null,为了解决这个问题可以使用ifnull函数
            
记录操作-where子句    
            格式 :select 字段  from 表名  where 条件;                
                where条件种类:                    
                    1.比较运算符
                        > >= < <= = !=(<>)
                    2.逻辑运算符
                        and  or not                        
                    3.between ...and
                        相当于 >= and <=                        
                        注意:between 后面的值必须是小值 and后面的是大值                        
                    4.in
                        可以比较多个值                        
                    5.like 
                        模糊查询
                        通配符使用:
                            1.% 匹配多个
                            2._ 匹配一个                            
                    6.null值操作
                         is null; 判断为空 
                         is not null; 判断不为空
记录操作-order by排序
       在开发中,我们从数据库中查询出的数据经常需要根据某些字段进行排序,可以使用order by关键字,后面跟的就是要排序的列
order by 子句是select的最后的一个子句。                
       asc 升序 (默认)
       desc 降序
记录操作-聚合函数
       之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。
       今天我们学习如下五个聚合函数:
              count:函数中除了null都可以。用作计数。
              sum:如果指定列类型不是数值类型,那么计算结果为0。用作求和。
              max:如果指定列是字符串类型,那么使用字符串排序运算;用作求最大值。
              min:如果指定列是字符串类型,那么使用字符串排序运算;用作求最小值。
              avg:如果指定列类型不是数值类型,那么计算结果为0;用作求平均值。

记录操作-分组操作
       分组查询是指使用group by字句对查询信息进行分组,例如:我们要统计出products表中所有分类商品的总数量,这时就需要使用group by 来对products表中的商品根据category进行分组操作.
       分组后我们在对每一组数据进行统计。
       分组操作中的having子名是用于在分组后对数据进行过滤的,作用类似于where条件。

笔试题: having与where的区别:                
                1.having是在分组后对数据进行过滤.
                  where是在分组前对数据进行过滤
                  
                2.having后面可以使用分组函数(统计函数)
                   where后面不可以使用分组函数。

在SQL语言中,第一个被处理的子句是from字句,尽管select字句最先出现,但是几乎总是最后被处理。
 

 

  外键约束: foreign key

  - 给product中的这个cno 添加一个外键约束

    alter table product add foreign key(cno)  references  category(cid);

 

建数据库原则:

  - 通常情况下,一个项目/应用建一个数据库


多表之间的建表原则

  一对多 : 商品和分类

    建表原则: 在多的一方添加一个外键,指向一的一方的主键

      ​

多对多: 老师和学生, 学生和课程

    建表原则: 建立一张中间表,将多对多的关系,拆分成一对多的关系,中间表至少要有两个外键,分别指向原来的那两张表

    ​

 一对一: 班级和班长, 公民和身份证, 国家和国旗

建表原则:  

      ① 将一对一的情况,当作是一对多情况处理,在任意一张表添加一个外键,并且这个外键要唯一,指向另外一张表
      ② 直接将两张表合并成一张表
      ③ 将两张表的主键建立起连接,让两张表里面主键相等

当一个对象有简略和复杂两种情况的时候,使用一对一的表。

      ​

交叉连接查询  笛卡尔积
SELECT * FROM product;
SELECT * FROM category;

笛卡尔积 ,查出来是两张表的乘积 ,查出来的结果没有意义
SELECT * FROM product,category;

过滤出有意义的数据
SELECT * FROM product p,category c WHERE p.cno=c.cid;


数据准备
INSERT INTO product VALUES(NULL,'耐克帝',10,NULL);

内连接查询
-- 隐式内链接
  SELECT * FROM product p,category c WHERE p.cno=c.cid;
-- 显示内链接
  SELECT * FROM product p INNER JOIN category c ON p.cno=c.cid;    
-- 区别:
    隐式内链接: 在查询出结果的基础上去做的WHERE条件过滤
    显示内链接: 带着条件去查询结果, 执行效率要高

左外连接
  左外连接,会将左表中的所有数据都查询出来, 如果右表中没有对应的数据,用NULL代替
  SELECT * FROM product p LEFT OUTER JOIN category c ON p.cno=c.cid;

- 准备工作
  INSERT INTO category VALUES(100,'电脑办公','电脑叉叉差');
右外连接: 会将右表所有数据都查询出来, 如果左表没有对应数据的话, 用NULL代替
  SELECT * FROM product p RIGHT OUTER JOIN category c ON p.cno=c.cid;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值