zoukankan      html  css  js  c++  java
  • 11.MySQL

    一、MySQL简介

    数据库 DB
    存储、维护和管理数据的集合 (文件系统 ),MYSQL关系型数据库,用于保存实体和实体之间的关系
    数据库管理系统
        指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统 访问数据库中的数据 
     
    数据库软件应该为 数据库管理系统,数据库是通过数据库管理系统创建和操作的
     
    安装了Tomcat的是Web服务器,安装了MySQL的是数据库服务器
     
    Oracle:大型
    DB2:可大可小
    SQL Server:Windows
    MySQL:中小型
     

    数据库的安装

    1、安装路径不要有中文(重要),不要有空格
    2、MySQL默认端口是3306,不要修改。
    3、设置MySQL的编码集(采用UTF-8的编码)
    4、要把黑窗口的勾勾选上。

    数据库的卸载

    找到MySQL的安装路径,找到my.ini的配置文件。
    basedir="C:/Program Files (x86)/MySQL/MySQL Server 5.5/" 安装的路径
    datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/" MySQL存储数据的路径
    1、通过控制面板卸载MySQL
    2、找到上面的两个路径,删除文件夹

     

    二、MySQL管理

    1. 停止mysql 服务 net stop mysql,要是遇到错误5,就用管理员权限启动cmd
    2.启动mysql 服务 net start mysql
    3.登录 Mysql  mysql  -uroot  -proot
    4.修改密码  
    (1)停止 mysql 服务(services.msc )
    (2)mysqld --skip-grant-tables 启动服务器
    (3)新打开 cmd 输入mysql -u root -p 不需要密码(开启一个mysql服务,不需要进行认证), show databases;查看数据库,输入命令 use mysql;使用mysql数据库,修改密码:update user set password=password('abc') WHERE User='root'
    (4)关闭两个cmd 窗口,在任务管理器结束 mysqld 进程
    (5)重启 mysql 服务
     
    针对每一个应用创建一个数据库,在数据库创建多个表,以保存程序中实体的数据。
    数据库中一行记录与对象之间的关系:
    列:字段
    行:一条记录 ( 实体)
    MySQL中叫字段,字段和Java中的类的属性是一一对应的,每一条记录对应是一个Java实例对象
     

     三、SQL语句

    SQL结构化查询语言
    第四代语言,Java第三代语言
    各数据库厂商都支持 ISO 的SQL 标准,厂商在标准的基础上做了自己的扩展
     
    分类
    DDL:数据定义语言,用来定义数据库对象:库、表、列等; CREATE 、ALTER、DROP
    DML:数据操作语言,用来定义数据库记录(数据); INSERT 、UPDATE、DELETE
    DQL:数据查询语言,用来查询记录(数据),SELECT
    DCL:数据控制语言,用来定义访问权限和安全级别; IF ELSE,不用
     
    注意: sql 语句以 ;结尾
    CURD : 增删改查
    1、DDL(管理数据库)
    (1)创建
    1 Create database mydb1;
    2 Create database mydb2 character set gbk;
    3 Create database mydb3 character set gbk COLLATE gbk_chinese_ci;
    (2)查询
    1 show databases;  // 查看当前数据库服务器中的所有数据库
    2 Show create database mydb2;  // 查看前面创建的 mydb2数据库的定义信息
    3 Drop database mydb3;  // 删除前面创建的 mydb3数据库
    (3)修改
    alter database mydb2 character set utf8;  // 查看服务器中的数据库,并把 mydb2 的字符集修改为 utf8
    (4)删除
    drop database mydb3;  
    (5)查看当前使用的数据库
    select database();
    (6)切换数据库
    use mydb2;
    (7)操作数据表
    1 create table 表名 (
    2   字段 1 字段类型 ,
    3   字段 2 字段类型 ,
    4   ...
    5   字段 n 字段类型
    6   );
    (8)当前数据库中的所有表
    SHOW TABLES;
    (9)查看表的字段信息
    DESC employee;

    常用数据类型

    (1)数值型
    TINYINT 、SMALLINT、INT、BIGINT、FLOAT、DOUBLE
    int:整型
    double:浮点型,例如 double(5,2) 表示最多5 位,其中必须有 2 位小数,即最大值为 999.99;
     
    (2)逻辑性 对应boolean
    BIT
     
    (3)字符串型
    char :固定长度字符串类型; char(10) 'abc ',无字符串,性能高
    varchar :可变长度字符串类型; varchar(10) 'abc',常用
     
    (4)大数据类型(一般不用)
    text :字符串类型 ;大量数据,二进制
    blob :字节类型;图片视频音频
     
    (5)日期型
    DATE、TIME、DATETIME、TIMESTAMP
    date :日期类型,只包含日期,格式为: yyyy-MM-dd ;
    time :时间类型,只包含时分秒,格式为: hh:mm:ss
    timestamp :时间戳类型,不传入数据,默认选择当前系统时间, yyyy-MM-dd hh:mm:ss 会自动赋值,不太实用,到2023年就不能用了
    datetime: 日期时间类型,需要手动录入时间,yyyy-MM-dd hh:mm:ss

    2、DML 操作 (重要 )

    DML 是对表中的数据 进行增、删、改的操作。不要与 DDL (对表)混淆了。
    INSERT 、 UPDATE 、 DELETE
     
    在mysql 中,字符串类型和日期类型都要用单引号括起来。 'tom' '2015-09-04'
    数据与字段的类型相同,字段长度需要控制
    空值:null(不占内存)
     
    解决中文乱码的问题

    [client]
    port=3306
    [mysql]
    default-character-set=gbk,修改完要重启服务

     
    1、插入INSERT
     INSERT INTO 表名(列名 1 ,列名2 ... ) VALUES(列值 1 ,列值2...);
    如果插入空值,请使用 null
    插入的日期和字符一样,都使用引号括起来
    每一列全部给值,列值就不用写
     
    sqlyog82、navicat第三方客户端界面
     
    2、修改UPDATE
    UPDATE 表名 SET 列名1= 列值 1,列名 2= 列值2 。。。 WHERE 列名 =值
    where相当于if
     
    3、删除DELETE
    delete from 表名 [where ];
    truncate 表名; 删除所有的数据;

    truncate 和 delete的区别:
    (1)truncate删除数据,先删除整个表。再创建一个新的空的表。(效率)
    (2)delete删除数据,一条一条删除的。(*****)
    (3)事物(insert update delete)

     

    3、DQL(重要,查询) 12种

    (1)查询所有列
    SELECT * FROM 表名 ;

    (2)查询指定列

    SELECT  id,NAME,gender  FROM  student;

    (3)查询时给字段添加别名( AS )

    1 SELECT NAME AS '姓名',sex AS '性别' FROM student;
    2 SELECT NAME '姓名',sex '性别' FROM student;  // 也可省略AS

    (4)查询时添加常量列

    SELECT id,NAME,gender,age,'你好' AS 'hello'  FROM student;
    // as设置别名

    (5)查询时合并列

    SELECT id,NAME,(servlet+jsp) AS '总成绩' FROM student;

    (6)查询时去除重复记录(DISTINCT)

    SELECT DISTINCT gender FROM student;

    (7)条件查询

    条件查询(where)

    1.逻辑条件: and(与)     or(或)

    SELECT * FROM student WHERE id=2

    2. 比较条件: >   <   >=  <=  =  <>(不等于)     between and (等价于>= 且 <=)

    SELECT * FROM student WHERE servlet>70;

    3. 判空条件(null 空字符串):  is null / is not null / =''  / <>''

    null 无值
    ‘’ 空字符串  有值
    1 SELECT * FROM student WHERE address IS NULL
    2 SELECT * FROM student WHERE address='';

    4.模糊条件: like

    通常使用以下替换标记

    % : 表示任意个字符

    _ : 表示一个字符

    SELECT * FROM student WHERE NAME LIKE '李%';

    (8)聚合查询

    聚合查询(使用聚合函数的查询)

    常用的聚合函数: sum()  avg()  max()  min()  count()

    SELECT SUM(servlet) AS 'servlet的总成绩' FROM student;
    SELECT AVG(servlet) AS 'servlet的平均分' FROM student;
    SELECT MAX(servlet) AS '最高分' FROM student;
    SELECT MIN(servlet) AS '最低分' FROM student;
    SELECT COUNT(*) FROM student; // 多少个学生
    SELECT COUNT(id) FROM student; // 

    count() 函数统计的数量不包含null的数据,使用count统计表的记录数,要使用不包含null值的字段

    (9)分页查询
    分页查询(limit 起始行,查询几行)
    起始行从0开始
    分页:当前页  每页显示多少条
    分页查询当前页的数据的sql: SELECT * FROM student LIMIT (当前页-1)*每页显示多少条,每页显示多少条;
    1 SELECT * FROM student LIMIT 0,2;  // 查询第1,2条记录(第1页的数据)
    2 SELECT * FROM student LIMIT 2,2;  // 查询第3,4条记录(第2页的数据)
    3 SELECT * FROM student LIMIT 2,2;  // 查询第5,6条记录(第3页的数据)
    4 SELECT * FROM student LIMIT 6,2;  // 查询第7,8条记录 (没有记录不显示)

    (10)查询排序(order by)

    order by 字段 asc/desc

    asc: 顺序,正序。数值:递增,字母:自然顺序(a-z),默认

    desc: 倒序,反序。数值:递减,字母:自然反序(z-a)

    SELECT  *  FROM student ORDER BY id ASC;

    (11)分组查询(group by)

    SELECT gender,COUNT(*) FROM student GROUP BY gender;

    (12)分组查询后筛选

    SELECT gender,COUNT(*) FROM student WHERE GROUP BY gender HAVING COUNT(*)>2;

     四、数据约束

    给表添加数据约束,从而约束用户操作表数据的行为
     1、默认值约束(DEFAULT)
    1 CREATE TABLE test(
    2     NAME VARCHAR(20),
    3     gender VARCHAR(2) DEFAULT ''
    4 )
    5 
    6 INSERT INTO test(NAME) VALUES('张三');
    7 INSERT INTO test(NAME,gender) VALUES('张三',NULL);
    8 
    9 SELECT * FROM test;

    当前没有插入默认值字段的时候,默认值才会起作用

     2、非空(not null)
    1 CREATE TABLE test(
    2     NAME VARCHAR(20) NOT NULL,
    3     gender VARCHAR(2)
    4 )

    不能不插入值。不能为null

    3、唯一约束

    1 CREATE TABLE test(
    2     id INT UNIQUE,
    3     NAME VARCHAR(20)
    4 )

    4、主键约束

     主键约束(primary key)(唯一+非空)

    注意:

    (1)通常情况下,我们会给每张表都会设置一个主键字段,用来标记记录的唯一性

    (2)但是不建议把业务含义字段作为主键,因为随着业务的变化,业务字段可能会出现重复。

    (3)建议给每张张独立添加一个叫id的字段,把这个id字段设置成主键,用来作为记录的唯一性
     
     5、自增
    AUTO_INCREMENT
     
    6、外键
    外键作用: 约束两种表的数据

    当有了外键约束之后,操作数据(管理数据)的顺序如下:

    插入数据: 先插入主表的数据,再插入副表数据

    修改数据: 先修改主表数据,再修改副表数据

    删除数据: 先删除副表数据,再删除主表数据

    1 //  员工表(副表: 被别的表约束。外键设置在副表)
    2 CREATE TABLE employee(
    3     id INT PRIMARY KEY AUTO_INCREMENT,
    4     NAME VARCHAR(20),
    5     deptId INT,
    6     CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
    7                   //   外键名称   外键字段  参考          
    8 )
    1 //  部门表(主表:约束别人的表)
    2 CREATE TABLE dept(
    3     id INT PRIMARY KEY AUTO_INCREMENT,
    4     NAME VARCHAR(20)
    5 )

    7、级联技术

    级联: 当有了外键的时候,我们希望修改或删除数据的时候,修改或删除了主表的数据,同时能够影响副表的数据,这时就可以使用级联。

    1 CREATE TABLE employee(
    2     id INT PRIMARY KEY AUTO_INCREMENT,
    3     NAME VARCHAR(20),
    4     deptId INT,
    5     -- 添加级联修改: ON UPDATE CASCADE
    6     -- 添加级联删除: ON DELETE CASCADE 
    7     CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE 
    8     --          外键名称                     外键字段  参考          
    9 )

     五、数据库设计

    三大范式:
    1、 要求表的每个字段必须独立的不可分割的单元
    2、在第一范式的基础上,要求表的除主键以外的字段都和主键有依赖关系的。一张表应该只表达一个意思
    3、在第二范式基础上,要求表的除主键外的字段都只能和主键有直接决定的依赖关系
     

    六、多表查询

    1、交叉连接查询
    产生笛卡尔积
    SELECT employee.name,dept.name FROM employee,dept;

    多表查询的步骤: 1)确定查询哪些表  2)确定查询哪些字段  3)确定连接条件(规则: 表数量-1)

    2、内连接查询(使用最多

    1 SELECT e.name,d.name
    2     FROM employee e,dept d
    3     WHERE e.deptId=d.id;
    1 SELECT e.name,d.name
    2     FROM employee e
    3     INNER JOIN dept d
    4     ON e.deptId=d.id;

    3、左外连接查询(其次

    左外连接查询效果: 左表(部门表)的数据全部显示,右表(员工)的数据当满足连接条件的时候,就显示满足条件的的数据,但是如果不满足连接条件,则显示null

    1 SELECT d.name,e.name
    2     FROM dept d
    3     LEFT OUTER JOIN employee e
    4     ON d.id=e.deptId;    

    4、右外连接查询

    右外连接查询效果: 右表(部门表)的数据全部显示,左表(员工)的数据当满足连接条件的时候,就显示满足条件的数据,但是如果不满足连接条件,则显示null

    1 SELECT d.name,e.name
    2     FROM employee e
    3     RIGHT OUTER JOIN dept d
    4     ON d.id=e.deptId;   

    5、自连接查询

    1 SELECT e.name AS '员工',b.name AS '上司'
    2     FROM employee e
    3     LEFT OUTER JOIN employee b
    4     ON e.bossId=b.id;

    七、存储过程

    存储过程,其实就是带逻辑的(多个)sql语句。也是sql编程

    1、特点:

    (1)存储过程保存到数据库服务器端,通过数据库客户端工具调用存储过程

    (2)存储过程的效率会非常高!因为存储过程是在数据库服务器端执行。

    (3)存储过程的移植性非常差的!

    2、语法:

     1 创建存储过程
     2 -- 定义结束符号
     3 DELIMITER 结束符号
     4 CREATE PROCEDURE 存储过程名称 (形式参数列表) 
     5 BEGIN
     6     多个sql语句
     7 END 结束符号
     8 
     9 -- 调用存储过程
    10 CALL 存储过程名称(实际参数列表);
    11 
    12 参数类型:
    13 IN: 输入参数,可以携带数据到存储过程中
    14 OUT: 输出参数,可以携带数据到存储过程外面。
    15 INOUT: 输入输出参数。
    1 --带有输入参数的存储过程
    2 DELIMITER $
    3 CREATE PROCEDURE pro_testByIn(IN eid INT)  -- 参数类型(IN) 参数名称 数据类型(int)
    4 BEGIN
    5     SELECT * FROM employee WHERE id=eid;
    6 END $
    7 
    8 -- 调用
    9 CALL pro_testByIn(2);
    1 --带有输出参数的存储过程
    2 DELIMITER $
    3 CREATE PROCEDURE pro_testByOut(OUT n VARCHAR(20))
    4 BEGIN
    5     -- 修改变量n
    6     SET n = '输出参数';
    7 END $

    定义变量去接收输出参数数据

    --带有输入输出参数的存储过程
    DELIMITER $
    CREATE PROCEDURE pro_testByInOut(INOUT n VARCHAR(20))
    BEGIN
        -- 查看n变量
        SELECT n;
        -- 修改n变量
        SET n = '500';
    END $
    
    -- 定义会话变量调用存储过程
    SET @n='100';
    CALL pro_testByInOut(@n);
    -- 查看n
    SELECT @n;
     1 --带有判断条件的存储过程
     2 DELIMITER $
     3 CREATE PROCEDURE pro_testByIf(IN num INT,OUT str VARCHAR(20))
     4 BEGIN
     5     IF num=1 THEN
     6         SET str = '星期一';
     7     ELSEIF num= 2 THEN
     8         SET str ='星期二';
     9     ELSEIF num=3 THEN
    10         SET str = '星期三';
    11     ELSE
    12         SET str = '错误参数';
    13     END IF;
    14 END $
    15 
    16 CALL pro_testByIf(5,@str);
    17 SELECT @str;
     1 --带有循环条件的存储过程
     2 DELIMITER $
     3 CREATE PROCEDURE pro_testByWhile(IN num INT,OUT score INT)
     4 BEGIN
     5     -- int result =0;
     6     -- for(int i=1;i<=100;i++){
     7     --     result += i;
     8     -- }
     9     
    10     -- 定义局部变量
    11     DECLARE    i INT DEFAULT 1;
    12     DECLARE result INT DEFAULT 0;
    13     WHILE i<=num DO
    14         SET result = result + i;
    15         SET i = i+1;
    16     END WHILE;
    17     SET score = result;
    18 END $
    19 
    20 
    21 CALL pro_testByWhile(200,@score);
    22 SELECT @score;
    1 --携带数据库的数据给输出参数(INTO)
    2 DELIMITER $
    3 CREATE PROCEDURE pro_testByData(IN eid INT,OUT sname VARCHAR(20))
    4 BEGIN
    5     SELECT NAME INTO sname FROM employee WHERE id=eid;
    6 END $
    7 
    8 CALL pro_testByData(2,@sname);
    9 SELECT @sname;ss

    3、mysql数据库三种变量:

    (1)全局变量。mysql内置的变量,mysql程序关闭的时候全局变量才会失效!!

    character_set_client: mysql接收的客户端的数据编码

    character_set_results: mysql使用什么编码输出给客户端数据

    查看某个全局变量: select @@变量名

    修改某个全局变量: set @@变量名=值

    (2)会话变量。变量只在某次登录的会话中有效!退出连接,会话变量数据失效!!  

    查看某个会话变量: select @变量名

    修改/定义某个会话变量: set @变量名=值

    (3)局部变量:在存储过程中定义的变量。存储过程结束局部变量失效!!

    查看某个局部变量: select 变量名

    修改某个局部变量: set 变量名=值

    定义某个局部变量: declare 变量名 数据类型;

    1 -- 定义会话变量去接收输出参数数据            
    2 -- set @n='eric';
    3 CALL pro_testByOut(@n);
    4 -- 查看会话变量n
    5 SELECT @n;

    八、触发器

    当往员工表插入/修改/删除一条数据的时候,同时往日志表记录下来,这时就要使用触发器完成

    有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
  • 相关阅读:
    for循环中变量的作用域问题
    一个数与0进行按位或,能取整
    Spring中日志的使用(log4j)
    MyBatis实现动态语句操作
    MyBatis实现简单增删改查操作
    python计算2的平方根,并输出小数点后的第100万位数字
    Spring配置文件报错:Multiple annotations found at this line: - Element type "beans" must be followed by either attribute specifications, ">" or "/>". - Start tag of element <beans>
    python跳出多重循环
    python中的生成器(二)
    python中的生成器(一)
  • 原文地址:https://www.cnblogs.com/1989guojie/p/6124223.html
Copyright © 2011-2022 走看看