mysql_mysql安装教程 - CSDN
mysql 订阅
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。 展开全文
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
信息
外文名
MySQL
开发公司
瑞典MySQL AB 公司
类    型
关系型数据库管理系统
使用语言
SQL 语言
所    属
Oracle [1]
mySQL应用环境
与其他的大型数据库 例如 Oracle、DB2、SQL Server等相比,MySQL [1]  自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于 MySQL是开放源码软件,因此可以大大降低总体拥有成本。Linux作为操作系统,Apache 或Nginx作为 Web 服务器,MySQL 作为数据库,PHP/Perl/Python作为服务器端脚本解释器。由于这四个软件都是免费或开放源码软件(FLOSS),因此使用这种方式不用花一分钱(除开人工成本)就可以建立起一个稳定、免费的网站系统,被业界称为“LAMP“或“LNMP”组合。
收起全文
精华内容
参与话题
  • 高性能MySQL实战课

    千人学习 2020-09-27 15:07:09
    课程分为四大篇章,将为你建立完整的 MySQL 知识体系,同时将重点讲解 MySQL 底层运行原理、数据库的性能调优、高并发、海量业务处理、面试解析等。 一、性能优化篇: 主要包括...
  • MySQL 一一 MySQL基本使用

    万次阅读 多人点赞 2018-01-08 21:48:56
    1、数据库 简单来说,所谓的数据库就是存储数据的...随着时间的推移,瑞典AB公司把MySQL数据库转让给Sun公司(Java语言的创始公司) 后来,Sun公司经营不善,又把MySQL数据库转让给甲骨文公司(Oracle数据库) 4、数

    1、数据库

    简单来说,所谓的数据库就是存储数据的容器,而且是永久存储的。

    2、为什么需要数据库


    3、为什么要学习MySQL数据库

    最早MySQL数据,瑞典AB公司开发的一款开源型的关系型数据库

    随着时间的推移,瑞典AB公司把MySQL数据库转让给Sun公司(Java语言的创始公司)

    后来,Sun公司经营不善,又把MySQL数据库转让给甲骨文公司(Oracle数据库)

    4、数据库的分类

    在实际项目开发中,数据库一共分为两大类:①关系型数据库 ②非关系型数据

    非关系型数据库有哪些:Redis、MongoDB

    关系型数据库:

    小型数据库:微软Access

    中型数据库:DB2MySQLSQL Server

    大型数据库:Oracle

    5、什么是关系型数据库(MySQL)

    通过一种“关系”去管理实体信息,实体信息之间的联系。

    关系:实际上就是一张二维表,有列,还有行。


    6、数据库的原理图


    所以由上图可知:我们学习的过程,先学数据库->数据表->对数据进行增删改查操作

    二、MySQL的基本操作

    1、MySQL-Front软件的使用

    ①启动PHPStudy中的MySQL数据库


    ②确认MySQL数据库的密码。

    注意:连接数据库需要用户名(默认:root)和密码(默认:root


    ③解压MySQL-Front.rar压缩包


    2、MySQL库操作

    1)创建数据库

    在实际项目开发中,一个项目就是一个数据库。

    创建MySQL数据库:

    create  database  数据库名称;

    示例代码:

    选中localhost,然后切换到SQL编辑器


    SQL编辑器中输入create database db_20171227;如下图所示:


    2)删除数据库

    基本语法:

    删除就是不想要了,不想要了就是丢掉,丢掉的单词:drop

    drop database  数据库名称;

    示例代码:


    特别注意:删除数据库是不可逆的,删除之前一定要慎重。

    3)查看数据库

    ①查看所有数据库

    查看的单词:show

    查看所有数据库:show  databases;

    示例代码:

    ②显示指定的某类数据库

    show databases   like   ‘db%’; //查询所有以db开头的所有数据库

    普及like模糊查询,有两个关键字需要记住:

    _(下划线):代表任一一个字符,可能代表a也可能代表b...

    %(百分号):代表任意的n个字符,可能代表ab也可能代表abcd...

    4)修改数据库

    特别说明:在最新版本的MySQL中,数据库是不允许修改的。如果想修改必须删除在重建。

    3、MySQL数据表操作

    MySQL中,存放数据的真实位置都是数据库中的数据表。

    数据表就是一张二维表,有列有行。


    数据库很容易创建,但是数据表的创建有一点麻烦,麻烦在哪里呢?答:创建数据表时候,必须先创建列信息。

    学号(纯数字)唯一

    姓名(字符串)

    年龄(纯数字)

    性别(男、女、保密)

    1

     

     

     

    2

     

     

     

    3

     

     

     

     

    如上图所示,创建数据表时,不需要指定数据行,但是必须指定数据列,确认你要往里面存放什么类型的数据。

     

    创建表必须有两个东西:第一个东西就是列信息,第二个东西就是列属性(什么类型)

    1)创建数据表(前提是现有数据库)

    创建数据库并选择数据库(选择的关键词:use


    由于我们想数据表中插入的数据存在中文,所以也要设置编码格式

    基本语法:set  names utf8;  //注意:数据库中的编码格式没有横杠

    但是如果你使用的是MySQL-Front可以不需要这行代码,因为软件默认就是utf8。

    db_20171227数据库中创建数据库

    创建单词:create

    表的单词:table

    连在一起:

    create table  tb_user(

      -- id代表列名称,不支持中文

      -- int整数

      -- not null不能为空

      -- auto_increment

      id int notnull auto_increment,

      usernamevarchar(20) not null,

      age int,

      genderenum(‘男’,’女’,’保密’),

      primary key(id)

    ) engine = myisam default charset=utf8;

    示例代码:


    2)数据表的列类型

    创建数据表的基本语法:

    create table  数据表名称(

        列名称(英文)  列类型   列约束(not null)

    );

    整数类型(每个类型所表示的范围不同)


    tinyint :微整型,范围-128 -> 127(有符号型),如果添加unsigned(无符号型),0-255,人的年龄比较适合使用无符号的tinyint进行存储。

    smallint :小整型,-32768->32767(有符号型),如果添加unsigned(无符号型),0-65535,中小型网站会员,可以使用smallint。

    mediumint :中整型,-800->800万,无符号型,1600万左右,如果一个门户网站的文章数量可以使用mediumint

    int :整型,-21亿->21亿,无符号型,42亿左右,全世界的人口数量

    bigint :无法用int类型保存的都可以使用bigint

     

    小数类型(带有小数点的数据),记住一个类型即可:decimal(M,N)

    decimal(11,2) :数字的总长度(整数部分+小数部分)< 11位,2代表小数位,保留2位小数。在实际项目开发中,主要用于保存产品的价格

     

    字符串类型(char类型与varchar类型,text文本类型)

    char类型:char(255),如果一个字符串是固定长度的,而且小于255个字符,建议使用char类型,比如md5加密后的结果是固定的32位,建议采用char(32)

     

    varchar类型:varchar(255),如果一个字符串的长度不是固定的,建议采用varchar类型。比如人的姓名、文章的标题、文章的描述。

     

    对于字符数量超过255个字符的情况,建议使用text文本类型,比如文章的内容,产品的具备介绍。这些都是采用text文本类型。

     

    两种特殊的字符串类型(enum枚举类型与set集合类型)

    enum(‘男’,’女’,’保密’) :单选,多个结果中选1个

    set(‘吃饭’,’睡觉’,’打豆豆’) :多选,多个结果中可以同时选中多个

     

    例1:创建一个数据库,然后创建一个数据表,要求包含(编号、昵称、密码、性别、爱好、个性签名)

    示例代码:


    例2:创建一个数据库,然后创建一个数据表,要求包含(编号、标题、价格、缩略图、作者、出版社、发布时间)

    在实际项目开发中,如何创建数据库?

    答:先参考一下同行的项目都有哪些属性,每个属性就是一个字段(列)

     

    编号

    标题

    价格

    缩略图

    作者

    出版社

    发布时间

     

     

     

     

     

     

     


    示例代码:


    3)删除数据表

    丢掉:drop

    表:table

    删除数据表:drop  table  数据表名称;

    4)修改数据表(数据表的名称)

    重命名:rename

    rename table  原来的名字 to 新名称;

    5)查看数据表

    ①查看所有的数据表或某类的数据

    show tables  like   ‘_或%’;

    ②查看数据表的结构

    desc  数据表名称;

    示例代码:


    4、MySQL中数据的操作(增删改查)

    1)向数据表中插入数据

    基本语法:

    插入:insert

    向数据表中插入数据:

    insert into   数据表名称([字段1,字段2...])  values (字段值1,字段值2...)

    示例代码:向tb_user表中插入数据


    示例代码:根据字段插入数据


    2)更新数据表中的记录

    基本语法:

    更新:update

    update  数据表名称 set  字段(列) = 更新后的值,字段(列) = 更新后的值 where  条件;

    3)从数据表中查询数据

    查询所有数据

    查询:select

    select *  from   数据表名称;

    select  字段(某一列) from  数据表名称;

    根据条件查询数据(多了一个where)

    4)从数据表中删除数据(重点)

    基本语法:

    删除:delete

    delete from 数据表名称  where 条件;

    delete from 数据表名称;

    truncate 数据表名称;

    两者的功能都是删除所有数据,但是truncate删除的数据,其主键(primary key)会重新编号。而delete from删除后的数据,会继续上一次编号。

    展开全文
  • 超详细MySQL安装及基本使用教程

    万次阅读 多人点赞 2018-08-03 10:41:18
    一、下载MySQL 首先,去数据库的官网http://www.mysql.com下载MySQL。 点击进入后的首页如下:  然后点击downloads,community,选择MySQL Community Server。如下图:  滑到下面,找到Recommended Download,...

    一、下载MySQL

    首先,去数据库的官网http://www.mysql.com下载MySQL。

    点击进入后的首页如下: 
    这里写图片描述

    然后点击downloads,community,选择MySQL Community Server。如下图: 
    这里写图片描述

    滑到下面,找到Recommended Download,然后点击go to download page。如下图: 
    这里写图片描述

    点击download进入下载页面选择No thanks, just start my download就可以开始下载了,当然你要是想注册也可以注册一下。 
    **这里写图片描述**

    二、安装MySQL

    打开刚刚下载好的安装包,开始安装MySQL。 
    这里写图片描述 
    选择 I accept 然后点击next进入下一步。

    这里写图片描述 
    这里选择Developer Default,然后点击next进入下一步。

    这里写图片描述 
    这一步是检查安装条件,直接点击next进入下一步就可以了。

    这里写图片描述 
    这里直接点击execute执行就可以了,执行完后点击next进入下一步。

    这里写图片描述 
    继续点击next进入下一步。

    这里写图片描述 
    选择第一个然后点击next进入下一步。

    这里写图片描述 
    这里直接点击next进入下一步就可以了。

    这里写图片描述 
    设置root密码然后点击next进入下一步。

    这里写图片描述 
    点击next进入下一步。

    这里写图片描述 
    继续点击next。

    这里写图片描述 
    点击execute执行。

    这里写图片描述 
    点击next。

    这里写图片描述 
    点击finish。

    这里写图片描述 
    一路点击next,并check你的root密码,MySQL就成功在你的电脑上安装完成了。

    安装完成后进入MySQL的安装目录,进入MySQL Sever,其目录下的文件如下: 
    这里写图片描述 
    bin目录下保存了MySQL常用的命令工具以及管理工具、data目录是MySQL默认用来保存数据文件以及日志文件的地方(我的因刚安装还没有data文件夹)、docs目录下是MySQL的帮助文档、include目录和lib目录是MySQL所依赖的头文件以及库文件、share目录下保存目录文件以及日志文件。

    进入bin目录,按住shift键然后点击鼠标右键可以选择在该目录下打开命令窗口,或者在地址栏中输入cmd进入命令窗口。输入mysql -u root -p后回车,然后会提示输入密码,输入密码后就会进入MySQL的操作管理界面。 
    输入show databases;(注意末尾有分号)可以查看当前MySQL中的数据库列表,输入use test;可以进入test数据库(前提是要有此数据库),输入show tables可以查看test数据库中的所有表,输入quit可以退出MySQL的操作管理界面。 
    这里写图片描述

    三、MySQL基本使用教程(使用MySQLworkbench)

    1、创建数据库

    可以使用工具栏上的创建数据库直接创建数据库,如下图: 
    这里写图片描述
    或者使用命令:create database 数据库名称;(注意最后有分号)来创建。注意,此方法可能不会立马刷新,可以在左下角点击右键选择Refresh all 来刷新。 
    这里写图片描述

    2、创建表、删除表

    可以在你想要创建表的Tables上面点击右键,选择Create Table,或者使用命令create table table_name(column_name column_type); 
    这里写图片描述 
    注意,创建数据表的命令前需要使用use指明你要使用的数据库。(可以在你将要使用的数据库上面点击右键选择Set as Default Schema来使你将要用的数据库变为默认的,这样可以不用写use语句) 
    通过命令drop table table_name;来删除一张表。

    3、修改表的名字

    通过使用命令:alter table old_name rename to new_name或rename table old_name to new_name 来更改数据表名。 
    这里写图片描述

    4、为数据表增加、修改、删除字段

    通过命令alter table table_name add column_name column_type;语句来为数据表增加字段。 
    通过命令alter table table_name change column_name new_column_name new_column_name_type;语句来修改数据表字段名称。 
    通过命令alter table table_name drop column_name;来删除数据表字段。 
    这里写图片描述

    5、关于修改数据库名字

    在低版本的MySQL中提供了一个命令rename来修改数据库的名称(注意不是数据库的表),不过这个命令会造成数据的丢失,所以这个命令已经被删掉,现在如果想要重命名一个数据库名称的话,需要先导出原有数据库中的所有数据,然后新建一个数据库,然后把导出的数据导入到新的数据库中,最后删掉原来的数据库。整个过程比较繁琐,数据量大的时候会非常浪费时间,所以不推荐修改数据库的名字,因此在给数据库命名的时候要考虑好应该给数据库起一个合理的名字。

    6、拓展:pycharm操作MySQL

    打开pycharm,按照图片上的指示点击绿色“+”然后选择MySQL, 
    这里写图片描述 
    然后设置一下名字、并设置以root的方式连接数据库,最后测试连接成功后 点击apply就可以了。 
    这里写图片描述
    连接后的效果如下图,设置好后就可以在pycharm里面写MySQL的命令了,同理Java的IDEA也可以设置。 
    这里写图片描述

    展开全文
  • MySQL基础入门视频课程

    千人学习 2019-02-22 10:26:07
    本课程从零开始,以通俗易懂的方式讲解MySQL技术,手把手教你掌握每一个知识点。课程中使用的所有英文单词都会逐一查询并记录,真正做到零基础入门学习,适合初学者的教程! 课程内容包括: 1.MySQL简介、安装...
  • MySQL高级语句下

    2020-10-15 20:04:33
    文章目录前言一、比较运算符1.1least 求最小值 Greatest求最大值1.2IN NOT IN1.3 LIKE NOT LIKE二、逻辑运算符2.1 逻辑非2.2 逻辑与2.3 逻辑或2.4 逻辑异或三...mysql> select least(10,20,30),greatest(10,20,30);

    文章目录

    前言

    一、比较运算符

    1.1least 求最小值 Greatest求最大值

    mysql> select least(10,20,30),greatest(10,20,30);  
    +-----------------+--------------------+
    | least(10,20,30) | greatest(10,20,30) |
    +-----------------+--------------------+
    |              10 |                 30 |
    +-----------------+--------------------+
    1 row in set (0.00 sec)

    支持小数

    mysql> select least(10.1,20,30),greatest(10,20,30.1);
    +-------------------+----------------------+
    | least(10.1,20,30) | greatest(10,20,30.1) |
    +-------------------+----------------------+
    |              10.1 |                 30.1 |
    +-------------------+----------------------+
    1 row in set (0.00 sec)

    least如果放的是字符和数值的混合数据,是不能执行成功的
    greatest:自动屏蔽不同类型的数据

    mysql> select least(10.1,20,30,'a'),greatest(10,20,30.1,'a');
    +-----------------------+--------------------------+
    | least(10.1,20,30,'a') | greatest(10,20,30.1,'a') |
    +-----------------------+--------------------------+
    | 0                     | 30.1                     |
    +-----------------------+--------------------------+
    1 row in set, 2 warnings (0.00 sec)

    1.2IN NOT IN

    IN 判断一个值是否在对应的列表中,如果是返回 1,否则返回 0。
    NOT IN 判断一个值是否不在对应的列表中,如果不是返回 1,否则返回 0。

    mysql> select 97 in ('a','b','c'),'a' not in ('a','b','c');
    +---------------------+--------------------------+
    | 97 in ('a','b','c') | 'a' not in ('a','b','c') |
    +---------------------+--------------------------+
    |                   0 |                        0 |
    +---------------------+--------------------------+
    1 row in set, 3 warnings (0.00 sec)

    1.3 LIKE NOT LIKE

    LIKE 用来匹配字符串,如果匹配成功则返回 1,反之返回 0。LIKE 支持两种通配符:’%’ 用于匹配任意数目的字符,
    而’_’只能匹配一个字符。NOT LIKE 正好跟 LIKE 相反,如果没有匹配成功则返回 1,反之返回 0。

    mysql> select 'bdqn' like 'bdq_','kgc' like '%c', 'etc'Not like '%th';
    +--------------------+-----------------+---------------------+
    | 'bdqn' like 'bdq_' | 'kgc' like '%c' | 'etc'Not like '%th' |
    +--------------------+-----------------+---------------------+
    |                  1 |               1 |                   1 |
    +--------------------+-----------------+---------------------+
    1 row in set (0.00 sec)

    二、逻辑运算符

    逻辑运算符又被称为布尔运算符,通常用来判断表达式的真假,如果为真返回 1,否则返回 0,
    真和假也可以用 TRUE 和 FALSE 表示。MySQL 中支持使用的逻辑运算符有四种,
    运算符 描述
    NOT 或 ! 逻辑非
    AND 或 && 逻辑与
    OR 或 || 逻辑或
    XOR 逻辑异或

    2.1 逻辑非

    逻辑运算符中最简单的运算符就是逻辑非,逻辑非使用 NOT 或!表示。逻辑非将跟在它后面的逻辑测试取反,
    把真变为假,把假变为真。如果 NOT 后面的操作数为 0 时,所得值为 1;如果操作数为非 0 时,所得值为 0;
    如果操作数为 NULL 时,所得值为 NULL。

    mysql> select not 0,!2,!(4-4);
    +-------+----+--------+
    | not 0 | !2 | !(4-4) |
    +-------+----+--------+
    |     1 |  0 |      1 |
    +-------+----+--------+
    1 row in set (0.00 sec)

    2.2 逻辑与

    逻辑与通常用于判断两个值或多个值的有效性,如果所有值都是真返回 1,否则返回 0
    逻辑与使用 AND 或者&&表示。

    • 0与NULL时结果为0
    • 1与NULL时结果为NULL
    mysql> select 2&&3,0&&1,0&&NULL,1 and NULL;
    +------+------+---------+------------+
    | 2&&3 | 0&&1 | 0&&NULL | 1 and NULL |
    +------+------+---------+------------+
    |    1 |    0 |       0 |       NULL |
    +------+------+---------+------------+
    1 row in set (0.00 sec)

    2.3 逻辑或

    逻辑或表示包含的操作数,任意一个为非零值并且不是 NULL 值时,返回 1,否则返回0。
    逻辑或通常使用 OR 或者||来表示。

    • 注意:最好用OR,ll有时不能准确表达或的关系,有时候会合并
    mysql> select 2 or 3, 2||0;
    +--------+------+
    | 2 or 3 | 2||0 |
    +--------+------+
    |      1 | 20   |
    +--------+------+
    1 row in set (0.05 sec)
    mysql> select 2 or 3, 2 or 0;
    +--------+--------+
    | 2 or 3 | 2 or 0 |
    +--------+--------+
    |      1 |      1 |
    +--------+--------+
    1 row in set (0.00 sec)
    • 字符串无法识别
    mysql> select 2 or 3,'a' or 'c';
    +--------+------------+
    | 2 or 3 | 'a' or 'c' |
    +--------+------------+
    |      1 |          0 |
    +--------+------------+
    1 row in set, 2 warnings (0.00 sec)
    • 逻辑或 1和NULL在一起时,输出结果还是 1
    mysql> select 0 or NULL,1 or NULL;
    +-----------+-----------+
    | 0 or NULL | 1 or NULL |
    +-----------+-----------+
    |      NULL |         1 |
    +-----------+-----------+
    1 row in set (0.00 sec)

    2.4 逻辑异或

    两个非 NULL 值的操作数,如果两者都是 0 或者都是非 0,则返回 0;如果一个为 0, 另一个为非 0,则返回结果为 1;
    当任意一个值为 NULL 时,返回值为 NULL。

    mysql> select 0 xor 3,0 xor 0,0 xor NULL,1 xor NULL;
    +---------+---------+------------+------------+
    | 0 xor 3 | 0 xor 0 | 0 xor NULL | 1 xor NULL |
    +---------+---------+------------+------------+
    |       1 |       0 |       NULL |       NULL |
    +---------+---------+------------+------------+
    1 row in set (0.00 sec)

    三、位运算符

    位运算符实际上是对二进制数进行计算的运算符。MySQL 内位运算会先将操作数变成二进制格式,然后进行位运算,
    最后在将计算结果从二进制变回到十进制格式,方便用户查看。MySQL 支持 6 种位运算符
    运算符 描述
    & 按位与
    | 按位或
    ~ 按位取反
    ^ 按位异或
    << 按位左移 >>按位右移

    例子

    取反1的二进制,取5的二进制,二者进行且的计算
    1的二进制:0001
    1的取反:1110
    5的二进制:0101
    1110
    0101
    将上面二者用且关系计算得出
    0100就是4

    mysql> select 5&~1;
    +------+
    | 5&~1 |
    +------+
    |    4 |
    +------+
    1 row in set (0.00 sec)

    3.1 向左位移运算

    mysql> select 1<<2;
    0001
    0100    4
    +------+
    | 1<<2 |
    +------+
    |    4 |
    +------+
    1 row in set (0.00 sec)

    3.2 向右位移运算

    向右移动位数,多余的位数直接删掉

    15>>2
    1111
    0011 3
    mysql> select 15>>2;
    +-------+
    | 15>>2 |
    +-------+
    |     3 |
    +-------+
    1 row in set (0.00 sec)

    四、运算符的优先级

    优先级    运算符                   优先级      运算符
    1          !                      8          |
    2          ~                       9          =,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN
    3          ^                      10          BETWEEN,CASE,WHEN,THEN,ELSE
    4          * , /(DIV), %(MOD)     11          NOT
    5          +,-                    12          &&,AND
    6          >>,<<                  13          ||,OR,XOR
    7          &                      14          :=

    五、连接查询

    MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。
    首先,要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上。使用较多的连接查询包括:
    内连接、左连接和右连接。

    5.1 内连接查询

    将两个表的id 连接起来 显示id和user_name 属性

    mysql> select kgc.id,kgc.user_name from kgc inner join num on kgc.id=num.id;
    +----+-----------+
    | id | user_name |
    +----+-----------+
    |  1 | zhangshan |
    |  3 | xiaoming  |
    |  5 | tianqi    |
    |  7 | leslieF   |
    +----+-----------+
    4 rows in set (0.00 sec)

    用内连接的方法将kgc表中的id 和 uer_name属性显示出来,并且显示出hob表中的hob_name属性 ,将kgc表中的hobby属性和hob表中的id连接一起.

    mysql> create table hob (id int(3) not null primary key auto_increment,hob_name varchar(10) not null);
    Query OK, 0 rows affected (0.07 sec)
    
    mysql> insert into hob(hob_name) values('云计算'),('大数据'),('人工智能');
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> select kgc.id,kgc.user_name,hob.hob_name from kgc inner join hob on kgc.hobby=hob.id;
    +----+-----------+--------------+
    | id | user_name | hob_name     |
    +----+-----------+--------------+
    |  1 | zhangshan | 云计算       |
    |  2 | lisi      | 大数据       |
    |  3 | xiaoming  | 云计算       |
    |  4 | zhaoliu   | 人工智能     |
    |  5 | tianqi    | 大数据       |
    |  6 | wangba    | 大数据       |
    |  7 | leslieF   | 大数据       |
    +----+-----------+--------------+
    7 rows in set (0.00 sec)
    
    mysql> select * from kgc;
    +----+-----------+-------+-------+------+
    | id | user_name | level | hobby | addr |
    +----+-----------+-------+-------+------+
    |  1 | zhangshan |    88 |     1 | nj   |
    |  2 | lisi      |    77 |     2 | nj   |
    |  3 | xiaoming  |    66 |     1 | NULL |
    |  4 | zhaoliu   |    66 |     3 | NULL |
    |  5 | tianqi    |    90 |     2 | nj   |
    |  6 | wangba    |    60 |     2 |      |
    |  7 | leslieF   |    70 |     2 | nj   |
    +----+-----------+-------+-------+------+
    7 rows in set (0.00 sec)

    5.2 左连接查询

    MySQL 除了内连接,还可以使用外连接。区别于 MySQL 外连接是将表分为基础表和参考表,再依据基础表返回满足条件或不满足条件的记录。外连接按照连接时表的顺序来分,
    有左连接和右连接之分。
    左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,
    并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。

    • 左连接是左表的优先级大,所以会根据左表的hobby进行排序,匹配右表的值
    mysql> insert into hob(hob_name) values('云开发'),('云交付');
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> select kgc.id,kgc.user_name,hob.hob_name from kgc left join hob on kgc.hobby=hob.id;
    +----+-----------+--------------+
    | id | user_name | hob_name     |
    +----+-----------+--------------+
    |  1 | zhangshan | 云计算       |
    |  3 | xiaoming  | 云计算       |
    |  2 | lisi      | 大数据       |
    |  5 | tianqi    | 大数据       |
    |  6 | wangba    | 大数据       |
    |  7 | leslieF   | 大数据       |
    |  4 | zhaoliu   | 人工智能     |
    +----+-----------+--------------+
    7 rows in set (0.00 sec)

    5.3 右连接查询

    右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。也就是说匹配右表中的每一行及左表中符合条件的记录。

    • 以右表为主,显示右表的全部信息,左表信息有则匹配
      给右表添加一段属性 addr
    mysql> alter table hob add column addr varchar(50);
    mysql> select kgc.id,kgc.user_name,hob.hob_name,hob.addr from kgc right join hob on kgc.hobby=hob.id;
    +------+-----------+--------------+------+
    | id   | user_name | hob_name     | addr |
    +------+-----------+--------------+------+
    |    1 | zhangshan | 云计算       | NULL |
    |    2 | lisi      | 大数据       | NULL |
    |    3 | xiaoming  | 云计算       | NULL |
    |    4 | zhaoliu   | 人工智能     | NULL |
    |    5 | tianqi    | 大数据       | NULL |
    |    6 | wangba    | 大数据       | NULL |
    |    7 | leslieF   | 大数据       | NULL |
    | NULL | NULL      | 云开发       | NULL |
    | NULL | NULL      | 云交付       | NULL |
    +------+-----------+--------------+------+
    9 rows in set (0.00 sec)

    六、数学函数

    MySQL提供了实现各种功能的函数
    常用的函数分类
    1.数学函数
    2.聚合函数
    3.字符串函数
    4.日期时间函数
    ##常用的数学函数##
    abs(x) 返回x的绝对值
    rand() 返回0-1的随机数
    mod(x,y) 返回x除以y以后的余数
    power(x,y) 返回x的y次方
    round(x) 返回离x最近的整数
    round(x,y) 保留x的y位小数四舍五入后的值
    sqrt(x) 返回x的平方根
    truncate(x,y) 返回数字x截断为y位小数的值
    ceil(x) 返回大于或等于x的最小整数
    floor(x)返回小于或等于x的最大整数

    6.1 abs(x) 返回x的绝对值

    mysql> select abs(-10);
    +----------+
    | abs(-10) |
    +----------+
    |       10 |
    +----------+
    1 row in set (0.00 sec)

    6.2 rand() 返回0-1的随机数

    mysql> select rand();
    +--------------------+
    | rand()             |
    +--------------------+
    | 0.0633721929633731 |
    +--------------------+
    1 row in set (0.00 sec)

    如何利用rand控制取值范围?
    以下取0-100的随机数

    mysql> select rand()*100;
    +-------------------+
    | rand()*100        |
    +-------------------+
    | 89.42384467406556 |
    +-------------------+
    1 row in set (0.00 sec)

    6.3 mod(x,y) 返回x除以y以后的余数

    mysql> select mod(7,2);
    +----------+
    | mod(7,2) |
    +----------+
    |        1 |
    +----------+
    1 row in set (0.00 sec)

    6.4 power(x,y) 返回x的y次方

    mysql> select power(2,3);
    +------------+
    | power(2,3) |
    +------------+
    |          8 |
    +------------+
    1 row in set (0.00 sec)

    6.5 round(x) 返回离x最近的整数

    mysql> select round(1.4);
    +------------+
    | round(1.4) |
    +------------+
    |          1 |
    +------------+
    1 row in set (0.00 sec)

    round(x,y) 保留x的y位小数四舍五入后的值
    保留小数点后1位并且四舍五入

    mysql> select round(1.49,1);
    +---------------+
    | round(1.49,1) |
    +---------------+
    |           1.5 |
    +---------------+
    1 row in set (0.00 sec)

    6.6 sqrt(x) 返回x的平方根

    mysql> select sqrt (8);
    +--------------------+
    | sqrt (8)           |
    +--------------------+
    | 2.8284271247461903 |
    +--------------------+
    1 row in set (0.00 sec)

    6.7 truncate(x,y) 返回数字x截断为y位小数的值

    mysql> select truncate(1.449,2);
    +-------------------+
    | truncate(1.449,2) |
    +-------------------+
    |              1.44 |
    +-------------------+
    1 row in set (0.00 sec)

    6.8 ceil(x) 返回大于或等于x的最小整数

    6.8 floor(x)返回小于或等于x的最大整数

    mysql> select ceil(1.1),floor(1.1);
    +-----------+------------+
    | ceil(1.1) | floor(1.1) |
    +-----------+------------+
    |         2 |          1 |
    +-----------+------------+
    1 row in set (0.00 sec)

    取余限制范围 0 ,1 ,2
    限制思路:0-100以内的数除以3,余数都是0 1 2 所以输出结果也都是0-2这个范围,ceil是大于x的最小整数

    mysql> select mod(ceil(rand()*100),3);
    +-------------------------+
    | mod(ceil(rand()*100),3) |
    +-------------------------+
    |                       2 |
    +-------------------------+
    1 row in set (0.00 sec)
    
    mysql> select mod(ceil(rand()*100),3);
    +-------------------------+
    | mod(ceil(rand()*100),3) |
    +-------------------------+
    |                       1 |
    +-------------------------+
    1 row in set (0.00 sec)
    
    mysql> select mod(ceil(rand()*100),3);
    +-------------------------+
    | mod(ceil(rand()*100),3) |
    +-------------------------+
    |                       0 |
    +-------------------------+
    1 row in set (0.00 sec)

    七、聚合函数

    MySQL 数据库函数中专门有一组函数是特意为库内记录求和或者对表中的数据进行集中概括而设计的,这些函数被称作聚合函数。
    常用的聚合函数
    avg()返回指定列的平均值
    count()返回指定列中非NULL值的个数
    min()返回指定列的最小值
    max()返回指定列的最大值
    sum()返回指定列的所有值之和

    7.1 avg()返回指定列的平均值

    求kgc表中level属性的平均值

    mysql> select avg(level) from kgc;
    +------------+
    | avg(level) |
    +------------+
    |    73.8571 |
    +------------+
    1 row in set (0.00 sec)

    7.2 count()返回指定列中非NULL值的个数

    这里的3,是作为一个值统计的

    mysql> select count(3);
    +----------+
    | count(3) |
    +----------+
    |        1 |
    +----------+
    1 row in set (0.00 sec)

    统计表中 name属性 值的个数

    mysql> select count(user_name) from kgc;
    +------------------+
    | count(user_name) |
    +------------------+
    |                7 |
    +------------------+
    1 row in set (0.00 sec)

    7.3 min()返回指定列的最小值

    mysql> select min(level) from kgc;
    +------------+
    | min(level) |
    +------------+
    |         60 |
    +------------+
    1 row in set (0.00 sec)

    7.4 max()返回指定列的最大值

    mysql> select max(level) from kgc;
    +------------+
    | max(level) |
    +------------+
    |         90 |
    +------------+
    1 row in set (0.00 sec)

    7.5 sum()返回指定列的所有值之和

    mysql> select sum(level) from kgc;
    +------------+
    | sum(level) |
    +------------+
    |        517 |
    +------------+
    1 row in set (0.00 sec)

    八、字符串函数

    常用函数不仅包括数学函数和聚合函数,还包含字符串函数,MySQL 为字符串的相关操作设计了丰富的字符串函数。
    常用的字符串函数
    length(x) 返回字符串 x 的长度
    trim() 返回去除指定格式的值
    concat(x,y) 将提供的参数 x 和 y 拼接成一个字符串
    upper(x) 将字符串 x 的所有字母变成大写字母
    lower(x) 将字符串 x 的所有字母变成小写字母
    left(x,y) 返回字符串 x 的前 y 个字符
    right(x,y) 返回字符串 x 的后 y 个字符
    repeat(x,y) 将字符串 x 重复 y 次
    space(x) 返回 x 个空格
    replace(x,y,z) 将字符串 z 替代字符串 x 中的字符串 y
    strcmp(x,y) 比较 x 和 y,返回的值可以为-1,0,1
    substring(x,y,z) 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
    reverse(x) 将字符串 x 反转

    8.1 length(x) 返回字符串 x 的长度

    mysql> select length('abdc');
    +----------------+
    | length('abdc') |
    +----------------+
    |              4 |
    +----------------+
    1 row in set (0.00 sec)

    空格也会占位置

    mysql> select length(' bdc');
    +----------------+
    | length(' bdc') |
    +----------------+
    |              4 |
    +----------------+
    1 row in set (0.00 sec)

    空值不占空间

    mysql> select length('');
    +------------+
    | length('') |
    +------------+
    |          0 |
    +------------+
    1 row in set (0.00 sec)

    NULL占空间,数据显示就叫NULL

    mysql> select length(NULL);
    +--------------+
    | length(NULL) |
    +--------------+
    |         NULL |
    +--------------+
    1 row in set (0.00 sec)

    8.2 trim() 返回去除指定格式的值

    trim 能够去除头尾空格

    mysql> select length(trim(' abc'));
    +----------------------+
    | length(trim(' abc')) |
    +----------------------+
    |                    3 |
    +----------------------+
    1 row in set (0.06 sec)

    中间的格式是去除不掉的

    mysql> select length(trim(' a bc'));
    +-----------------------+
    | length(trim(' a bc')) |
    +-----------------------+
    |                     4 |
    +-----------------------+
    1 row in set (0.00 sec)

    8.3 concat(x,y) 将提供的参数 x 和 y 拼接成一个字符串

    mysql> select length(concat('abc','def'));
    +-----------------------------+
    | length(concat('abc','def')) |
    +-----------------------------+
    |                           6 |
    +-----------------------------+
    1 row in set (0.00 sec)

    8.4 upper(x) 将字符串 x 的所有字母变成大写字母

    8.4 lower(x) 将字符串 x 的所有字母变成小写字母

    mysql> select upper('abc'),lower('ABC');
    +--------------+--------------+
    | upper('abc') | lower('ABC') |
    +--------------+--------------+
    | ABC          | abc          |
    +--------------+--------------+
    1 row in set (0.00 sec)

    8.5 left(x,y) 返回字符串 x 的前 y 个字符

    8.5 right(x,y) 返回字符串 x 的后 y 个字符

    mysql> select left('abcdefg',3),right('abcdefg',2);
    +-------------------+--------------------+
    | left('abcdefg',3) | right('abcdefg',2) |
    +-------------------+--------------------+
    | abc               | fg                 |
    +-------------------+--------------------+
    1 row in set (0.00 sec)

    8.6 repeat(x,y) 将字符串 x 重复 y 次

    mysql> select repeat('abc',3);
    +-----------------+
    | repeat('abc',3) |
    +-----------------+
    | abcabcabc       |
    +-----------------+
    1 row in set (0.00 sec)

    8.7 space(x) 返回 x 个空格

    由于单单输入这条命令难以看到效果,所以有以下两种方法测试
    (1)使用length便于观看

    mysql> select length(concat('abc',space(3),'abc'));
    +--------------------------------------+
    | length(concat('abc',space(3),'abc')) |
    +--------------------------------------+
    |                                    9 |
    +--------------------------------------+
    1 row in set (0.00 sec)

    (2)用concat也能进行验证

    mysql> select concat('abc',space(3),'abc');
    +------------------------------+
    | concat('abc',space(3),'abc') |
    +------------------------------+
    | abc   abc                    |
    +------------------------------+
    1 row in set (0.00 sec)

    8.8 replace(x,y,z) 将字符串 z 替代字符串 x 中的字符串 y

    mysql> select replace('abcdefg','bc','12');
    +------------------------------+
    | replace('abcdefg','bc','12') |
    +------------------------------+
    | a12defg                      |
    +------------------------------+
    1 row in set (0.00 sec)

    删除字符

    mysql> select replace('abcdefg','bc','');
    +----------------------------+
    | replace('abcdefg','bc','') |
    +----------------------------+
    | adefg                      |
    +----------------------------+
    1 row in set (0.00 sec)

    8.9 strcmp(x,y) 比较 x 和 y,返回的值可以为-1,0,1

    mysql> select strcmp(4,5);
    +-------------+
    | strcmp(4,5) |
    +-------------+
    |          -1 |
    +-------------+
    1 row in set (0.00 sec)
    mysql> select strcmp(5,5);
    +-------------+
    | strcmp(5,5) |
    +-------------+
    |           0 |
    +-------------+
    1 row in set (0.00 sec)
    mysql> select strcmp(6,5);
    +-------------+
    | strcmp(6,5) |
    +-------------+
    |           1 |
    +-------------+
    1 row in set (0.00 sec)

    8.9.1 substring(x,y,z) 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串

    mysql> select substring('abcdefg',3,3);
    +--------------------------+
    | substring('abcdefg',3,3) |
    +--------------------------+
    | cde                      |
    +--------------------------+
    1 row in set (0.01 sec)

    8.9.2 reverse(x)将字符串 x 反转

    mysql> select reverse('abc');
    +----------------+
    | reverse('abc') |
    +----------------+
    | cba            |
    +----------------+
    1 row in set (0.00 sec)
    展开全文
  • JavaWeb 什么是JavaWeb? 使用Java语言开发互联网项目,简单理解:使用Java语言开发网站 数据库 DateBase 简称:DB 什么数据库? 用于存储和管理数据的仓库 ...1.去MySQL的安装目录找到my.ini文件 datadi...

    JavaWeb
    什么是JavaWeb?
    使用Java语言开发互联网项目,简单理解:使用Java语言开发网站

    数据库 DateBase 简称:DB
    什么数据库?
    用于存储和管理数据的仓库
    数据库的特点:
    1.持久化存储数据的,其实数据库就是一个文件系统
    2.方便存储和管理数据
    3.使用了统一的方式操作数据库 SQL

    MySQL :开源免费的数据库,小型的数据库,已经被Oracle收购,MySQL6.x版本也开始收费
    在这里插入图片描述
    MySQL的卸载
    1.去MySQL的安装目录找到my.ini文件
    datadir=“C:/ProgramData/MySQL/MySQL Server 5.5/Data/”
    2.卸载mysql
    在这里插入图片描述
    3.删除C:/ProgramData目录下的MySQL文件夹

    MySQL服务 后天程序 没有页面
    通过:window10 控制面板->系统和安全->管理工具->服务
    第二种:
    win+r service.msc 也可以打开服务
    net stop mysql 命令:结束MySQL的服务
    net start mysql 命令:启动MySQL的服务

    MySQL登录:
    1.mysql -uroot -p密码
    2.mysql -hip -uroot -p连接目标的密码
    3.mysql --host=ip --user=root --password=连接目标的密码
    MySQL退出:
    1.exit
    2.quit
    在这里插入图片描述
    在这里插入图片描述
    MySQL的目录
    1.mysql安装目录
    配置文件 my.ini
    2.MySQL数据目录
    数据库:文件夹
    表:文件
    数据:文件的内容
    SQL
    什么是SQL?
    structured Query Language:结构化查询语言
    其实就是定义了操作所有关系性数据库的规则(DBMS)
    每一种数据库操作的方式存在不一样的地方 称为方言

    SQL通用语法
    1.SQL语句可以单行或多行书写,以分号结尾
    2.可以使用空格和缩进来增加语句的可延续
    3.MySQL数据的SQL语句不区分大小写,关键字建议使用大写
    3中注释
    单行注释:-- 注释内容 或 # 注释内容 (MySQL特有)
    多行注释:/* 注释 */

    SQL分类
    在这里插入图片描述
    在这里插入图片描述
    DDL:操作数据库,表
    1.操作数据库:CRUD
    1.C(create ):创建
    create database 数据库名称;
    创建数据库,判断不存在,在创建;
    create database if not exists 数据库名称;
    创建数据库,并指定字符集
    create database 数据库名称,character 字符集名称
    创建db4数据库,判断是否存在,并制定字符集gbk
    create database db4 if not exists db4 character set gbk;
    2.R(Retrieve):查询
    查询所有数据库的名称:
    show database;
    查询某个数据库的字符集,查询某个数据库的创建语句
    show create database 数据库名称;
    3.U(update):修改
    修改数据库的字符集
    alter database 数据库名称 character set 字符集名称;
    4.D(Delete):删除
    删除数据库
    drop database 数据库名称;
    判断数据库存在,存在在删除
    drop database if exists 数据库名称;
    5.使用数据库
    查询当前正在使用的数据库名称
    select database();
    使用数据库
    use 数据库名称;
    2 操作表
    在这里插入图片描述
    1.C(create ):创建
    语法:
    create table 表名(
    列名1 数据类型1,
    列名2 数据类型2,

    列名n 数据类型n
    );
    数据类型:
    1.int :整数类型
    age int,
    2.double :小数类型
    score double(5,2)
    3.date 日期,只包含年月日,yyyy-MM-dd
    4.datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
    5.timestamp:时间错类型, 包含年月日时分秒, yyyy-MM-dd HH:mm:ss
    注意:如果将来不给这个字段赋值,或赋值为null 则默认使用当前系统时间,来自动赋值
    6.varchar:字符串
    name varchar(20):姓名最大10个字符
    zhangsan 8个字符 张三 2个字符
    创建表:
    create tables(
    id int,
    name varchar(32),
    age int,
    socre double(4,1),
    birthday date,
    insert_time timestamp
    );
    注意:最后一列,不需要逗号。
    复制表
    create table 表名 like 被复制的表名;
    create table stu like student;
    2.R(Retrieve):查询
    查询某个数据库中所有的表名称
    show tables;
    查询表结构
    desc 表名;
    查询表结构;
    desc 表名;
    3.U(update):修改
    修改表名:
    alter table 表名 rename to 新的表名;
    alter table student rename to stu;
    修改表的字符集
    alter table 表名character set 字符集
    添加一列
    alter table 表名 add 列名 数据类型;
    alter table student add nihao varchar(21);
    修改列名称 类型
    alter table 表名 change 列名 新列名 新数据类型;
    alter table 表名 modify 列 数据类型;
    删除列
    alter table 表名 dorp 列名;
    4.D(Delete):删除
    drop table 表名;
    drop table if exists 表名;

    DML:增删改表中的数据
    1.添加数据:
    inset into 表名 (列名1,列名2,)values(值1,值2);
    注意:
    1.列名和值要一一对应
    2.如果表名后,不定义列名 则默认给所有列添加值
    inset into 表名 values(值1.。。。值n);
    3.除了数字类型,其他类型需要使用引号(单双都可以)引起来
    2.删除数据:
    语法:
    delete from 表名 【where 条件】
    delete from student where id=1;
    注意:
    1.如果不加条件,则删除表中所有的记录
    2.如果删除所有记录
    1.delete from 表名:-- 不推荐使用,有多少条记录就会执行多少次操作,效率低
    2.truncate table 表名:-- 先删除表,然后在创建一张一样的表 ,效率高。
    3.修改数据
    语法:
    update 表名 set 列名1=值1,列名2=值2,… [where 条件]
    UPDATE student SET age=111,score=100 WHERE id=1;
    注意:
    1.如果不加任何条件,则会将表中所有的记录全部修改
    DQL:查询表中的记录
    select * from 表名;
    1.语法:
    select
    字段列表
    from
    表名列表
    where
    条件列表
    group by
    分组字段
    order by
    分组之后的条件
    limit
    分页限定

    2.基础查询
    1.多个字段的查询
    select 字段名1,字段名2…from 表名;
    注意:如果查询所有的字段,则可以使用*来替代字段列表
    2.去除重复:

    • distinct
      3.计算列
      *一般可以使用四则运算计算一些列的值(一般只会进行数值型的计算)
      *ifnull(表达式1,表达式2):null 参与的运算,计算的结果都为null
      表达1:那个字段需要判断是否为null
      如果该字段为null后面的替换值
      4.起别名:
      as :as也可以省略
      练习:
      CREATE TABLE student3 (
      id INT, – 编号
      NAME VARCHAR(20), – 姓名
      age INT, – 年龄
      sex VARCHAR(5), – 性别
      address VARCHAR(100), – 地址
      math INT, – 数学
      english INT – 英语
      );
      INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES (1,‘马云’,55,‘男’,’
      杭州’,66,78),(2,‘马化腾’,45,‘女’,‘深圳’,98,87),(3,‘马景涛’,55,‘男’,‘香港’,56,77),(4,'柳岩
      ',20,‘女’,‘湖南’,76,65),(5,‘柳青’,20,‘男’,‘湖南’,86,NULL),(6,‘刘德华’,57,‘男’,'香港
      ',99,99),(7,‘马德’,22,‘女’,‘香港’,99,99),(8,‘德玛西亚’,18,‘男’,‘南京’,56,65);
      SHOW TABLES;
      SELECT *FROM student3;

    – 去除重复的结果集
    SELECT DISTINCT address FROM student;
    SELECT DISTINCT NAME,address FROM student;
    计算math 和English 分数之和(如果有null,参与的运算 计算结果都为null)
    SELECT NAME ,math,english ,math+IFNULL(english,0) FROM student;

    –起别名
    SELECT NAME ,math,english ,math+IFNULL(english,0) AS 总分 FROM student;
    as 可以省略!

    3.条件查询
    1.where 子句后跟条件
    2.运算符
    *> < >= <= = <>
    *BETWEEN…AND
    *IN(集合)
    *LIKE

    • IS NULL
      • AND 或&&
    • or 或 ||
    • not 或 !

    –年龄在 20至30之间
    –年龄是 10 20 23
    SELECT *FROM student WHERE age BETWEEN 20 AND 30;
    SELECT *FROM student WHERE age IN (10,20,23);

    –查询英语成绩为null
    SELECT *FROM student WHERE english IS NULL;
    –查询英语成绩不为null
    SELECT *FROM student WHERE english IS NOT NULL;

    • LIKE:模糊查询
    • *占位符:
    •      *_:单个任意字符
      
    •      *%:多个任意字符
      

    – 查询姓马的
    SELECT *FROM student WHERE NAME LIKE “马%”;
    – 查询姓名第二字是化的 人
    SELECT *FROM student WHERE NAME LIKE “化%";
    – 查询三个字的姓名的人
    SELECT * FROM student WHERE NAME LIKE "
    __”;
    – 查询所有包含有德的人
    SELECT *FROM student WHERE NAME LIKE “%德%”;

    day2
    DQL:查询语句
    1.排序查询
    *语法:order by 子句
    order by 排序字段1 排序方式1 ,排序字段2 排序方式…
    *排序方式:
    ASC:升序 (默认的)
    * DESC: 降序
    * SELECT
    FROM student ORDER BY math ASC;
    SELECT *FROM student ORDER BY math DESC;
    SELECT FROM student ORDER BY math ASC ,english DESC;
    * 注意:
    * 如果有多个排序条件,则当前的条件值一样时,才会判断第二条件
    2.聚合函数: 将一列数据作为一个整体,经i选哪个纵向的计算
    count:计算格数
    max: 计算最大值
    min:计算最小值
    sun:计算和
    avg:计算平均值
    SELECT COUNT(id)FROM student;
    SELECT COUNT(
    )FROM student;
    SELECT COUNT(IFNULL(english,0))FROM student;

    SELECT MAX(math)FROM student;

    SELECT MIN(math)FROM student;

    SELECT SUM(math)FROM student;

    SELECT AVG(math)FROM student;
    *注意:聚合函数的计算,派出null值
    解决方案:
    1.选择不包含非空的列进行计算
    2.IFNULL函数
    3.分组查询
    *语法:group by 分组字段;
    – 按照性别,分别查询 男 女同学的平均分
    SELECT sex,AVG(math)FROM student GROUP BY sex;
    – 按照性别,分别查询 男 女同学的平均分 人数
    SELECT sex,AVG(math), COUNT(id)FROM student GROUP BY sex;
    – 按照性别,分别查询 男 女同学的平均分 人数 分数低于70不参与分组
    SELECT sex,AVG(math), COUNT(id)FROM student WHERE math>70 GROUP BY sex;
    – 按照性别,分别查询 男 女同学的平均分 人数 分数低于70不参与分组 分组之后人数大于2个
    SELECT sex,AVG(math), COUNT(id)FROM student WHERE math>70 GROUP BY sex HAVING COUNT(id)>2;
    注意:
    1.分组之后查询的字段:分组字段,聚合函数
    2.where 和having 的区别?
    1.where在分组之前进行限定,如果不满足条件,则不参与分组,having在分组之后进行 限定,如果不满足结果,则不会被查询出来。
    2.where后不可以跟聚合函数,having可以进行聚合函数的判断
    在聚合函数后面起别名 having 后面就可以根据起的别名进行判断。

    4.分页查询
    *语法:limit 开始索引,每页查询的条数;
    公式:开始的索引=(当前的页码-1)*每页显示的条数
    例如第二页:(2-1)*3=6
    – 每页显示3条记录
    SELECT *FROM student LIMIT 0,3;-- 第一页
    SELECT *FROM student LIMIT 3,3;-- 第二页
    SELECT *FROM student LIMIT 6,3;-- 第三页
    注意:limit是一个mysql的 方言

    前面四个模块的都是单表查询

    约束
    概念:对表中的数据进行限定,保证数据的正确性,有效性和完整性
    四种约束的分类
    按住shift+tab 缩进回来
    1.主键约束:primary key
    注意:
    1. 含义:并且且唯一
    2.一张表只能有一个字段为主键
    3.主键就是表中记录的唯一标识
    – 删除主键
    ALTER TABLE stu DROP PRIMARY KEY;
    – 创建完表后,添加主键
    ALTER TABLE stu MODIFY id INT PRIMARY KEY;
    自动增长: 只跟上一条记录有关

    • 概念:如果某一列的数值类型的,使用auto_increment 可以来完成值的自动增长
      CREATE TABLE stu(
      id INT PRIMARY KEY AUTO_INCREMENT,
      NAME VARCHAR(32)
      );
      – 删除自动增长
      ALTER TABLE stu MODIFY id INT;
      – 添加自动增长
      ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

    2.非空约束:not null 某一列的值不能为null
    – 创建表添加非空约束
    CREATE TABLE stu(
    id INT,
    NAME VARCHAR(32) NOT NULL
    );
    – 删除name的非空约束
    ALTER TABLE stu MODIFY NAME VARCHAR(20);
    – 创建表完后,添加非空约束
    ALTER TABLE stu MODIFY NAME VARCHAR(30) NOT NULL;

    3.唯一约束:unique 某一列的值不能重复
    1.注意:
    *唯一约束可以有null值,但是只能有一条记录为null
    2. – 在创建表时,添加是唯一约束
    CREATE TABLE stu(
    id INT,
    phone_name VARCHAR(32) UNIQUE
    );
    3 – 删除唯一约束
    ALTER TABLE stu DROP INDEX phone_name ;
    4 – 在创建表完成后,添加唯一约束
    ALTER TABLE stu MODIFY phone_name VARCHAR(32) UNIQUE;

    4.外键约束:foreign key 让表产生关系,从而保证数据的正确性
    1.在创建表时,可以添加外键
    *语法:
    create table 表名(
    语法:
    。。。。
    外键列
    constranint 外键名称 foregin key 外键列名称 references 主表名称(主表列名称)
    );
    2,删除外键
    alter table 表名 drop foreign key 外键名称;
    3.创建表之后,添加外键
    alter table 表名 add constraint 外键名称 forgeign key(外键字段名称) references 主表名称(主表列名称);
    在这里插入图片描述
    多表之间的关系
    在这里插入图片描述
    实现方式
    一对多
    在这里插入图片描述
    在多的一方建立外键,指向一的一方的主键
    实现方式
    多对多
    必须有两个字段
    在这里插入图片描述
    实现方式
    一对一
    在这里插入图片描述
    案例
    在这里插入图片描述
    – 创建旅游线路分类表 tab_category
    – cid 旅游线路分类主键,自动增长
    – cname 旅游线路分类名称非空,唯一,字符串 100
    create table tab_category (
    cid int primary key auto_increment,
    cname varchar(100) not null unique
    )
    – 添加旅游线路分类数据:
    insert into tab_category (cname) values (‘周边游’), (‘出境游’), (‘国内游’), (‘港澳游’);
    select * from tab_category;
    – 创建旅游线路表 tab_route
    /

    rid 旅游线路主键,自动增长
    rname 旅游线路名称非空,唯一,字符串 100
    price 价格
    rdate 上架时间,日期类型
    cid 外键,所属分类
    /
    create table tab_route(
    rid int primary key auto_increment,
    rname varchar(100) not null unique,
    price double,
    rdate date,
    cid int,
    foreign key (cid) references tab_category(cid)
    )
    – 添加旅游线路数据
    INSERT INTO tab_route VALUES
    (NULL, ‘【厦门+鼓浪屿+南普陀寺+曾厝垵 高铁 3 天 惠贵团】尝味友鸭面线 住 1 晚鼓浪屿’, 1499,
    ‘2018-01-27’, 1),
    (NULL, ‘【浪漫桂林 阳朔西街高铁 3 天纯玩 高级团】城徽象鼻山 兴坪漓江 西山公园’, 699, ‘2018-02-
    22’, 3),
    (NULL, ‘【爆款¥1699 秒杀】泰国 曼谷 芭堤雅 金沙岛 杜拉拉水上市场 双飞六天【含送签费 泰风情 广州
    往返 特价团】’, 1699, ‘2018-01-27’, 2),
    (NULL, ‘【经典•狮航 ¥2399 秒杀】巴厘岛双飞五天 抵玩【广州往返 特价团】’, 2399, ‘2017-12-23’,
    2),
    (NULL, ‘香港迪士尼乐园自由行 2 天【永东跨境巴士广东至迪士尼去程交通+迪士尼一日门票+香港如心海景酒店
    暨会议中心标准房 1 晚住宿】’, 799, ‘2018-04-10’, 4);
    select * from tab_route;
    /

    创建用户表 tab_user
    uid 用户主键,自增长
    username 用户名长度 100,唯一,非空
    password 密码长度 30,非空
    name 真实姓名长度 100
    birthday 生日
    sex 性别,定长字符串 1
    telephone 手机号,字符串 11
    email 邮箱,字符串长度 100
    /
    create table tab_user (
    uid int primary key auto_increment,
    username varchar(100) unique not null,
    password varchar(30) not null,
    name varchar(100),
    birthday date,
    sex char(1) default ‘男’,
    telephone varchar(11),
    email varchar(100)
    )
    – 添加用户数据
    INSERT INTO tab_user VALUES
    (NULL, ‘cz110’, 123456, ‘老王’, ‘1977-07-07’, ‘男’, ‘13888888888’, ‘66666@qq.com’),
    (NULL, ‘cz119’, 654321, ‘小王’, ‘1999-09-09’, ‘男’, ‘13999999999’, ‘99999@qq.com’);
    select * from tab_user;
    /

    创建收藏表 tab_favorite
    rid 旅游线路 id,外键
    date 收藏时间
    uid 用户 id,外键
    rid 和 uid 不能重复,设置复合主键,同一个用户不能收藏同一个线路两次
    */
    create table tab_favorite (
    rid int,
    date datetime,
    uid int,
    – 创建复合主键
    primary key(rid,uid),
    foreign key (rid) references tab_route(rid),
    foreign key(uid) references tab_user(uid)
    )

    范式
    在这里插入图片描述

    数据库的备份和还原
    1.命令行:
    语法:
    备份:mysqldump -u账户 -p密码 数据库名称>保存的路径
    还原:
    1.登录数据库
    2.创建数据库
    3.使用数据库
    4.执行文件 。source 文件路径

    2.图形化工具

    day3
    例子:
    #创建部门表
    CREATE TABLE dept(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
    )
    INSERT INTO dept (NAME) VALUES (‘开发部’),(‘市场部’),(‘财务部’);
    #创建员工表
    CREATE TABLE emp (
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(10),
    gender CHAR(1), – 性别
    salary DOUBLE, – 工资
    join_date DATE, – 入职日期
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES dept(id)
    )
    – 外键,关联部门表(部门表的主键) )
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘孙悟空’,‘男’,7200,‘2013-02-24’,1);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘猪八戒’,‘男’,3600,‘2010-12-02’,2);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘唐僧’,‘男’,9000,‘2008-08-08’,2);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘白骨精’,‘女’,5000,‘2015-10-07’,3);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘蜘蛛精’,‘女’,4500,‘2011-03-14’,1);

    笛卡尔积:
    有两个集合 A,B取这两个集合的所有组成情况
    要完成多表查询,需要消除无用的数据

    多表的查询

    多表查询的分类:
    1.内连接查询
    隐式的内连接:
    – 查询所有员工信息和对应的部门信息
    SELECT * FROM emp,dept WHERE emp.dept_id=dept.id;
    – 查询员工表的名称,性别,部门表的名称
    SELECT emp.name, emp.gender, dept.name FROM emp,dept WHERE emp.dept_id=dept.id;
    – 简化
    SELECT
    t1.name,
    t1.gender,
    t2.name
    FROM
    emp t1,
    dept t2
    WHERE
    t1.id=t2.id;
    显示内连接
    语法:select 字段列表 from 表名1(inner)join 表名2 on 条件
    例如:
    SELECT *FROM emp INNER JOIN dept ON emp.dept_id=dept.id;
    SELECT *FROM emp JOIN dept ON emp.dept_id=dept.id;
    使用内连接查询的条件:
    1.从哪些表中查询数据
    2.条件是什么
    3.查询哪些字段

    2.外连接查询
    1.左外连接
    *语法:select 字段列表 from 表1 left(outer) join 表2 on 条件

    • 查询的是左表所有数据以及其交集部分 交集部分就是条件( t1.dept_id=t2.`id)
    • 其实内连接就是查询交集的部分
      – 查询所有的员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称
      SELECT t1.,t2.nameFROM emp t1 LEFT JOIN dept t2 ON t1.dept_id=t2.id;
      2.右外连接
      *
      *语法:select 字段列表 from 表1 right(outer) join 表2 on 条件
      查询的是右表所有数据以及其交集部分
      怎么区分左右表呢?
      emp t1 LEFT JOIN dept t2
      emp就称为左表
      dept就称为右表

    3.子查询
    概念:查询中嵌套查询,称嵌套查询为子查询
    – 查询工资最高的员工信息
    – 查询最高的工资是多少
    SELECT MAX(salary) FROM emp;
    – 查询员工信心, 并且工资等于9000的
    SELECT *FROM emp WHERE emp.salary=9000;
    – 一条sql就完成这个操作 子查询
    SELECT *FROM emp WHERE emp.salary=(SELECT MAX(salary) FROM emp);

    子查询不同情况
    1.子查询的结果是单行单列的:
    *子查询可以作为条件,使用运算符去判断 运算符:> < >= <= =
    – 查询员工工资小于平均工资的人
    SELECT * FROM emp WHERE emp.salary<(SELECT AVG(salary)FROM emp);
    2.子查询的结果是多行单列的:
    *子查询可以作为条件,使用运算符in来判断
    – 查询 财务部和市场部所有的员工信息
    SELECT id FROM dept WHERE NAME='财务部’OR NAME=‘市场部’;
    SELECT *FROM emp WHERE dept_id=3 OR dept_id=2;
    SELECT *FROM emp WHERE dept_id IN(SELECT id FROM dept WHERE NAME='财务部’OR NAME=‘市场部’);
    3.子查询的结果是多行多列的:
    *子查询可以作为一张虚拟表参与查询
    – 查询员工入职日期2011-11-11日之后的员工信息和部门信息
    SELECT * FROM emp WHERE emp.join_date>‘2011-11-11’;
    SELECT *FROM dept t1,(SELECT * FROM emp WHERE emp.join_date>‘2011-11-11’) t2
    WHERE t1.id=t2.dept_id;
    – 普通内连接
    SELECT *FROM emp t1,dept t2 WHERE t1.dept_id=t2.idAND t1.join_date>‘2011-11-11’;

    多表查询的练习
    – 部门表
    CREATE TABLE dept (
    id INT PRIMARY KEY PRIMARY KEY, – 部门id
    dname VARCHAR(50), – 部门名称
    loc VARCHAR(50) – 部门所在地
    );

    – 添加4个部门
    INSERT INTO dept(id,dname,loc) VALUES
    (10,‘教研部’,‘北京’),
    (20,‘学工部’,‘上海’),
    (30,‘销售部’,‘广州’),
    (40,‘财务部’,‘深圳’);

    – 职务表,职务名称,职务描述
    CREATE TABLE job (
    id INT PRIMARY KEY,
    jname VARCHAR(20),
    description VARCHAR(50)
    );

    – 添加4个职务
    INSERT INTO job (id, jname, description) VALUES
    (1, ‘董事长’, ‘管理整个公司,接单’),
    (2, ‘经理’, ‘管理部门员工’),
    (3, ‘销售员’, ‘向客人推销产品’),
    (4, ‘文员’, ‘使用办公软件’);

    – 员工表
    CREATE TABLE emp (
    id INT PRIMARY KEY, – 员工id
    ename VARCHAR(50), – 员工姓名
    job_id INT, – 职务id
    mgr INT , – 上级领导
    joindate DATE, – 入职日期
    salary DECIMAL(7,2), – 工资
    bonus DECIMAL(7,2), – 奖金
    dept_id INT, – 所在部门编号
    CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
    CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
    );

    – 添加员工
    INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES
    (1001,‘孙悟空’,4,1004,‘2000-12-17’,‘8000.00’,NULL,20),
    (1002,‘卢俊义’,3,1006,‘2001-02-20’,‘16000.00’,‘3000.00’,30),
    (1003,‘林冲’,3,1006,‘2001-02-22’,‘12500.00’,‘5000.00’,30),
    (1004,‘唐僧’,2,1009,‘2001-04-02’,‘29750.00’,NULL,20),
    (1005,‘李逵’,4,1006,‘2001-09-28’,‘12500.00’,‘14000.00’,30),
    (1006,‘宋江’,2,1009,‘2001-05-01’,‘28500.00’,NULL,30),
    (1007,‘刘备’,2,1009,‘2001-09-01’,‘24500.00’,NULL,10),
    (1008,‘猪八戒’,4,1004,‘2007-04-19’,‘30000.00’,NULL,20),
    (1009,‘罗贯中’,1,NULL,‘2001-11-17’,‘50000.00’,NULL,10),
    (1010,‘吴用’,3,1006,‘2001-09-08’,‘15000.00’,‘0.00’,30),
    (1011,‘沙僧’,4,1004,‘2007-05-23’,‘11000.00’,NULL,20),
    (1012,‘李逵’,4,1006,‘2001-12-03’,‘9500.00’,NULL,30),
    (1013,‘小白龙’,4,1004,‘2001-12-03’,‘30000.00’,NULL,20),
    (1014,‘关羽’,4,1007,‘2002-01-23’,‘13000.00’,NULL,10);

    – 工资等级表
    CREATE TABLE salarygrade (
    grade INT PRIMARY KEY, – 级别
    losalary INT, – 最低工资
    hisalary INT – 最高工资
    );

    – 添加5个工资等级
    INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
    (1,7000,12000),
    (2,12010,14000),
    (3,14010,20000),
    (4,20010,30000),
    (5,30010,99990);

    – 需求:
    – 1.查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述
    /*
    分析 需要查询两个表 一个是emp job
    查询条件 emp.job_id=job.id
    */
    SELECT
    t1.id,
    t1.ename,
    t1.salary,
    t2.jname,
    t2.description
    FROM
    emp t1 ,job t2
    WHERE
    t1.job_id=t2.id

    – 2.查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
    /*
    三张表
    查询条件:t1.job_id=t2.id AND t1.dept_id=t3.id;
    emp.
    */
    SELECT
    t1.id,
    t1.ename,
    t1.salary,
    t2.jname,
    t2.description,
    t3.dname,
    t3.loc
    FROM
    emp t1 ,job t2,dept t3
    WHERE
    t1.job_id=t2.id AND t1.dept_id=t3.id;

    – 3.查询员工姓名,工资,工资等级
    /*
    这两张表没有关连
    查询条件:
    emp.salary>=salarygrade.losalary and emp.salary<=slarygrade.hisalary
    emp.salary between salarygrade.losalary and slarygrade.hisalary
    工资 必须在对大值和最小值之间
    */
    SELECT
    t1.ename,
    t1.salary,
    t2.grade
    FROM
    emp t1, salarygrade t2
    WHERE
    t1.salary BETWEEN t2.losalaryAND t2.hisalary;

    – 4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
    /*
    四张表
    查询条件:t1.job_id=t2.id AND t1.dept_id=t3.id; emp.salary between salarygrade.losalary and slarygrade.hisalary

    /
    SELECT
    t1.ename,
    t1.salary,
    t2.jname,
    t2.description,
    t3.dname,
    t3.loc,
    t4.grade
    FROM
    emp t1, job t2, dept t3 ,salarygrade t4
    WHERE
    t1.job_id=t2.idAND t1.dept_id=t3.idAND t1.salary BETWEEN t4.losalaryAND t4.hisalary;
    – 5.查询出部门编号、部门名称、部门位置、部门人数
    /

    1.部门编号 部门名称 部门位置 dept表 部门人数 emp表
    2.使用分组查询 按照emp,dept_id 完成分组 查询count(id)
    3.使用子查询将第2步的查询结果和dept表进行关联查询

    */
    SELECT
    t1.id,t1.dname,t1.loc,t2.total
    FROM
    dept t1 ,
    (SELECT
    dept_id, COUNT(id) total
    FROM
    emp
    GROUP BY dept_id ) t2
    WHERE t1.id=t2.dept_id;

    – 6.查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询
    /*
    分析: 1.姓名 emp 直接上级的姓名 emp
    emp表中的id和mgr 是自关联
    2条件emp.id=emp.mgr
    3.查询左表的所有数据和交集数据
    使用左外连接查询
    */
    SELECT
    t1.ename,
    t1.mgr,
    t2.id,
    t2.ename
    FROM
    emp t1 LEFT JOIN emp t2 ON t1.mgr=t2.id;

    事务
    1.事务的基本介绍
    概念:如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
    在这里插入图片描述
    操作步骤:
    1.开启事务:start transaction;
    2.回滚:rollback;
    3.提交:commit;
    在这里插入图片描述

    控制台gbk 数据库是uf-8

    在这里插入图片描述

    2.事务的四大特征
    1.原子性:事务是原子性的 原子是不可在分割的最小操作单位 要么同时成功 要么同时失败
    2.持久性:一旦事务 提交或者回滚 数据库会持久化的保存数据
    3.隔离性:多个事务相互独立
    4.一致性:事务操作前后,数据总量不变
    3.事务隔离级别
    在这里插入图片描述
    在这里插入图片描述
    DCL
    管理用户 授权
    DBA 数据库管理员
    DCL:管理用户,授权
    1. 管理用户
    1. 添加用户:
    * 语法:CREATE USER ‘用户名’@‘主机名’ IDENTIFIED BY ‘密码’;
    2. 删除用户:
    * 语法:DROP USER ‘用户名’@‘主机名’;
    3. 修改用户密码:
    UPDATE USER SET PASSWORD = PASSWORD(‘新密码’) WHERE USER = ‘用户名’;
    UPDATE USER SET PASSWORD = PASSWORD(‘abc’) WHERE USER = ‘lisi’;
    SET PASSWORD FOR ‘用户名’@‘主机名’ = PASSWORD(‘新密码’);
    SET PASSWORD FOR ‘root’@‘localhost’ = PASSWORD(‘123’);
    * mysql中忘记了root用户的密码?
    1. cmd – > net stop mysql 停止mysql服务
    * 需要管理员运行该cmd
    2. 使用无验证方式启动mysql服务: mysqld --skip-grant-tables
    3. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
    4. use mysql;
    5. update user set password = password(‘你的新密码’) where user = ‘root’;
    6. 关闭两个窗口
    7. 打开任务管理器,手动结束mysqld.exe 的进程
    8. 启动mysql服务
    9. 使用新密码登录。
    4. 查询用户:
    – 1. 切换到mysql数据库
    USE myql;
    – 2. 查询user表
    SELECT * FROM USER;
    * 通配符: % 表示可以在任意主机使用用户登录数据库
    2. 权限管理:
    1. 查询权限:
    – 查询权限
    SHOW GRANTS FOR ‘用户名’@‘主机名’;
    SHOW GRANTS FOR ‘lisi’@’%’;
    2. 授予权限:
    – 授予权限
    grant 权限列表 on 数据库名.表名 to ‘用户名’@‘主机名’;
    – 给张三用户授予所有权限,在任意数据库任意表上
    GRANT ALL ON . TO ‘zhangsan’@‘localhost’;
    3. 撤销权限:
    – 撤销权限:
    revoke 权限列表 on 数据库名.表名 from ‘用户名’@‘主机名’;
    REVOKE UPDATE ON db3.account FROM ‘lisi’@’%’;
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    JDBC day1
    JDBC就是用Java语言操作数据库
    1.JDBC基本概念
    概念:Java DateBase Connectivity Java 数据库连接,Java语言操作数据
    JDBC本质:只是一个接口 每个数据库的规范 就是实现类的接口
    其实是官方 定义的一套操作所有关系型数据库的规则,就是接口,各个数据库厂商去实现这套接口,提供数据库驱动jar包,我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

    在这里插入图片描述
    把这个上面的取消掉可以使包分层
    2.快速入门
    步骤:
    1.导入驱动jar包
    2.注册驱动
    3.获取数据库连接对象 Connection
    4.定义sql
    5.获取执行sql语句的对象 statement
    6.执行sql ,接受返回结果
    7.处理结果
    8.释放资源
    public class jdbcDemo1 {
    public static void main(String[] args) throws Exception {
    Class.forName(“com.mysql.jdbc.Driver”);
    Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/loner”, “root”, “root”);
    String sql=“UPDATE student SET age=13 WHERE id=1”;
    Statement stmt = conn.createStatement();
    int count = stmt.executeUpdate(sql);
    System.out.println(count);
    stmt.close();
    conn.close();

    3.对JDBC中各个接口和类详解
    1.DriverManager:驱动管理对象
    在这里插入图片描述
    在这里插入图片描述

    2.Connection:数库库连接对象
    1.功能:
    1.获取执行sql的对象
    * statement createStatement()
    * *Preparedstatement prepareStatement(String sql)
    2.管理事务:
    *开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false 即开启事务
    *提交事务:commit()
    *回滚事务:rollback()
    3.Statement:执行sql的对象
    1.执行sql
    1.boolean execute(string sql):可以执行任意的sql 了解
    2.int executeUpdate(string sql):执行DML(执行增删改)(inset update delete)语句 DDL(create alter drop)语句。
    *返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功,返回值>0的则执行成功 反之 则失败
    3.ResultSet executeQuery(string sql):执行DQL(select)语句
    什么是内存泄漏?
    内存用着用着就小了,为什么会小 因为程序一直有垃圾注入的内存里面没有被释放,内存积压的就会越来越多。
    提升作用域 判断释放资源的是否为null 防止空指针异常
    public class jdbcDemo2 {
    public static void main(String[] args) {
    Connection conn=null;
    Statement sta=null;
    try {
    Class.forName(“com.mysql.jdbc.Driver”);
    String sql=“INSERT INTO student VALUES(10,‘莅临为’,12,‘男’,‘杭州’,23,24 )”;
    conn = DriverManager.getConnection(“jdbc:mysql:///loner”, “root”, “root”);
    sta = conn.createStatement();
    int count = sta.executeUpdate(sql);
    System.out.println(count);
    if (count>0){
    System.out.println(“添加成功”);
    }else {
    System.out.println(“添加失败”);
    }
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (SQLException e) {
    e.printStackTrace();
    }finally {
    if (sta!=null){
    try {
    sta.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    if (conn!=null){
    try {
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }
    }
    }
    5.ResultSet:结果集对象,封装查询结果
    列表就是一个结果对象
    结果集对象也是一种资源 也要关闭他。
    *boolean next():游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false 如果不是则返回true
    *getXxx(参数):获取数据
    *Xxx:代表数据类型 如: int getInt(), String getString()
    参数:
    1.int :代表列的编号 从1开始 如: getstring(1)
    2.string :代表列名称 如: getDouble(“balance”)
    注意:
    使用步骤:
    1.游标向下移动一行
    2.判断是否有数据
    3.获取数据
    public static void main(String[] args) {
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    try {
    //1. 注册驱动
    Class.forName(“com.mysql.jdbc.Driver”);
    //2.获取连接对象
    conn = DriverManager.getConnection(“jdbc:mysql:///db3”, “root”, “root”);
    //3.定义sql
    String sql = “select * from account”;
    //4.获取执行sql对象
    stmt = conn.createStatement();
    //5.执行sql
    rs = stmt.executeQuery(sql);
    //6.处理结果
    //循环判断游标是否是最后一行末尾。
    while(rs.next()){
    //获取数据
    //6.2 获取数据
    int id = rs.getInt(1);
    String name = rs.getString(“name”);
    double balance = rs.getDouble(3);
    System.out.println(id + “—” + name + “—” + balance);
    }
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (SQLException e) {
    e.printStackTrace();
    } finally {
    //7.释放资源
    if(rs != null){
    try {
    rs.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    if(stmt != null){
    try {
    stmt.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    if(conn != null){
    try {
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }
    }
    练习:
    定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
    1.定义Emp类
    /

    • 封装Emp表数据的JavaBean
      /
      public class Emp {
      private int id;
      private String ename;
      private int job_id;
      private int mgr;
      private Date joindate;
      private double salary;
      private double bonus;
      private int dept_id;
      get和set tostring 方法省略
      2.定义方法 public Llist findAll(){}
      /
      *

      • 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
        */
        public class JDBCDemo8 {

      public static void main(String[] args) {
      List list = new JDBCDemo8().findAll2();
      System.out.println(list);
      System.out.println(list.size());
      }
      /**

      • 查询所有emp对象

      • @return
        */
        public List findAll(){
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        List list = null;
        try {
        //1.注册驱动
        Class.forName(“com.mysql.jdbc.Driver”);
        //2.获取连接
        conn = DriverManager.getConnection(“jdbc:mysql:///db3”, “root”, “root”);
        //3.定义sql
        String sql = “select * from emp”;
        //4.获取执行sql的对象
        stmt = conn.createStatement();
        //5.执行sql
        rs = stmt.executeQuery(sql);
        //6.遍历结果集,封装对象,装载集合
        Emp emp = null;
        list = new ArrayList();
        while(rs.next()){
        //获取数据
        int id = rs.getInt(“id”);
        String ename = rs.getString(“ename”);
        int job_id = rs.getInt(“job_id”);
        int mgr = rs.getInt(“mgr”);
        Date joindate = rs.getDate(“joindate”);
        double salary = rs.getDouble(“salary”);
        double bonus = rs.getDouble(“bonus”);
        int dept_id = rs.getInt(“dept_id”);
        // 创建emp对象,并赋值
        emp = new Emp();
        emp.setId(id);
        emp.setEname(ename);
        emp.setJob_id(job_id);
        emp.setMgr(mgr);
        emp.setJoindate(joindate);
        emp.setSalary(salary);
        emp.setBonus(bonus);
        emp.setDept_id(dept_id);
        //装载集合
        list.add(emp);
        }

        } catch (ClassNotFoundException e) {
        e.printStackTrace();
        } catch (SQLException e) {
        e.printStackTrace();
        }finally {
        if(rs != null){
        try {
        rs.close();
        } catch (SQLException e) {
        e.printStackTrace();
        }
        }

         if(stmt != null){
             try {
                 stmt.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
        
         if(conn != null){
             try {
                 conn.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
        

        }
        return list;
        }
        3.实现方法 select * from emp;
        获取完数据封装对象(会引用很多emp 占内存 创建emp应用 然后复用就可以了)
        装载集合肯定要在遍历之前
        6.Preparedstatement:执行sql的对象
        1.Sql注入问题:在拼接sql时,有一些sql的特殊关键字与字符串的拼接,会造成安全性问题
        1.输入用户随便,输入密码:a’ or ‘a’ = ‘a
        2.sql:select * from user where username =‘sdfsdfas’ and password=a’ or ‘a’ = 'a
        2.解决sql注入问题:使用preparedstatement对象来解决
        3.预编译的SQL:参数使用?作为占位符
        在这里插入图片描述
        练习 在案例里面login2

    抽取JDBC工具类:JDBCUtuils
    目的:简化书写
    分析:
    1.注册驱动也抽取
    2.抽取一个方法获取连接对象
    3.抽取一个方法释放资源
    静态代码块给成员变量一赋值就可以用了
    /**
    *** JDBC工具类**
    /
    public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    /
    *
    * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
    /
    static{
    //读取资源文件,获取值。
    try {
    //1. 创建Properties集合类。
    Properties pro = new Properties();
    //获取src路径下的文件的方式—>ClassLoader 类加载器
    ClassLoader classLoader = JDBCUtils.class.getClassLoader();
    URL res = classLoader.getResource(“jdbc.properties”);
    String path = res.getPath();
    // System.out.println(path);///D:/IdeaProjects/itcast/out/production/day04_jdbc/jdbc.properties
    //2. 加载文件
    // pro.load(new FileReader(“D:\IdeaProjects\itcast\day04_jdbc\src\jdbc.properties”));
    pro.load(new FileReader(path));
    //3. 获取数据,赋值
    url = pro.getProperty(“url”);
    user = pro.getProperty(“user”);
    password = pro.getProperty(“password”);
    driver = pro.getProperty(“driver”);
    //4. 注册驱动
    Class.forName(driver);
    } catch (IOException e) {
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    }
    /
    *
    * 获取连接
    * @return 连接对象
    /
    public static Connection getConnection() throws SQLException {
    return DriverManager.getConnection(url, user, password);
    }
    /
    *
    * 释放资源
    * @param stmt
    * @param conn
    /
    public static void close(Statement stmt,Connection conn){
    if( stmt != null){
    try {
    stmt.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    if( conn != null){
    try {
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }
    /
    *
    * 释放资源
    * @param stmt
    * @param conn
    /
    public static void close(ResultSet rs,Statement stmt, Connection conn){
    if( rs != null){
    try {
    rs.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    if( stmt != null){
    try {
    stmt.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    if( conn != null){
    try {
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }
    }
    练习:
    需求:
    1.通过键盘录入用户名和密码
    2.判断用户是否登录成功
    /
    *

    • 练习:
    •  * 需求:
      
    •  	1. 通过键盘录入用户名和密码
      
    •  	2. 判断用户是否登录成功
      

    /
    public class JDBCDemo9 {
    public static void main(String[] args) {
    //1.键盘录入,接受用户名和密码
    Scanner sc = new Scanner(System.in);
    System.out.println(“请输入用户名:”);
    String username = sc.nextLine();
    System.out.println(“请输入密码:”);
    String password = sc.nextLine();
    //2.调用方法
    boolean flag = new JDBCDemo9().login2(username, password);
    //3.判断结果,输出不同语句
    if(flag){
    //登录成功
    System.out.println(“登录成功!”);
    }else{
    System.out.println(“用户名或密码错误!”);
    }
    }
    /
    *
    * 登录方法
    /
    public boolean login(String username ,String password){
    if(username == null || password == null){
    return false;
    }
    //连接数据库判断是否登录成功
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    //1.获取连接
    try {
    conn = JDBCUtils.getConnection();
    //2.定义sql
    String sql = “select * from user where username = '”+username+"’ and password = ‘"+password+"’ ";
    System.out.println(sql);
    //3.获取执行sql的对象
    stmt = conn.createStatement();
    //4.执行查询
    rs = stmt.executeQuery(sql);
    //5.判断
    /
    if(rs.next()){//如果有下一行,则返回true
    return true;
    }else{
    return false;
    }/
    return rs.next();//如果有下一行,则返回true
    } catch (SQLException e) {
    e.printStackTrace();
    }finally {
    JDBCUtils.close(rs,stmt,conn);
    }
    return false;
    }
    /**
    * 登录方法,使用PreparedStatement实现
    /
    public boolean login2(String username ,String password){
    if(username == null || password == null){
    return false;
    }
    //连接数据库判断是否登录成功
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    //1.获取连接
    try {
    conn = JDBCUtils.getConnection();
    //2.定义sql
    String sql = “select * from user where username = ? and password = ?”;
    //3.获取执行sql的对象
    pstmt = conn.prepareStatement(sql);
    //给?赋值
    pstmt.setString(1,username);
    pstmt.setString(2,password);
    //4.执行查询,不需要传递sql
    rs = pstmt.executeQuery();
    //5.判断
    /
    if(rs.next()){//如果有下一行,则返回true
    return true;
    }else{
    return false;
    }
    /
    return rs.next();//如果有下一行,则返回true
    } catch (SQLException e) {
    e.printStackTrace();
    }finally {
    JDBCUtils.close(rs,pstmt,conn);
    }
    return false;
    }
    }
    JDBC控制事务
    1.事务:一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这个多个步骤要么同时成功呢,要么同时失败
    2.操作:
    1.开启事务
    2.提交事务
    3.回滚事务
    3.使用connection对象来管理事务
    *开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false 即开启事务
    在执行sql之前开启事务
    提交事务:commit()
    当所有sql都执行完提交事务
    回滚事务:rollback()
    在catch中回滚事务
    JDBC控制事务实现
    /

    • 事务操作
      */
      public class JDBCDemo10 {
      public static void main(String[] args) {
      Connection conn = null;
      PreparedStatement pstmt1 = null;
      PreparedStatement pstmt2 = null;
      try {
      //1.获取连接
      conn = JDBCUtils.getConnection();
      //开启事务
      conn.setAutoCommit(false);
      //2.定义sql
      //2.1 张三 - 500
      String sql1 = “update account set balance = balance - ? where id = ?”;
      //2.2 李四 + 500
      String sql2 = “update account set balance = balance + ? where id = ?”;
      //3.获取执行sql对象
      pstmt1 = conn.prepareStatement(sql1);
      pstmt2 = conn.prepareStatement(sql2);
      //4. 设置参数
      pstmt1.setDouble(1,500);
      pstmt1.setInt(2,1);
      pstmt2.setDouble(1,500);
      pstmt2.setInt(2,2);
      //5.执行sql
      pstmt1.executeUpdate();
      // 手动制造异常
      int i = 3/0;
      pstmt2.executeUpdate();
      //提交事务
      conn.commit();
      } catch (Exception e) {
      //事务回滚
      try {
      if(conn != null) {
      conn.rollback();
      }
      } catch (SQLException e1) {
      e1.printStackTrace();
      }
      e.printStackTrace();
      }finally {
      JDBCUtils.close(pstmt1,conn);
      JDBCUtils.close(pstmt2,null);
      }
      }
      }

    JDBC连接池 day2
    1.数据库连接池
    概念:其实就是一个容器(集合),存放数据库连接的容器
    当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器
    好处:
    1.节约资源
    2.用户访问高效
    3 实现:
    1.标准接口:DataSource javax.sql包下的
    方法:
    *获取连接:getConnection()
    *归还连接:Connection.close(),如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接
    2.一般我们不去实现他,有数据库厂商来实现
    1.C3P0:数据库连接池技术
    步骤:
    1.导入jar包(两个)c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
    不要忘记导入数据库驱动jar包
    2.定义配置文件;
    名称: c3p0.properties 或者c3p0-config.xml
    路径直接将文件放在src目录下即可
    3.创建核心对象 数据库连接池对象 combopooledDataSource
    4.获取连接:getConnection
    在这里插入图片描述

    2.Druid:数据库连接池实现技术,由阿里巴巴提供的
    步骤:
    1.导入jar包 druid-1.0.9jar
    2.定义配置文件
    *是properties形式的
    *可以叫任意名称 ,可以放在任意的目录下
    获取配置文件使用properties集合
    3.获取数据库连接池对象:通过工厂类来获取,Druid
    4.获取连接:getConnection
    public class DruidDemo {
    public static void main(String[] args) throws Exception {
    //1.导入jar包
    //2.定义配置文件
    //3.加载配置文件
    /*Properties pro = new Properties();
    InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream(“druid.properties”);
    pro.load(is);
    //4.获取连接池对象
    DataSource ds = DruidDataSourceFactory.createDataSource(pro);

        //5.获取连接
        Connection conn = ds.getConnection();
        System.out.println(conn);*/
        Properties pro = new Properties();
        InputStream os = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
        pro.load(os);
        DataSource ds = new DruidDataSourceFactory().createDataSource(pro);
        Connection conn = ds.getConnection();
        System.out.println(conn);
    

    2.定义工具类
    1.定义一个类 JDBCUtils
    2.提供静态代码块加载配置文件,初始化连接对象
    3.提供方法
    1.获取连接方法:通过数据库连接池获取连接
    2.释放资源
    3.获取连接池的方法

    /**

    • Druid连接池的工具类
      */
      public class JDBCUtils {

      //1.定义成员变量 DataSource
      private static DataSource ds ;

      static{
      try {
      //1.加载配置文件
      Properties pro = new Properties();
      pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream(“druid.properties”));
      //2.获取DataSource
      ds = DruidDataSourceFactory.createDataSource(pro);
      } catch (IOException e) {
      e.printStackTrace();
      } catch (Exception e) {
      e.printStackTrace();
      }
      }

      /**

      • 获取连接
        */
        public static Connection getConnection() throws SQLException {
        return ds.getConnection();
        }

      /**

      • 释放资源
        /
        public static void close(Statement stmt,Connection conn){
        /
        if(stmt != null){
        try {
        stmt.close();
        } catch (SQLException e) {
        e.printStackTrace();
        }
        }

        if(conn != null){
        try {
        conn.close();//归还连接
        } catch (SQLException e) {
        e.printStackTrace();
        }
        }*/

        close(null,stmt,conn);
        }

      public static void close(ResultSet rs , Statement stmt, Connection conn){
      if(rs != null){
      try {
      rs.close();
      } catch (SQLException e) {
      e.printStackTrace();
      }
      }
      if(stmt != null){
      try {
      stmt.close();
      } catch (SQLException e) {
      e.printStackTrace();
      }
      }

       if(conn != null){
           try {
               conn.close();//归还连接
           } catch (SQLException e) {
               e.printStackTrace();
           }
       }
      

      }

      /**

      • 获取连接池方法
        */

      public static DataSource getDataSource(){
      return ds;
      }
      }
      工具类测试:
      public static void main(String[] args) {
      /*
      * 完成添加操作:给account表添加一条记录
      */
      Connection conn = null;
      PreparedStatement pstmt = null;
      try {
      //1.获取连接
      conn = JDBCUtils.getConnection();
      //2.定义sql
      String sql = “insert into account values(null,?,?)”;
      //3.获取pstmt对象
      pstmt = conn.prepareStatement(sql);
      //4.给?赋值
      pstmt.setString(1,“王五”);
      pstmt.setDouble(2,3000);
      //5.执行sql
      int count = pstmt.executeUpdate();
      System.out.println(count);
      } catch (SQLException e) {
      e.printStackTrace();
      }finally {
      //6. 释放资源
      JDBCUtils.close(pstmt,conn);
      }
      }

    2.Spring JDBC :JDBC Template

    • spring框架是JavaEE的灵魂框架
      Spring JDBC
    • spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC开发
      步骤:
      1.导入jar包
      2.创建jdbcTemplate 对象 依赖于数据源DataSource
      new JDBCTemplate(ds)
      3.调用jdbcTemplate的方法来完成CRUD的操作
      • update():执行DML语句,增删改 语句
      • queryForMap():查询结果将结果集封装为map集合,将列作为key,将值作为value,将这条记录 封装 为一个map集合
      • 上面的方法:这个方法查询的结果长度只能是1
      • queryForlist():查询结果将结果集封装为list集合
      • 注意:将每一条记录封装为一个Map集合,再将Map集合装载道List集合中
      • query():查询结果,将结果封装威JavaBean对象
      • query的参数:RowMapper
      •  一般我们使用BeanPropertyRowMapper实现类,可以完成数据道JavaBean的自动封装
        
      • new BeanPropertyRowMapper<类型>(类型.class)
        
      • queryForObject: 查询结果,将结果封装为对象
      • 一般用于聚合函数的查询
        CTRL +P :看看代码中需要什么

    将数据查询出来,封装成JavaBean对象,然后把对象装载到List集合中

    基本数据类型不能接受null ,记得使用引用数据类型
    在这里插入图片描述
    public class JdbcTemplateDemo2 {
    //Junit单元测试,可以让方法独立执行
    //1. 获取JDBCTemplate对象
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    /**
    * 1. 修改1号数据的 salary 为 10000
    /
    @Test
    public void test1(){
    //2. 定义sql
    String sql = “update emp set salary = 10000 where id = 1001”;
    //3. 执行sql
    int count = template.update(sql);
    System.out.println(count);
    }
    /
    *
    * 2. 添加一条记录
    /
    @Test
    public void test2(){
    String sql = “insert into emp(id,ename,dept_id) values(?,?,?)”;
    int count = template.update(sql, 1015, “郭靖”, 10);
    System.out.println(count);
    }
    /
    *
    * 3.删除刚才添加的记录
    /
    @Test
    public void test3(){
    String sql = “delete from emp where id = ?”;
    int count = template.update(sql, 1015);
    System.out.println(count);
    }
    /
    *
    * 4.查询id为1001的记录,将其封装为Map集合
    * 注意:这个方法查询的结果集长度只能是1
    /
    @Test
    public void test4(){
    String sql = “select * from emp where id = ? or id = ?”;
    Map<String, Object> map = template.queryForMap(sql, 1001,1002);
    System.out.println(map);
    //{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}
    }
    /
    *
    * 5. 查询所有记录,将其封装为List
    /
    @Test
    public void test5(){
    String sql = “select * from emp”;
    List<Map<String, Object>> list = template.queryForList(sql);
    for (Map<String, Object> stringObjectMap : list) {
    System.out.println(stringObjectMap);
    }
    }
    /
    *
    * 6. 查询所有记录,将其封装为Emp对象的List集合
    /
    @Test
    public void test6(){
    String sql = “select * from emp”;
    List list = template.query(sql, new RowMapper() {
    @Override
    public Emp mapRow(ResultSet rs, int i) throws SQLException {
    Emp emp = new Emp();
    int id = rs.getInt(“id”);
    String ename = rs.getString(“ename”);
    int job_id = rs.getInt(“job_id”);
    int mgr = rs.getInt(“mgr”);
    Date joindate = rs.getDate(“joindate”);
    double salary = rs.getDouble(“salary”);
    double bonus = rs.getDouble(“bonus”);
    int dept_id = rs.getInt(“dept_id”);
    11
    emp.setId(id);
    emp.setEname(ename);
    emp.setJob_id(job_id);
    emp.setMgr(mgr);
    emp.setJoindate(joindate);
    emp.setSalary(salary);
    emp.setBonus(bonus);
    emp.setDept_id(dept_id);
    return emp;
    }
    });
    for (Emp emp : list) {
    System.out.println(emp);
    }
    }
    /
    *
    * 6. 查询所有记录,将其封装为Emp对象的List集合
    /
    @Test
    public void test6_2(){
    String sql = “select * from emp”;
    List list = template.query(sql, new BeanPropertyRowMapper(Emp.class));
    for (Emp emp : list) {
    System.out.println(emp);
    }
    }
    /
    *
    * 7. 查询总记录数
    */
    @Test
    public void test7(){
    String sql = “select count(id) from emp”;
    Long total = template.queryForObject(sql, Long.class);
    System.out.println(total);
    }

    }

    BeanUtils位于org.apache.commons.beanutils.BeanUtils下面,其方法populate的作用解释如下:
    完整方法:
    BeanUtils.populate( Object bean, Map properties ),
    这个方法会遍历map<key, value>中的key,如果bean中有这个属性,就把这个key对应的value值赋给bean的属性
    在这里插入图片描述
    当用到BeanUtils的populate、copyProperties方法或者getProperty,setProperty方法其实都会调用convert进行转换
    但Converter只支持一些基本的类型,甚至连java.util.Date类型也不支持。而且它比较笨的一个地方是当遇到不认识的类型时,居然会抛出异常来。
    这个时候就需要给类型注册转换器。比如:意思是所以需要转成Date类型的数据都要通过DateLocaleConverter这个转换器的处理。
    ConvertUtils.register(new DateLocaleConverter(), Date.class);

    示例:
    在这里插入图片描述
    ConvertUtils除了给指定类型注册转换器外,还可以将数据转换为指定类型:
    在这里插入图片描述

    druid.properties的配置文件的书写方式:

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///day14
    username=root
    password=root
    initialSize=5
    maxActive=10
    maxWait=3000
    
    展开全文
  • MYSQL高级SQL语言

    2020-08-25 10:38:07
    文章目录MYSQL高级SQL语言一、MYSQL常用查询介绍1.1按关键字排序1.1.1按单字段排序1.1.2按多字段排序1.2对结果进行分组1.2.1聚合函数种类1.2.2示例统计分数大于70分的人数并分组1.3group by 结合order by1.4限制结果...
  • 1. MySql锁机制 1.1锁的分类 1.1.1 从对数据操作的类型(读\写)分 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。 写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。 ...
  • Mysql优化(高级篇)

    2018-04-09 11:20:03
    Mysql数据库优化篇 Q: 为什么别人问你MySQL优化的知识 总是没有底气. A: 因为你只是回答一些大而化之的调优原则, 比如:”建立合理索引”(什么样的索引合理?) “分表分库”(用什么策略分表分库?) “主从分离”(用...
  • MySQL下载与安装

    万次阅读 多人点赞 2018-10-28 18:20:54
    MySQL下载与安装 一、下载 地址:https://dev.mysql.com/downloads/mysql/ 当前最新是8.0版本,我选择上一个最新的mysql-5.7.24-winx64.zip 二、安装 MySQL安装文件分两种 .msi和.zip ,.msi需要安装 zip格式...
  • MySQL的常用命令

    千次阅读 2020-09-06 11:20:28
    MySQL的常用命令 1. 启动与停止MySQL服务 (右键以管理员方式打开命令提示符) 输入命令:net start mysql 来启动服务 输入命令:net stop mysql 来关闭服务 2. MySQL登录与退出 2.0 MySQL参数 2.1 MySQL登录 ...
  • 1.下载MySQL MySQL下载地址 提取码:1024 2.MySQL安装与配置 翻译:安装类型界面∶ (1)默认安装(Developer Default ) (2仅安装服务器(Server only ) (3)仅安装客户端(Client only ) (4)完全安装(Fuli) (5)自定义安装...
  • mysql中" ' "和 " ` "的区别

    千次阅读 2016-09-13 11:06:18
    两者在linux下和windows下不同,linux下不区分,windows下区分。 ...mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '/'hello';   数据库、表、索引、列和别名用的是引
  • MySQL备份与还原

    千次阅读 2020-08-13 22:56:26
    冷备份 (mysql服务需停止,然后去拷贝数据) 热备份(mysql服务运行的情况下去备份) 物理备份 (Linux系统的文件系统上) 逻辑备份(进入mysql内部) 物理备份的工具:cp、scp、tar、rsyncrsync rsyncrsync命令:...
  • Navicat for MySQL安装及使用教程

    万次阅读 2016-03-25 11:01:10
    Navicat是MySQL的一款可视化界面工具,非常的直观好用。下面讲Navicat的使用。 第一步是Mysql的安装: 1,在百度搜索下载Mysql,进行下载;...2,Mysql安装教程。 安装的教程如下: http://jingyan.baidu
  • mysql安装教程-以8.0.17版本为例

    万次阅读 热门讨论 2019-09-01 21:58:26
    进入mysql的官网** 2.进入下载界面 3、选择与电脑系统一致的版本 4、这里以windows为例下载 这里8.0.17版本,两个下载都可以;下载的是压缩包解压无需安装,直接配置即可 可以不用登入直接下载,点击下图位置...
  • Mysql5.6安装教程

    万次阅读 2019-04-12 16:51:39
    Mysql5.6安装教程 https://blog.csdn.net/y5946/article/details/78434525
  • Mysql5.7安装教程

    万次阅读 2016-08-30 16:25:32
    Mysql5.7安装教程 1、下载安装包 先从MYSQL官网上下载SQL服务器安装包软件:http://downloads.mysql.com/archives/installer/,本人下载的安装包是:mysql-installer-community-5.7.13.0.msi 2、安装步骤 双击进入...
  • MySQL下载步骤详解(带安装教程

    万次阅读 2019-11-28 16:15:52
    本书以 MySQL 5.7.20 为例介绍其在 Windows 10 操作系统下的安装和配置过程。 用户下载 Windows 图形化安装包的步骤如下。 步骤 1):打开 MySQL 官方网站(http://www.mysql.com),单击 DOWNLOAD,进入 MySQL ...
  • MySql5.6Window超详细安装教程

    万次阅读 多人点赞 2017-08-18 11:29:11
    下载如下教程,这时要选MySql On Windows的 选择MysQl Installer 注意下自己对应的版本,系统的位数 下载Mysql安装包需要Oracel的账号,如果没有,自己注册一个,然后接上面的流程,再Login ...
1 2 3 4 5 ... 20
收藏数 76,874
精华内容 30,749
关键字:

mysql