Mysql数据库基础

1、Mysql

1.1 SQL的概念

Structured Query Language 结构化查询语言

1.2 SQL的作用

  1. 是一种所有关系型数据库的查询规范,不同的数据库都支持。
  2. 通用的数据库操作语言,可以用在不同的数据库中。
  3. 不同的数据库 SQL 语句有一些区别
    在这里插入图片描述

1.3 SQL语句的分类

  1. Data Definition Language (DDL 数据定义语言) 如:建库,建表
  2. Data Manipulation Language(DML 数据操纵语言),如:对表中的记录操作增删改
  3. Data Query Language(DQL 数据查询语言),如:对表中的查询操作
  4. Data Control Language(DCL 数据控制语言),如:对用户权限的设置

1.4 MySQL的语法

MySQL 的语法

  1. 每条语句以分号结尾,如果在 SQLyog 中不是必须加的。
  2. SQL 中不区分大小写,关键字中认为大写和小写是一样的
  3. 三种注释:–空格,/**/, #,其中#是myql特有的。

1.5 SQL操作

1.5.1 DDL:操作数据库、表

  1. 操作数据库:CRUD

     - create database if not exists db4 character set gbk;-- *创建数据库:创建db4数据库,判断是否存在,并制定字符集为gbk
     - show databases; -- 查询所有数据库的名称
       show create database 数据库名称; -- 查询某个数据库的字符集:查询某个数据库的创建语句
     - alter database 数据库名称 character set 字符集名称; -- 修改数据库的字符集
     - drop database if exists 数据库名称; -- 判断数据库存在,存在再删除
     - select database(); -- 查询当前正在使用的数据库名称
       use 数据库名称; -- 使用数据库
    
  2. 操作表

     1. C(Create):创建
    
     	1. 语法:
    
     		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):姓名最大20个字符
     				* zhangsan 8个字符  张三 2个字符
     		
    
     	* 创建表
     		create table student(
     			id int,
     			name varchar(32),
     			age int ,
     			score double(4,1),
     			birthday date,
     			insert_time timestamp
     		);
     	* 复制表:
     		* create table 表名 like 被复制的表名;	  	
     		
     2. R(Retrieve):查询
     	* 查询某个数据库中所有的表名称
     		* show tables;
     	* 查询表结构
     		* desc 表名;
     3. U(Update):修改
     	1. 修改表名
     		alter table 表名 rename to 新的表名;
     	2. 修改表的字符集
     		alter table 表名 character set 字符集名称;
     	3. 添加一列
     		alter table 表名 add 列名 数据类型;
     	4. 修改列名称 类型
     		alter table 表名 change 列名 新列名 新数据类型;
     		alter table 表名 modify 列名 新数据类型;
     	5. 删除列
     		alter table 表名 drop 列名;
     4. D(Delete):删除
     	* drop table 表名;
     	* drop table  if exists 表名 ;
    

1.5.2 DML:增删改表中数据

1. 添加数据:
	* 语法:
		* insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
	* 注意:
		1. 列名和值要一一对应。
		2. 如果表名后,不定义列名,则默认给所有列添加值
			insert into 表名 values(值1,值2,...值n);
		3. 除了数字类型,其他类型需要使用引号(单双都可以)引起来
2. 删除数据:
	* 语法:
		* delete from 表名 [where 条件]
	* 注意:
		1. 如果不加条件,则删除表中所有记录。
		2. 如果要删除所有记录
			1. delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作
			2. TRUNCATE TABLE 表名; -- 推荐使用,效率更高 先删除表,然后再创建一张一样的表。
3. 修改数据:
	* 语法:
		* update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件];
	* 注意:
		1. 如果不加任何条件,则会将表中所有记录全部修改。

1.5.3 DQL:查询表中的记录

* select * from 表名;

1. 语法:
	select 字段列表
	from 表名列表
	where 条件列表
	group by 分组字段
	having 分组之后的条件
	order by 排序
	limit 分页限定

2. 基础查询
	1. 多个字段的查询
		select 字段名1,字段名2... from 表名;
		* 注意:
			* 如果查询所有字段,则可以使用*来替代字段列表。
	2. 去除重复:
		* distinct
	3. 计算列
		* 一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
		* ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
			* 表达式1:哪个字段需要判断是否为null
			* 如果该字段为null后的替换值。
	4. 起别名:
		* as:as也可以省略
		
3. 条件查询
	1. where子句后跟条件
	2. 运算符
		* > 、< 、<= 、>= 、= 、<>
		* BETWEEN...AND  
		* IN( 集合) 
		* LIKE:模糊查询
			* 占位符:
				* _:单个任意字符
				* %:多个任意字符
		* IS NULL  
		* and  或 &&
		* or  或 || 
		* not  或 !

1.5.4 DCL:数据库控制语句

 * 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'@'%';

1.5.5 细节问题

1. Order by:多个排序条件,只有第一排序条件相同时才会启用第二排序条件,以此类推。
2. 聚合函数:会排除为null的值。
3. group by:分组之前的条件用where ,分组之后条件用having。
4. limit:分页是mysql特有的方言,可以添加两个参数,一个是起始索引从0开始,一个是每页的条数。
5. distinct:去重的字段要放在查询字段的最前面。
6. 判断是否为null,要用IS NULL 或者 IS NOT NULL。

1.6 约束的分类

1.主键约束:primary key
	删除主键:alter table 表名 drop primary key;
2. 非空约束:not null
3. 唯一约束:unique
4. 外键约束:foreign key
					*删除外键:alter table 表名 drop foreign key 名称;
					*添加外键:alter table 表名 add constraint 外键名称 forieign key (本表中的外键) references 表名称(表中的字段);
					*级联更新:alter table 表名 add constraint 外键名称 forieign key (本表中的外键) references 表名称(表中的字段)级联更新;
					*级联删除:alter table 表名 add constraint 外键名称 forieign key (本表中的外键) references 表名称(表中的字段)级联删除;

1.7 数据库设计范式

  1. 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

  2. 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

  3. 三大范式

    • 第一范式(1NF):每一列都是不可分割的原子列。

    • 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)。

        几个概念
       		1. 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
       			例如:学号-->姓名。  (学号,课程名称) --> 分数
       		2. 完全函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
       			例如:(学号,课程名称) --> 分数
       		3. 部分函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
       			例如:(学号,课程名称) -- > 姓名
       		4. 传递函数依赖:A-->B, B -- >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
       			例如:学号-->系名,系名-->系主任
       		5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
       			例如:该表中码为:(学号,课程名称)
       			* 主属性:码属性组中的所有属性
       			* 非主属性:除过码属性组的属性
      
    • 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)。

1.8 事务

  1. 概念:一组原子操作,要么同时成功,要么同时失败。
  2. 操作:开启事务,执行操作,成功的话提交,出错的话回滚。
  3. mysql的提交方式:
  • 默认自动提交
  • 手动提交需要先开启事务start transaction ->操作->commit or rollback
  • 查询当前的提交方式
    * select @@autocommit; – 1代表自动 0代表手动
    * 修改默认提交方式:set @@autocommit=0;
  1. 事务的四大特征
    * 原子性:不可分隔。
    * 持久性:事务提交或回滚,数据会被持久保存。
    * 隔离性:多个事务相互独立。
    * 一致性:数据操作前后总和不变,例如A +500 + B-500 = A+B。
  2. 事务的隔离级别
    	1. 概念:多个事务之间应该是相互隔离的,如果多个事务操作同一批数据,会引发一些问题,解决这些问题的方法就是事务的隔离级别。
    	2. 存在的问题
    			* 脏读:一个事务读到了另一个未提交的事务。
    					*比如我给你转了100万,但是我还没有提交,此时你查询自己账户,多了100万,很开心。然后我发现转错人了,回滚了事物。
    					 然后你100万就没了。  在过程中你查到了没有提交事物的数据(多出的100万),这就是脏读。
    			* 不可重复读:也称为虚读,在同一个事务中,两次读取到的数据不一样,这是由于在查询间隔,被另一个事务修改并提交了。
    					* 在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就
    					  有可能发生问题,例如同一个事物前后两次查询同一个数据,期望两次读的内容是一样的,但是因为读的过程中,因为令一个
    					  数据写了该数据,导致不可重复读。
    			* 幻读:幻读是事务非独立执行时发生的一种现象。幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),
    				   所不同的是不可重复读查询的都是同一个数据,而幻读针对的是一批数据整体(比如数据的个数)。
    			 		* 例如事务A删除了表中的一条数据,但是同时事务B往表中添加了一条数据,这时事务A查询,发现数据总条数并没有改变,
    			 		  好像发生了幻觉。
    	3. 隔离级别:
    			1. read uncommitted:读未提交
    				* 产生的问题:脏读、不可重复读、幻读
    			2. read committed:读已提交 (Oracle)
    				* 产生的问题:不可重复读、幻读
    			3. repeatable read:可重复读 (MySQL默认)
    				* 产生的问题:幻读
    			4. serializable:串行化
    				* 可以解决所有的问题
    	
    			* 注意:隔离级别从小到大安全性越来越高,但是效率越来越低
    			* 数据库查询隔离级别:
    				* select @@tx_isolation;
    			* 数据库设置隔离级别:
    				* set global transaction isolation level  级别字符串;	
    

1.9 JDBC

	1. 使用jDBC的步骤
	    //注册驱动
        Class.forName("com.mysql.jdbc.Driver"):
        //获取连接
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testljl", "root", "");
        //开启事务
         con.setAutoCommit(false);
        //获取执行对象
        Statement statement = con.createStatement();
        //执行sql
        ResultSet resultSet = statement.executeQuery("select * from account");
		//提交事务或者出异常回滚事务con.rollback();
        con.commit();
        //处理结果集
        while (resultSet.next()) {
            String name = resultSet.getString(1);
            double money = resultSet.getDouble(2);
            System.out.println(name + "每个月赚" + money);
        }
        //释放资源
        resultSet.close();
        statement.close();  
        con.close();
        
	2. 说明
		 *	DriverManager.registerDriver(new com.mysql.jdbc.Driver());这种方式不好,会导致驱动注册两次
		 *	5版本之后的jar即使不注册也没问题。
		 * 获取结果集中的某个字段值的方式传递的是,它在查询字段的位置,从1开始。
		 * 使用预编译对象preparedStatement,给占位符?赋值也是从1开始。

1.10 连接池的使用

 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
	* 代码:
		 //1.创建数据库连接池对象
        DataSource ds  = new ComboPooledDataSource();
        //2. 获取连接对象
        Connection conn = ds.getConnection();
5. Druid:数据库连接池实现技术,由阿里巴巴提供的
	1. 步骤:
		1. 导入jar包 druid-1.0.9.jar
		2. 定义配置文件:
			* 是properties形式的
			* 可以叫任意名称,可以放在任意目录下
		3. 加载配置文件。Properties
		4. 获取数据库连接池对象:通过工厂来来获取  DruidDataSourceFactory
		5. 获取连接:getConnection
	* 代码:
		 //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();

2、Orcle

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值