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 作为网站数据库。
信息
使用语言
SQL 语言
所    属
Oracle [1]
外文名
MySQL
开发公司
瑞典MySQL AB 公司
类    型
关系型数据库管理系统
mySQL应用环境
与其他的大型数据库 例如 Oracle、DB2、SQL Server等相比,MySQL [1]  自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于 MySQL是开放源码软件,因此可以大大降低总体拥有成本。Linux作为操作系统,Apache 或Nginx作为 Web 服务器,MySQL 作为数据库,PHP/Perl/Python作为服务器端脚本解释器。由于这四个软件都是免费或开放源码软件(FLOSS),因此使用这种方式不用花一分钱(除开人工成本)就可以建立起一个稳定、免费的网站系统,被业界称为“LAMP“或“LNMP”组合。
收起全文
  • 在本课程中,刘运强老师会结合自己十多年来对MySQL的心得体会,通过课程给你分享一条高效的MySQL入门捷径,让学员少走弯路,彻底搞懂MySQL。 本课程包含3大模块:  一、...
  • 6天玩转MySQL

    2019-06-26 11:50:21
    MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是好的 RDBMS (Relational Database Management System,关系...
  • 本课程从零开始,以通俗易懂的方式讲解MySQL技术,手把手教你掌握每一个知识点。课程中使用的所有英文单词都会逐一查询并记录,真正做到零基础入门学习,适合初学者的教程! 课程内容包括: 1.MySQL简介、安装...
  • web级mysql实战

    2018-10-22 21:38:04
    本课程是基于web开发领域下的实战mysql课程。本课程会模拟一个项目需求,从一万数据到百万数据逐步讲解如何建立、优化和第三方库结合的过程。 同时本课程的高潮在: 1、mysql+memcached的结合实战 2、mysql+redis...
  • 话不多说直接开干 ...4-安装MySQL服务 + 启动MySQL 服务 5-连接MySQL + 修改密码 先去官网下载点击的MySQL的下载 下载完成后解压 解压完是这个样子 配置初始化的my.ini文件的文件 ...

    话不多说直接开干

     

    目录

    1-先去官网下载点击的MySQL的下载​

    2-配置初始化的my.ini文件的文件

    3-初始化MySQL

    4-安装MySQL服务 + 启动MySQL 服务

    5-连接MySQL + 修改密码


     

     

     

    下载完成后解压 

    解压完是这个样子

     


     

    • 配置初始化的my.ini文件的文件

    解压后的目录并没有的my.ini文件,没关系可以自行创建在安装根目录下添加的my.ini(新建文本文件,将文件类型改为的.ini),写入基本配置: 

    [mysqld]
    # 设置3306端口
    port=3306
    # 设置mysql的安装目录
    basedir=C:\Program Files\MySQL
    # 设置mysql数据库的数据的存放目录
    datadir=C:\Program Files\MySQL\Data
    # 允许最大连接数
    max_connections=200
    # 允许连接失败的次数。
    max_connect_errors=10
    # 服务端使用的字符集默认为utf8mb4
    character-set-server=utf8mb4
    # 创建新表时将使用的默认存储引擎
    default-storage-engine=INNODB
    # 默认使用“mysql_native_password”插件认证
    #mysql_native_password
    default_authentication_plugin=mysql_native_password
    [mysql]
    # 设置mysql客户端默认字符集
    default-character-set=utf8mb4
    [client]
    # 设置mysql客户端连接服务端时默认使用的端口
    port=3306
    default-character-set=utf8mb4

    配置文件中的路径要和实际存放的路径一致(8.0.18不要手动创建Data文件夹)

     


     

    • 初始化MySQL

    在安装时,避免权限问题出错我们尽量使用管理员身份运行CMD,否则在安装时会报错,会导致安装失败的情况

    C:\Windows\System32

     

    右键以管理员身份运行

     

     

    打开后进入mysql的bin目录

     

    在MySQL目录下的bin目录下执行命令:

    mysqld --initialize --console

     

    注意![注意] [MY-010454] [服务器]为root @ localhost生成临时密码:9P0gYk-?0,kT其中root @ localhost:后面的9P0gYk-?0,kT就是初始密码(不含首位空格)。在没有更改密码前,需要记住这个密码,后续登录需要用到。复制密码先保存起来!!!

    如果出现系统错误问题     

       

      列:这个是因为缺少微软的一些运行所需的库。这个百度一下都可以找到下载源安装一下(可能需要重启  )

     


     

    • 安装MySQL服务 + 启动MySQL 服务

     安装mysql服务

    执行下面的命令:

    mysqld --install [服务名]                     ###(服务名可以不加默认为mysql)

    成功了!

    如果出现这个

    说明mysql的服务还在把它删掉    

    用这个命令

    SC删除的MySQL

    在执行上面安装服务

    服务安装成功之后通过命令

    net start mysql

    启动MySQL的服务

     

    总体三步走

    1初始化MySQL

    2创建服务

    3启动服务

     

    到这你的MySQL已经是安装好了!


     

    • 连接MySQL + 修改密码

    相信大家都有的Navicat,小海豚等数据库图形化工具

    没有我们去Navicat官网下一个(可以免费使用14天的!)

    MySQL的服务已经开启了就直接打开的Navicat去连接

    新建的MySQL的连接

    还记得刚刚让你复制的root @ localhost:后面的初始密码了吗?现在要用到它了复制粘贴上去!(稍微注意一下空格啊

    测试一下!

    MySQL的是成功安装了也可以登录  

    现在就是改密码的时候了

    也可以在mysql的bin目录下 进行数据库连接  mysql -u root -p

    再输入密码   回车

    有了mysql> 这个的时候  你就可以去改密码了!

    ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

    密码修改成功后 

    exit;(退出mysql)

    写SQL改密码吗?

    太麻烦了太low了

    来我有个简单的方法

    用Navicat的双击刚刚保存的连接  

    就会提示我们输入新密码

    OK了 

    教程到此为止

     

     

    是不是和别人的教程不一样  (一次就OK)

    那就点赞关注一下吧!

     

     

    我也会在我的个人公众号上分享一些技术型的文章  感兴趣就关注一下吧!

     

    展开全文
  • mysql:char && varchar

    2020-06-01 19:29:18
    CHAR 和 VARCHAR类型类似,不同之处在于 存储和获取 末尾空格 char(n): 0<n<=255 存储时,右侧会自动填充空格以达到指定长度,获取时填充的空格会移除 varchar(n) : <...varchar会额外使用1~2byte来存储该...

    CHAR 和 VARCHAR类型类似,不同之处在于

    • 存储和获取
    • 末尾空格

    char(n): 0<n<=255
    存储时,右侧会自动填充空格以达到指定长度,获取时填充的空格会移除

    varchar(n) : <0<=65535
    varchar会额外使用1~2byte来存储该列value的长度
    1 byte :长度<=255
    2 byte : 长度>255
    存储时,不会自动填充空格

    示例:
    在这里插入图片描述

    char类型末尾的空格都会移除,varchar类型的会保留。
    在这里插入图片描述

    参考官方文档:https://dev.mysql.com/doc/refman/8.0/en/char.html

    展开全文
  • CREATE FUNCTION `get_times_weeek` (  last_accting_date DATETIME,  nursePerformTime VARCHAR (50) ) RETURNS INT (11) COMMENT '计算以周为单位的计费次数'  BEGIN  DECLARE return_val INT DEFAULT 0 ...
    CREATE FUNCTION `get_times_weeek` (
      last_accting_date DATETIME,
      nursePerformTime VARCHAR (50)
    ) RETURNS INT (11) COMMENT '计算以周为单位的计费次数' 
    BEGIN
      DECLARE return_val INT DEFAULT 0 ;
      DECLARE flag BOOLEAN DEFAULT FALSE ;
      DECLARE weekNo INT ;
      DECLARE s_index INT ;
      IF last_accting_date IS NOT NULL
    && DATE_FORMAT(NOW(), '%Y-%m-%d') = DATE_FORMAT(last_accting_date, '%Y-%m-%d') 
      THEN SET return_val = 0 ;
      ELSE 
      SELECT 
        DAYOFWEEK(NOW()) INTO weekNo ;
      IF weekNo = 1 
      THEN SET weekNo = 7 ;
      ELSE SET weekNo = weekNo - 1 ;
      END IF ;
      SELECT 
        LOCATE(weekNo, nursePerformTime) INTO s_index ;
      IF s_index > 0 
      THEN SET return_val = 1 ;
      ELSE SET return_val = 0 ;
      END IF ;
      END IF ;
      RETURN return_val ;

    END 

    总结: and 用于where 条件中拼接条件 && 用于 if 逻辑判断。



    展开全文
  • Mysql&&&&JDBC

    2020-07-22 12:00:13
    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 为什么使用数据库 如果通过io流操作文件,非常的不方便 数据库的介绍 用于储存和管理数据的仓库,能够对数据进行统一的维护和管理 关系型数据库 以二维表格来组织数据结构,表与表之间可能还有一定...

    数据库 MySQL

    为什么使用数据库

    如果通过io流操作文件,非常的不方便
    

    数据库的介绍

    用于储存和管理数据的仓库,能够对数据进行统一的维护和管理
        关系型数据库
          以二维表格来组织数据结构,表与表之间可能还有一定的关联关系
        非关系型数据库
          不是以二维表格来组织数据
    
    使用一种统一的方式操作数据库----SQL
    MySQL是一种关联数据库    
    

    SQL的分类

    DDL 数据库定义语言
    DML 数据库操作语言【重点】
    DQL 数据库查询语言【重点】 
    DCL 数据库控制语言    
    

    DDL 操作数据库和数据表

    一DDL操作数据库

    1.DDL查询数据库

    查询所有数据库
        SHOW DATABASES;
    查询数据库的创建语句
        SHOW CREATE DATABASE 数据库名称;
    

    2.DDL创建数据库

    创建数据库
        CREATE DATABASE 数据库名称;
     创建数据库(判断,如果不存在则创建)
         CREATE DATABASE IF NOT EXISTS 数据库名称;
    创建数据库(指定字符集)
        CREATE DATABASE 数据库名称 CHARACTER SET 字符集名称;
    

    3.DDL修改删除使用数据库

     修改数据库(修改字符集)
         ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称;
    删除数据库
        DROP DATABASE 数据库名称;
     删除数据库(判断,如果存在则删除)
         DROP DATABASE IF EXISTS 数据库名称;
    使用数据库
       USE 数据库名称;
    查看当前使用的数据库
      SELECT DATABASE();  
    

    二.操作数据表

    DDL查询数据表

    查询当前正在使用的数据库中的所有表名
        show tables;
    查询指定表的结构
        desc 表名
     查看指定数据库中指定表字符集   
       show table status from 数据库名 like ‘表名’
       
        例如
        查询库中所有的表
        SHOW TABLES;
    查询user表结构
        DESC USER;
    查看mysql数据库中user表字符集
     SHOW TABLE STATUS FROM mysql LIKE 'user';
    

    DDL 创建数据表

    CREATE TABLE 表名(
    列名 数据类型 约束,
    列名 数据类型 约束,
    ...
    列名 数据类型 约束
    );
    数据类型
    int:整数类型
    double:小数类型
    date:日期类型。包含年月日,格式 yyyy-MM-dd
    datetime:日期类型。包含年月日时分秒,格式yyyy-MM-dd HH:mm:ss
    timestamp:时间戳类型。包含年月日时分秒,格式 yyyy-MM-dd HH:mm:ss
    * 如果不给该列赋值、或赋值为null,则默认使用当前系统时间自动赋值
    
    varchar(长度):可变长度字符串类型
    char :固定长度的字符串
        
        除了字符串必须指定长度,其他不管
        其余见资料MySQL数据类型
    

    复制数据表

    CREATE TABLE 表名 LIKE 被复制的表名;

    DDL修改数据表

     修改表名
         ALTER TABLE 表名 RENAME TO 新表名;
     修改表的字符集
      ALTER TABLE 表名 CHARACTER SET 字符集名称;   
     单独添加一列
         ALTER TABLE 表名 ADD 列名 数据类型;
     修改某列的数据类型
         ALTER TABLE 表名 MODIFY 列名 新数据类型;
     修改列名和数据类型
        ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型; //如果是varchar,要添加(长度)
     删除某一列
    ALTER TABLE 表名 DROP 列名;
    
    

    DDL删除数据表

    删除数据表
        DROP TABLE 表名;
     删除数据表(判断,如果存在则删除)
        DROP TABLE IF EXISTS 表名;
    

    三 表数据的操作(增删改)

    DML 新增表数据

    给指定列添加数据
        INSERT INTO 表名(列名1,列名2,) VALUES (1,2,);
    给全部列添加数据
        INSERT INTO 表名 VALUES (1,2,);
    批量添加数据
       INSERT INTO 表名(列名1,列名2,) VALUES (1,2,), (1,2,),; 
       INSERT INTO 表名 VALUES (1,2,), (1,2,),;
    注意:
    列名和值的数量以及数据类型要对应,除了数字类型,其他数据类型的数据都需要加引号(单引双引都行,推荐单引)
    

    DML修改表数据

     修改表中的数据
         UPDATE 表名 SET 列名1=1,列名2=2,[WHERE 条件];
    注意:
        修改语句中必须加条件,如果不加条件,则会将所有数据都修改。
    

    DML删除表中的数据

    删除表中的数据
        DELETE FROM 表名 [WHERE 条件];
    注意:
         删除语句中必须加条件,如果不加条件,则会将所有数据都删除
    

    DQL 表数据查询【重点】

    查询语法
    单表查询完整语法
    SELECT
        字段列表
    FROM
        表名列表
    WHERE
         条件列表
    GROUP BY
         分组字段
    HAVING
         分组后的过滤条件
    ORDER BY
          排序
    LIMIT
          分页限定    
    
    查询全部
     查询全部的表数据
         SELECT * FROM 表名;
     查询指定字段的表数据
         SELECT 列名1,列名2,… FROM 表名;
     去除重复查询
         SELECT DISTINCT 列名1,列名2,… FROM 表名;
    注意:去除重复,必须是查询的所有列都重复
     
        计算列的值(四则运算)
        SELECT 列名1 运算符(+ - * /) 列名2 FROM 表名; 
     起别名查询
       SELECT 列名 AS 别名 FROM 表名;
    
    条件查询

    条件查询分类

    符号 功能
    > 大于
    < 小于
    >= 大于等于
    <= 小于等于
    = 等于
    <> 或 != 不等于
    between…and 在某个范围之内(都包含)
    in(…) 多选一
    like 占位符 模糊查询 _单个任意字符,%多个任意字符
    is null 是null
    is not null 不是 null
    and 或 && 并且
    or 或 || 或者
    not 或 ! 非 , 不是

    条件查询语法

    SELECT 列名列表 FROM 表名 WHERE 条件;
    

    案列

    /*
    	条件查询
    	标准语法:
    		SELECT 列名列表 FROM 表名 WHERE 条件;
    */
    -- 查询库存大于20的商品信息
    SELECT * FROM product WHERE stock > 20;
    
    
    -- 查询品牌为华为的商品信息
    SELECT * FROM product WHERE brand='华为';
    
    -- 查询金额在4000 ~ 6000之间的商品信息
    SELECT * FROM product WHERE price >= 4000 AND price <= 6000;
    SELECT * FROM product WHERE price BETWEEN 4000 AND 6000;
    
    
    -- 查询库存为143023的商品信息
    SELECT * FROM product WHERE stock=14 OR stock=30 OR stock=23;
    SELECT * FROM product WHERE stock IN(14,30,23);
    
    -- 查询库存为null的商品信息
    SELECT * FROM product WHERE stock IS NULL;
    
    -- 查询库存不为null的商品信息
    SELECT * FROM product WHERE stock IS NOT NULL;
    
    
    -- 查询名称以小米为开头的商品信息
    SELECT * FROM product WHERE NAME LIKE '小米%';
    
    -- 查询名称第二个字是为的商品信息
    SELECT * FROM product WHERE NAME LIKE '_为%';
    
    -- 查询名称为四个字符的商品信息
    SELECT * FROM product WHERE NAME LIKE '____';
    
    -- 查询名称中包含电脑的商品信息
    SELECT * FROM product WHERE NAME LIKE '%电脑%';
    
    聚合函数查询

    聚合函数的分类

    函数名 功能
    count(列名) 统计个数
    max(列名) 最大值
    min(列名) 最小值
    sum(列名) 求和
    avg(列名) 平均值

    聚合函数的查询语法

    SELECT 函数名(列名) FROM 表名 [WHERE 条件];
    

    例如

    /*
    	聚合函数
    	标准语法:
    		SELECT 函数名(列名) FROM 表名 [WHERE 条件];
    */
    -- 计算product表中总记录条数
    SELECT COUNT(*) FROM product;
    -- 查看所有数据 
        select * from product;
    -- 获取最高价格
    SELECT MAX(price) FROM product;
    
    -- 获取最低库存
    SELECT MIN(stock) FROM product;
    
    -- 获取总库存数量
    SELECT SUM(stock) FROM product;
    
    -- 获取品牌为苹果的总库存数量
    SELECT SUM(stock) FROM product WHERE brand='苹果';
    
    -- 获取品牌为小米的平均商品价格
    SELECT AVG(price) FROM product WHERE brand='小米';
    
    
    排序
    select from where...order by 列名1 排序方式1,列名2 排序方式2
        语法
        SELECT 列名列表 FROM 表名 [WHERE 条件] ORDER BY 列名 排序方式,列名 排序方式,;
    注意:
    排序方式:ASC-升序,DESC-降序
    如果有多个排序条件,只有当前边的条件值一样时,才会判断第二条件。
    

    案列

    /*
    	排序查询
    	标准语法:
    		SELECT 列名 FROM 表名 [WHERE 条件] ORDER BY 列名1 排序方式1,列名2 排序方式2;
    */
    -- 按照库存升序排序
    SELECT * FROM product ORDER BY stock ASC;
    -- 默认升序排序,可以省略 ASC
    SELECT * FROM product ORDER BY stock;
    
    -- 查询名称中包含手机的商品信息。按照金额降序排序
    SELECT * FROM product WHERE NAME LIKE '%手机%' ORDER BY price DESC;
    
    
    -- 按照金额升序排序,如果金额相同,按照库存降序排列
    SELECT * FROM product ORDER BY price ASC,stock DESC;
    
    
    分组查询

    分组查询语法

    SELECT 列名列表 FROM 表名 
       [WHERE 条件] 
       GROUP BY 分组列名
       [HAVING 分组后的条件过滤]
       [ORDER BY 排序列名 排序方式];
    
    注意事项:
    1.
    2.where 后面不能跟聚合函数条件,聚合函数条件只能跟在having后面    
    

    分页查询

    分页查询
    	标准语法:
    		SELECT 列名 FROM 表名 
    		[WHERE 条件] 
    		[GROUP BY 分组列名]
    		[HAVING 分组后条件过滤] 
    		[ORDER BY 排序列名 排序方式] 
    		LIMIT 当前页数,每页显示的条数;
    	
    	LIMIT 当前页数,每页显示的条数;
    	公式:当前页数 = (第几页-1) * 每页显示的条数
             令每页显示的条数为x
        即  第1, 当前页数=(1-1)*x  02,当前页数 = (2-1)*x   x
            第3,当前页数 = (3-1)*x   2x
            ...
            第n页 当前页数 = (n-1)*x     
    

    约束

    约束的介绍

    什么是约束
        对表中的数据进行限定,保证数据的正确性、有效性、完整性!
        
    

    约束的分类

    约束 作用
    PRIMARY KEY 主键约束
    PRIMARY KEY AUTO_INCREMENT 主键自增
    UNIQUE 唯一约束
    NOT NULL 非空约束
    FOREIGN KEY 外键约束
    FOREIGN KEY ON UPDATE CASCADE 外键级联更新
    FOREIGN KEY ON DELETE CASCADE 外键级联删除
    单表约束
    主键约束
    非空约束
    唯一约束
        
    多表约束
       外键约束
        foreign key
    

    主键约束 PRIMARY KEY

    主键约束的特点
       主键约束默认包含非空和唯一两个功能。
        一张表只能有一个主键。
        主键一般用于表中数据的唯一标识。 
        
         建表时添加主键约束
        CREATE TABLE 表名(
        列名 数据类型 PRIMARY KEY,
        ...
        列名 数据类型 约束
        );
      
         删除主键约束
      ALTER TABLE 表名 DROP PRIMARY KEY;
    
     建表后单独添加主键约束
      ALTER TABLE 表名 MODIFY 列名 数据类型 PRIMARY KEY;
    
    主键自增
    建表时添加主键自增约束
        CREATE TABLE 表名(
        列名 数据类型 PRIMARY KEY AUTO_INCREMENT,
        ...
        列名 数据类型 约束
        );
    
     删除主键自增约束
         ALTER TABLE 表名 MODIFY 列名 数据类型;
    
    建表后单独添加主键自增约束
        ALTER TABLE 表名 MODIFY 列名 数据类型 AUTO_INCREMENT;
    
        MySQL 中的自增约束,必须配合键的约束一起使用!
         
    
    唯一约束
     建表时添加唯一约束
         CREATE TABLE 表名(
        列名 数据类型 UNIQUE,
        ...
        列名 数据类型 约束
        );
     删除唯一约束
         ALTER TABLE 表名 DROP INDEX 列名;
    
    建表后单独添加唯一约束
         ALTER TABLE 表名 MODIFY 列名 数据类型 UNIQUE;
    
    非空约束
    建表时添加非空约束
        CREATE TABLE 表名(
        列名 数据类型 NOT NULL,
        ...
        列名 数据类型 约束
        );
    删除非空约束
        ALTER TABLE 表名 MODIFY 列名 数据类型;
     建表后单独添加非空约束
         ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL;
    

    约束练习

    -- 创建表(编号、姓名、密码,手机号码)  编号设为主键自增,姓名设为非空,手机号设为唯一
    CREATE TABLE acount(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	username VARCHAR(30) NOT NULL,
    	PASSWORD VARCHAR(30),
    	phonenumber INT(11) UNIQUE
    );
    -- 查询表的详细信息
       DESC acount;
    -- 1-1 删除id的主键约束
        注意:要删除id的主键约束,需要先删除自动增长,再删除主动约束
            -- 删除自动增长
            alter table acount modify id int;
           -- 删除id的主键约束
            alter table acount drop primary key;   
    
    -- 1-2 添加id的主键约束 
        alter table acount modify id int primary key
        //添加主键自增可选可不选
        alter table acount modify id int auto_increment;
    
    -- 2-1 删除username非空约束
        alter table acount modify username varchar(30);
    -- 2-2 添加username非空约束
        alter table acount modify username varchar(30) not null;
    
    -- 3-1 删除 phonenumber 唯一约束
        alter table acount drop index phonenumber;
    -- 3-2 添加 phonenumber 唯一约束
        alter table acount modify phonenumber int(11) unique;
    
    总结:
      只有删除主键约束和唯一约束时 使用关键字 drop
    

    综合练习

    // 现已有一个表格 表明emp 列名如下
    /*
    	empno:员工编号
    	ename:员工姓名
    	job:员工职位
    	mar:领导编号
    	hiredate:入职日期
    	sal:工资
    	comm:奖金
    	deptno:部门编号
    */
    // 需求
    -- 1 查询出部门编号为30的所有员工
        select * from emp where deptno=30;
    
    -- 2 查询所有销售员的姓名、编号和部门编号
        select ename, empno,deptno from emp where job='销售员';
    
    -- 3 查询奖金高于工资的员工
        select * from emp where comm > sal;
    
    -- 4 查询奖金高于工资60%的员工
        select * from emp where comm > sal*0.6;
    
    -- 5 查询10号部门中的所有经理,和20号部门中所有销售员的详细资料
     -- 注 and 优先级 高于 or
        select * from emp where deptno=10 and job='经理' or deptno=20 and job='销售员';
    
    -- 6 查询10号部门中的所有经理,和20号部门中所有销售员,还有即不是经理又不是销售员但其工资大或等于         20000的所有员工详细资料
        select * from emp where deptno=10 and job='经理' or deptno=10 and job='销售员' or sal >= 20000 and job not in('经理','销售员');
    
     -- 7 查询无奖金或奖金低于1000的员工
         select * from emp where comm < 1000 or comm is null;
    
    -- 8 查询名字由三个字组成的员工
         select * from emp where ename like '___';
     
     -- 9 查询2001年入职的员工
       select * from emp where hiredate like '2001-%';
     
     -- 10 查询所有员工信息按照工资降序排序,如果工资相同则按入职日期升序排序
       select * from emp order by sal desc,hiredate asc;
     
     -- 11 按照部门统计每个部门的人数
     select deptno, count(*) from emp group by deptno;
     
     -- 12 按照部门统计平均工资,降序显示,工资超过50000的不参与统计,只显示前两名。
      SELECT deptno, AVG(sal) AS AVG FROM emp WHERE sal <50000 GROUP BY deptno ORDER BY AVG DESC LIMIT 0,2;
    
    展开全文
  • MySQL是一个真正的多用户、多线程SQL数据库服务器。SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言,它使得存储、更新和存取信息更加容易。MySQL是一个客户机/服务器结构的实现,它由一个服务器守护...
  • 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_建立连接

    2017-04-25 15:35:45
    因为项目的需要,我极不情愿地从sql server转到了mysql之所以是极不情愿,果然是因为在SSMS的温暖怀抱里面呆得太久了啊,人是会变懒的!!!好吧既然用了mysql那就索性写点东西下来。 安装mysql我不具体描述了,总体...
  • 文末附所需安装包链接。 如下为安装步骤: 1、双击mysql-installer-community-5.7.12.0.msi,开始安装,直到遇到如下界面: ...资源)”、“Server Machine(服务器类型,mysql 占用较多资源)”、“Dedicated MySQL...
  • MySQL 高级多表查询

    2020-05-08 16:23:04
    MySQL多表查询 添加练习表 -- 用户表(user) CREATE TABLE `user`( `id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户id(主键)', `username` VARCHAR(50) COMMENT '用户姓名', `age` CHAR(3) COMMENT '用户...
  • 在修改过程中,会强制干掉Mysql主程序,修改完成后重新启动Mysql就可以了。 首先讲解如何一键强制修改PHPWAMP自身的Mysql密码 然后再讲解如何一键强制修改其他任意环境的Mysql数据库密码。 案例...
  • 安装MySQL主要有两种方法:一种是通过源码自行编译安装,这种适合高级用户定制MySQL的特性,这里不做说明;另一种是通过编译过的二进制文件进行安装。二进制文件安装的方法又分为两种:一种是不针对特定平台的通用...
  • CentOS7默认数据库是mariadb, 但是 好多用的都是mysql ,但是CentOS7的yum源中默认好像是没有mysql的。 上一篇安装的是5.6的但是我想安装5.7的 yum安装是最简单的 尝试过编译安装各种问题,最后就决定用yum。 ...
  • MySQL导入.sql文件及常用命令 <br /> 在MySQL Qurey Brower中直接导入*.sql脚本,是不能一次执行多条sql命令的,在mysql中执行sql文件的命令: mysql> source d:/myprogram/database/db.sql;...
  • 当时因为很多学生向我提建议,希望我能添加Mysql自定义功能,因此我便加入了此功能, 下个版本预告: PHPWAMP下个版本将会集成PHP打包器,可以将PHP网站生成单个EXE文件,双击即可浏览网站。 在打包PHP网站...
  • 一、下载MySQL 首先,去数据库的官网http://www.mysql.com下载MySQL。 点击进入后的首页如下:  然后点击downloads,community,选择MySQL Community Server。如下图:  滑到下面,找到Recommended Download,...
1 2 3 4 5 ... 20
收藏数 2,067,975
精华内容 827,190
关键字:

mysql