黑马程序员技术交流社区

标题: [石家庄校区]MYSQL的学习笔记 [打印本页]

作者: 账号随机生成    时间: 2018-5-9 15:36
标题: [石家庄校区]MYSQL的学习笔记
MYSQL的学习笔记
MySQL概述
1  .什么是数据库


就是一个文件系统,通过标准的SQL访问;
2 .什么是关系型数据库


存放的是实体和实体之间的关系
SQL结构化查询语言


(一)SQL对数据库操作


1 .创建数据库:


    create database 数据库名 character set 字符集 collate 字符集校对规则;


2 .查看数据库:


    show databases;查看所有的数据库;
    show create database 数据库名;查看某个数据库的定义信息;


3 .修改数据库:


    alter database 数据库名 character set 字符集 collate  字符集校对规则;


4 .删除数据库:
        drop database 数据库名
       
5 . 切换数据库:


    use 数据库名


(二)SQL对数据库表操作
1.SQL创建表语法


        create table 表名(字段名称 字段类型(长度) 约束,字段名称 字段类型(长度) 约束,字段名称 字段类型(长度) 约束.....) 多个字段之间用逗号分开
字段类型:
        Java中的类型:byte/short/int/long        float        double        boolean        char/String                Date        File
        SQL中的类型:tinyint/smallint/int/bigint        float        double        boolean        char/varchar        date/time/datetime/timestamp        BLOB/TEXT
       
        char和varchar的区别:


        char代表是固定长度的字符或字符串。


        varchar代表的是可变长度的字符串。


        datetime和timestamp区别


         datetime就是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用null存入到数据库中


         timestamp也是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用当前的系统时间存入到数据库中。


        -约束
        约束作用:保证数据的完整性
        单表约束分类:
                        主键约束:primary key(主键约束默认就是唯一,非空的)
                        唯一约束:unique
                        非空约束:not null
                       
-建表语句
create database web_test1;
use web_test1;
create table user(
        id int primary key auto_increment,
        username varchar(20) unique,
        password varchar(20) not null,
        age int,
        birthday date
);


-查看表
        查看某个数据库下的所有的表
                语法:show tables
        查看某个表的结构信息
                语法:desc 表名;


-删除表
        语法:drop table 表名;
       
-修改表
        *添加列:                //(添加字段)
                alter table 表名 add 列名 类型(长度) 约束;
        *修改列类型,长度和约束
                alter table 表名 modify 列名 类型(长度) 约束;
        删除列
                alter table 表名 drop 列名;
        修改列名称
                alter table 表名 change 旧列名 新列名 类型(长度) 约束;
        修改表名
                rename table 表名 to 新的表名;
        修改表的字符集
                alter table 表名 character set 字符集;
               
SQL对数据库表的记录进行操作(重点)
SQL添加表的记录
        语法:
                向表中插入某些列:insert into 表名 (列名1,列名2,列名3...) values(值1,值2,值3...)
                向表中插入所有列:insert into 表名 values(值1,值2,值3...);
        注意事项;
                1.值的类型与数据库中表列的类型一致.
                2.值的顺序与数据库中表列的顺序一致.
                3.值的最大长度不能超过列设置的最大长度.
                4.值的类型时字符串或者是日期类型,使用单引号引起来.
        添加记录
                添加某几列(可以选择性的添加值,也可以一次性添加所有值,要注意值的顺序不能变)
                        insert into user (id,username,password) values (null,'aaa','123');
                添加所有列
                        insert into user values (null,'bbb','123',23,'1993-09-01');
        添加中文记录
                1.需要将MYSQL数据库服务器中的客户端部分的字符集改为gbk.
                2.找到MYSQL的安装路径:my.ini文件,修改文件中[client]下的字符集
                3.重新启动MySQL的服务器        services.msc
               
SQL修改表的记录
        语法:
                update 表名 set 列名=值,列名=值 [where 条件];
        注意事项:
                1.值的类型与数据库中表列的类型一致.
                2.值的最大长度不能超过列设置的最大长度.
                3.字符串类型和日期类型要添加单引号.
        修改某一列的所有值:(很少用)
                update user set password = 'abc';
        按条件修改数据:(主要)
                update user set password = 'xyz' where username = 'bbb';
        按条件修改多个列:
                update user set password='123',age=34 where username='aaa';
                               
SQL删除表的记录
        语法:
                delete from 表名 [where 条件];
        注意事项:
                1.删除表的记录,指的是删除表中的一行记录.
                2.删除如果没有条件,默认是删除表中的所有记录.
        删除某一条记录:
                delete from user where id = 2;
        删除表中的所有记录:
                delete from user;
        *删除表中的记录有两种做法:
                delete from user;        删除所有记录,属于DML语句,一条记录一条记录删除.事务可以作用宅DML语句上的
                truncate table user;        删除所有记录,属于DDL语句,将表删除,然后重新创建一个结构一样的表.事务不能控制DDL的


SQL查看表的记录(重要)
        基本查询
                语法: select [distinct*]列名 from 表 [条件];
                环境的准备:
                查询所有学生考试成绩信息:
                        select* from examl;
                查询所有学校的姓名和英语成绩:
                select name,english from examl;
                查询英语成绩信息(不显示重复的值):
                select distinct english from exam;
                查看学生姓名和学生的总成绩:
                select name,english+chinese+math from exam;
                别名查询:
                select name,english+chinese+math as sum from exam;
               
        条件查询:
                使用where子句
                        >,<,>=,<=,<>,=                                //注意:        <>是不等于
                        like:模糊查询
                        in:范围查询
                        条件关联:and, or, not
                查询李四的学生成绩:
                查询名称叫李四学生并且英文大于90分:
                查询姓李的学生的信息:
                        like可以进行模糊查询,在like子句中可以使用_或者%作为占位符._只能代表一个字符,而%可以代表任意字符.
                                * like ‘李_’                :名字中必须是两个字,而且是姓李的。
                                * like ‘李%’                :名字中姓李的学生,李子后可以是1个或任意个字符。
                                * like ‘%四’                :名字中以四结尾的。
                                * like ‘%王%’        :只要名称中包含这个字就可以
                               
        排序查询:
                //使用order by 字段名称 asc(升序)/desc(降序);
                查询学生信息,并且按照语文成绩进行排序
                        select * from exam order by chinese;
                查询学生信息,并且按照语文成绩进行倒序排序
                        select* from exam order by chinese desc;
                查询学生信息,先按照语文成绩进行倒序排序,如果成绩相同再按照英语成绩升序排序
                select* from exam order by chinese desc,english asc;
                查询姓李的学生信息,在按照英语的成绩降序排序
                select * from exam where name like '李%' order by english desc;
                 
        分组统计查询:
                聚合函数使用:
                        sum();求和
                                举例: 获取所有学生的英语成绩的总和
                                        select sum(english) from exam;
                                获取所有学生的英语成绩和数学成绩的总和
                                        select sum(english),sum(math) from exam;
                                查询姓李的学生的英语成绩的总和
                                        select sum(english) from exam where name like '李%';
                                查询所有学生各科的总成绩
                                        1. select sum(english)+sum(chinese)+sum(math) from exam;
                                        2. select sum(english+chinese+math) from exam;
                                        *上面的语句是按照列的方式统计,英语成绩总和+语文成绩的总和+数学成绩总和.
                                        *下面的语句先计算英语+数学+语文然后再求和.
                                                使用 ifnull 的函数.
                                        //null 加上任何值都为null
                               
                        count();统计次数
                                获得学生的总数
                                        select count(*) from exam;
                                获得姓李的学生的个数
                                        select count(*) from exam where name like '李%';
                        max();最大值
                                获得数学成绩的最高分
                                        select max(math) from exam;
                                       
                        min();最小值
                                获得语文成绩的最低分
                                        select min(chinese) from exam;
                        avg();平均值
                                获取语文成绩的平均值
                                        select avg(chinese) from exam;
                分组查询
                        语法: 使用group by字段名称;
                        环境准备
                       
- 多表设计之一对多关系
        - 一对多关系的建表原则
                在多的一方创建外键指向一的一方的主键.
- 多表设计之多对多关系
        - 多对多关系的建表原则
                需要创建第三张表(中间表),在中间表中至少两个字段分别作为外键,指向多对多双方的主键.
- 多表设计之一对一关系
        - 唯一外键对应
                假设是一对多,在多的一方创建外键指向一的一方的主键,将外键设置为唯一(unique).
        - 主键对应
                将两个表的主键建立对应关系即可.
               
- 内连接
        根据关联条件,去两个表中匹配,如果匹配上就返回匹配上的记录,如果匹配不上则不返回
       
- 外连接
        - 左外连接
                以左表为基准,根据关联条件去右表查询,如果匹配上就返回匹配上的记录,如果匹配不上则返回null.
        - 右外连接
                和左外连接一样.




                左外查询:以左表为基准,查询所有,如果没有匹配,左边表则返回NULL


右外查询: 以右表为基准,查询所有,如果没有匹配,右边表返回null


内连接查询: 只显示匹配的结果,如果不匹配则不显示






acid
        原子性:事务必须同时完成,
        一致性:
        隔离性:事务并发的安全性
        持久性:一旦事务提交,事务要持久保存到硬盘中       


忘记MYSQL的root密码
        第一步:需要关闭MYSQL的服务.(services.msc)
        第二步:cmd>mysqld --skip-grant-tables (开启一个不需要密码的数据库服务)
        第三步:新打开一个cmd窗口 cmd>mysql -u root -p 回车(不需要输入密码)
        第四步:输入命令:use mysql;
        第五步:输入命令:update user set password=password('123') where user='root';
        第六步:关闭两个cmd窗口.进入到任务管理器:结束一个进程mysqld.
        第七步:启动MYSQL服务.               







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2