Java教程

sql

本文主要是介绍sql,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

p1什么是数据库

p2初识数据库,关系型和非关系型数据库的区别

p3

p4

p5基本的命令行操作

p6操作数据库语句

p7列的数据类型讲解

p8数据库的字段属性

p9创建数据库表

p10MylSAM和InnDB的区别

p11修改和删除数据表字段
p12数据库级别的外键
p13Insert语句详解
p14Update语句
p15Delete语句
p16基本的select语句和别名使用
p17去重数据库的表达式
p18where子句逻辑运算符
p19模糊查询
p20链表查询joinON
p21自链接以及链表查询联系
p22分页和排序

p23子查询和嵌套查询
p24MySQL常用函数
p25聚合函数以及分组过滤
p26拓展之数据库级别的MD5加密

p27Select小结
p28事物ACID原则,脏读,不可重复读,幻读
p29测试事物实现转账
p30索引介绍以及索引的分类
p31sql编程创建100万条数据测试索引
p32索引原则和明日安排
p33数据库用户管理
p34MySQL备份
p35如何设计一个项目的数据库
p36数据库三大范式
p37数据库驱动和jdbc
p38第一个jdbc程序
p39jdbc中对象解释
p40Statement对象详解
p41SQL注入问题
p42PreparedStatement对象
p43使用IDEA链接数据库
p44JDBC操作事物
p45DBCP-c3p0连接池

 

p1什么是数据库

p2初识数据库,关系型和非关系型数据库的区别

关系型数据库(sql)

MySQL,Oracle,Sql serve,DB2,SQLlite

通过表和表之间,行和列之间的关系进行数据的存储,学院信息表,考勤表,。。。

 

非关系型数据库:(NoSQL) NOT Only

Redis,MongDB

非关系型数据库,对象存储,通过对象的自身的属性来决定

 

DBMS(数据库管理系统)

数据库的管理软件,科学游小的管理我们的数据。维护和获取数据

MySQL,数据库管理系统

 

 

 

p3

p4

p5基本的命令行操作

 

 

 

p6操作数据库语句

 

 

p7列的数据类型讲解

 

 

 

 

 

 

p8数据库的字段属性

 

 

 每一个表都必须存在以下五个字段,未来做项目用的,用来表示一个记录存在意义

id 主键

version 乐观锁

is

 

 

 

 

 

 

p9创建数据库表

p10MylSAM和InnDB的区别

p11修改和删除数据表字段


p12数据库级别的外键

第二种方式


p13Insert语句详解


p14Update语句


p15Delete语句
p16基本的select语句和别名使用


p17去重数据库的表达式


p18where子句逻辑运算符


p19模糊查询

 _是截止 %颗代替空值

left join、join、right join和inner join等等各种join的区别。网上搜,最常见的就是一张图解图,如下:


p20链表查询joinON

一、连接查询分类:

1.交叉连接(不常用):

返回被连接的两个表所有数据行的笛卡尔积;

返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查 询条件的数据行数。

2.内连接:

inner join 或 join

3.外连接

左外连接:left join 或 left outer join

右外连接:right join 或 right outer join

完全外连接:full join 或 full outer join

二、连接查询实例:

数据库中有两张表,一张人员(T_Person)表、一张卡(T_Card)表

内连接

1.内连接(inner join 或 join)

内连接是等值连接,它使用“=、>、<、<>”等运算符根据每个表共有的列的值匹配两个表中的行

查询语句:

 select * from T_Person inner join T_Card on T_Person.CardId = T_Card.CardId  

查询结果:

外连接

1.左连接(left join 或 left outer join)

左连接又称左向外连接,查询的结果集包括SQL语句中左表的所有行,右表中匹配的行。如果左表的某行在右表中没有匹配行,则用空值表示

查询语句:

select * from T_Person left join T_Card on T_Person.CardId = T_Card.CardId  

查询结果:

2.右连接(right join 或 right outer join)

右连接也成右向外连接,查询的结果集包括SQL语句中右表的所有行,左表中匹配的行。如果右表的某行在左表中没有匹配的行,则用空值表示

查询语句:

 select * from T_Person right join T_Card on T_Person.CardId = T_Card.CardId  

查询结果:

3.完全外连接(full join 或 full outer join)

完全外连接,查询的结果集包括SQL语句中左表和右表的所有行。如果某行在另一个表中没有匹配行时,则用空值表示。

查询语句:

 select * from T_Person full join T_Card on T_Person.CardId = T_Card.CardId  

查询结果:


p21自链接以及链表查询联系
p22分页和排序

 

 

 

 

p23子查询和嵌套查询
p24MySQL常用函数

 

 

 

 

 

 

 


p25聚合函数以及分组过滤

 

 


p26拓展之数据库级别的MD5加密

 

 

p27Select小结

 

 


p28事物ACID原则,脏读,不可重复读,幻读


p29测试事物实现转账
p30索引介绍以及索引的分类
p31sql编程创建100万条数据测试索引
p32索引原则和明日安排
p33数据库用户管理

 

 

 

 


p34MySQL备份

 

 


p35如何设计一个项目的数据库
p36数据库三大范式
p37数据库驱动和jdbc

 

 


p38第一个jdbc程序
p39jdbc中对象解释

 

 

 

 


p40Statement对象详解
p41SQL注入问题
p42PreparedStatement对象
p43使用IDEA链接数据库
p44JDBC操作事物
p45DBCP-c3p0连接池

 

SQL数据类型有以下这些:

1、二进制数据类型。

二进制数据包括 Binary、Varbinary 和 Image

Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。

Binary[(n)] 是 n 位固定的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储空间的大小是 n + 4 个字节。

Varbinary[(n)] 是 n 位变长度的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储空间的大小是 n + 4个字节,不是n 个字节。

2、字符数据类型。

字符数据类型包括char、varchar和text。

字符数据是由字母、符号和数字的任意组合组成的数据。

varchar是可变长度字符数据,其长度不超过8kb。char是最大长度为8kb的固定长度字符数据。超过8kb的ASCII数据可以使用文本数据类型存储。

3、Unicode 数据类型。

Unicode数据类型包括nchar、nvarchar和ntext。

在Microsoft SQL Server中,传统的非Unicode数据类型允许使用由特定字符集定义的字符。在安装SQL Server期间,允许选择字符集。

在Unicode标准中,包含由各种字符集定义的所有字符。使用Unicode数据类型占用的空间是使用非Unicode数据类型的两倍。

4、日期和时间数据类型。

日期和时间数据类型包括 Datetime 和 Smalldatetime两种类型。

日期和时间数据类型由有效的日期和时间组成。

例如,有效的日期和时间数据包括“4/01/98 12:15:00:00:00 PM”和“1:28:29:15:01AM 8/17/98”。

前一个数据类型是日期在前,时间在后。后一个数据类型是时间在前,日期在后。

在 Microsoft SQL Server中,日期和时间数据类型包括Datetime 和 Smalldatetime 两种类型时,所存储的日期范围是从 1753 年 1 月 1 日开始,到9999 年12 月 31 日结束(每一个值要求 8 个存储字节)。

5、数字数据类型。

数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点)和整数。

整数由正整数和负整数组成,如39、25、0-2和33967。在Microsoft SQL Server中,存储在整数中的数据类型是int、smallint和tinyint。

int数据类型存储的数据多于smallint数据类型,而smallint数据类型存储的数据多于tinyint数据类型。

使用int数据类型存储数据的范围从-2 147 483 648到2 147 483 647(每个值需要四个字节的存储空间)。

6、货币数据类型。

在 Microsoft SQL Server 中,货币数据的数据类型是Money 和 Smallmoney

Money数据类型要求 8 个存储字节,Smallmoney 数据类型要求 4 个存储字节。

 

 

 

 

 

 

索引

 

 

 

 

 

 

 

 

 插入百万条数据

CREATE TABLE `app_user` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT '',
`eamil` VARCHAR(50) NOT NULL,
`phone` VARCHAR(20) DEFAULT '',
`gender` TINYINT(4) UNSIGNED DEFAULT '0',
`password` VARCHAR(100) NOT NULL DEFAULT '',
`age` TINYINT(4) DEFAULT NULL,
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8-- 插入100万数据.
SET GLOBAL log_bin_trust_function_creators=1; -- 开启创建函数功能
/*
  第一个语句 delimiter 将 mysql 解释器命令行的结束符由”;” 改成了”$$”,
  让存储过程内的命令遇到”;” 不执行
*/
DELIMITER $$
CREATE FUNCTION mock_data()
RETURNS INT
BEGIN
DECLARE num INT DEFAULT 1000000;
DECLARE i INT DEFAULT 0;
WHILE i<num DO
INSERT INTO `app_user`(`name`,`eamil`,`phone`,`gender`)VALUES(CONCAT('用户',i),'19224305@qq.com','123456789',FLOOR(RAND()*2));
SET i=i+1;
END WHILE;
RETURN i;
END;$$

SELECT mock_data()$$ -- 执行此函数 生成一百万条数据

新版本修改密码语句

ALTER USER 'Zuoshuang'@'%' IDENTIFIED BY '1234567';

ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY “123456”;

新版本删除用户语句

DROP USER 'zuoshuang'@'%';

新版本登录 mysql -uroot -p

输入密码

 

 

创建用户
CREATE USER 'username'@'hostname' IDENTIFIED BY 'password';
命令解释:
username:新建用户名
hostname:可用于登录的远程主机,loaclhost为本地登录,%为任意主机均可登录
password:用于登录的密码
命令执行演示:

mysql> create user 'admin'@'localhost' identified by 'admin';
Query OK, 0 rows affected (0.04 sec)

删除用户
DROP USER 'username'@'hostname';
命令解释:
username:要删除的用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则删除失败
命令执行演示:

mysql> drop user 'admin'@'%';
ERROR 1396 (HY000): Operation DROP USER failed for 'admin'@'%'
mysql> drop user 'admin'@'localhost';
Query OK, 0 rows affected (0.03 sec)


用户重命名
RENAME USER 'username'@'hostname' TO 'newname'@'hostname';
命令解释:
username:要重命名的用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则删除失败
newname:新用户名
命令执行演示:

mysql> rename user 'jack'@'%' to 'mike'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from user\G
*************************** 1. row ***************************
user: mike
host: %
*************************** 2. row ***************************

修改密码
参考官方文档及个人实践,MySQL8总共有3种可行的密码修改方式:

方法1:用mysqladmin命令:
mysqladmin -u username -p password
命令解释:
-u username:要修改的用户名
-p :使用密码验证(如已设置过密码)
password:需要执行修改密码操作
命令执行演示:

[root@localhost ~]# mysqladmin -u root -p password
Enter password: #输入原始密码
New password: #输入新密码
Confirm new password: #输入确认密码
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
1
2
3
4
5
方法2:用SET PASSWORD语句:
SET PASSWORD FOR 'username'@'hostname'='password';
FLUSH PRIVILEGES;
命令解释:
username:要修改的用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则修改失败
password:新密码
命令执行演示:

mysql> set password for 'guest'@'localhost'='guest';
ERROR 1133 (42000): Can't find any matching row in the user table
mysql> set password for 'guest'@'%'='guest';
Query OK, 0 rows affected (0.03 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)
1
【注意】 网上有文章指出"="后的新密码应被PASSWORD()函数包围,但经过查证官方文档,PASSWORD()函数已在MySQL8中废弃,直接使用如上方式即可进行密码修改。

mysql> set password for 'guest'@'localhost'=PASSWORD('guest');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PASSWORD('guest')' at line 1
1
2
踩到的坑:使用此种方式修改密码后必须使用FLUSH PRIVILEGES;语句刷新权限,否则无法使用Navicat等工具进行连接访问!

方法3:用ALTER USER语句:
ALTER USER ‘username’@'hostname' IDENTIFIED BY 'passwd';
命令解释:
username:要修改的用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则修改失败
password:新密码
命令执行演示:

mysql> alter user 'guest'@'localhost' identified by '1234';
ERROR 1396 (HY000): Operation ALTER USER failed for 'guest'@'localhost'
mysql> alter user 'guest'@'%' identified by '1234';
Query OK, 0 rows affected (0.01 sec)
1
2
3
4
【注意】 使用此语句修改密码,当前登录用户需要拥有高于或等于被修改用户的权限等级,否则修改失败!

官方手册推荐使用此语句进行密码修改:


其他
网上还有文章指出使用UPDATE语句对mysql数据库中的user表进行操作,经过实际操作发现,此方法已失效,失效原因如下:
1、MySQL8中user表密码字段已不再是password字段,而是authentication_string字段;
2、MySQL8废弃了PASSWORD()函数,导致直接UPDATE此表中的authentication_string字段会变为明文,从而导致无法登录。

感兴趣的小伙伴可以尝试新建用户操作一波,绝对会登录不上去的……

另外还用文章指出使用GRANT授权方式进行密码修改,命令示例:grant usage on *.* to 'username'@'localhost' identified by 'newpassword';,经测试提示失败,目前已不支持在GRANT语句中携带IDENTIFIED BY

 

授权
GRANT privileges ON databasename.tablename TO 'username'@'hostname' [WITH GRANT OPTION];
命令解释:
privileges:对库表的操作权限,如SELECT、UPDATE、DELETE等,同时授权多种操作可用逗号连接,所用操作权限使用ALL
databasename:授权指定数据库名,可使用*代替所有库
tablename:授权指定表名,可使用*代替所有表

如需授权指定操作权限到所有库的所有表可用*.*表示

username:要授权的用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则授权失败
[WITH GRANT OPTION]:可选项,如当前登录用户权限是由其他高级权限用户授予,则此时该用户不能对其他用户继续授权,但当使用可选项语句后,该用户即可对其他用户进行传递授权
命令执行演示:

#当前使用root用户登录
mysql> create user 'jack'@'localhost' identified by 'jack';
Query OK, 0 rows affected (0.05 sec)
mysql> grant select,update on mysql.user to 'jack'@'localhost';
Query OK, 0 rows affected (0.04 sec)

#当前使用jack用户登录
#无权授权其他用户
mysql> grant select on mysql.user to 'guest'@'%';
ERROR 1142 (42000): GRANT command denied to user 'jack'@'localhost' for table 'user'

#使用root用户重新登录并改为使用[WITH GRANT OPTION]授权
mysql> grant select,update on mysql.user to 'jack'@'localhost' with grant option;
Query OK, 0 rows affected (0.02 sec)
#退出root用户并使用jack用户重新登录尝试为其他用户授权
#授权成功
mysql> grant select on mysql.user to 'guest'@'%';
Query OK, 0 rows affected (0.03 sec)

撤销授予的权限
REVOKE privileges ON databasename.tablename FROM 'username'@'hostname';
命令解释:
privileges:需撤销的对库表的操作权限,如SELECT、UPDATE、DELETE等,同时撤销多种操作可用逗号连接,所用操作权限使用ALL
databasename:授权指定数据库名,可使用*代替所有库
tablename:撤销操作权限指定表名,可使用*代替所有表
username:要撤销操作权限的用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则授权失败
命令执行演示:

mysql> revoke all on *.* from 'guest'@'%';
Query OK, 0 rows affected (0.05 sec)
mysql> revoke insert on mysql.user from jack@'localhost';
Query OK, 0 rows affected (0.03 sec)
1
2
3
4
需注意MySQL操作权限又区分为全局层级、数据库层级、表层级、列层级、子程序层级。
全局层级例如:GRANT ALL ON *.*和REVOKE ALL ON *.*此类
数据库层级例如:GRANT ALL ON databasename.*和REVOKE ALL ON databasename.*
表层级例如:GRANT ALL ON databasename.tablename和REVOKE ALL ON databasename.tablename
如上概述,在授权及撤销权限时应做到对应,否则会出现无法撤销对应权限的情况!

查询用户权限方法
方法1:SHOW GRANTS语句
SHOW GRANTS FOR 'username'@'hostname';
命令解释:
username:需查询权限用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则查询失败
命令执行演示:

mysql> show grants for jack@'localhost';
+----------------------------------------------------------------------------------------+
| Grants for jack@localhost |
+----------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `jack`@`localhost` |
| GRANT SELECT, INSERT, UPDATE ON `mysql`.`user` TO `jack`@`localhost` WITH GRANT OPTION |
+----------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
————————————————

 

 

 

导出需要先登录数据库

 

数据库三大范式

 

 

 

 

 

PreparedStatement

reponse验证码实现

 

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws  IOException {
        //如何让浏览器3秒自动刷新一次
        resp.setHeader("refresh","3");
        //在内存中创建一个图片
        BufferedImage image =new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
        //得到图片
        Graphics2D g=(Graphics2D) image.getGraphics();//笔
        //设置图片的背景颜色
        g.setColor(Color.white);
        g.fillRect(0,0,80,20);
        //给图片写数据
        g.setColor(Color.blue);
        g.setFont(new Font(null,Font.BOLD,20));
        g.drawString(makeNum(),0,20);
        resp.setContentType("image/jpeg");
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");
        ImageIO.write(image,"jpg",resp.getOutputStream());

    }
    //生成随机数
    private String makeNum(){
        Random random = new Random();
    String num=    random.nextInt(9999999)+"";
        StringBuffer sb=new StringBuffer();
        for (int i=0;i<7-num.length();i++){
            sb.append("0");
        }
        num=sb.toString() +num;
        return num;


    }

}

 

 

reponse验证码实现

 

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws  IOException {
        //如何让浏览器3秒自动刷新一次
        resp.setHeader("refresh","3");
        //在内存中创建一个图片
        BufferedImage image =new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
        //得到图片
        Graphics2D g=(Graphics2D) image.getGraphics();//笔
        //设置图片的背景颜色
        g.setColor(Color.white);
        g.fillRect(0,0,80,20);
        //给图片写数据
        g.setColor(Color.blue);
        g.setFont(new Font(null,Font.BOLD,20));
        g.drawString(makeNum(),0,20);
        resp.setContentType("image/jpeg");
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");
        ImageIO.write(image,"jpg",resp.getOutputStream());

    }
    //生成随机数
    private String makeNum(){
        Random random = new Random();
    String num=    random.nextInt(9999999)+"";
        StringBuffer sb=new StringBuffer();
        for (int i=0;i<7-num.length();i++){
            sb.append("0");
        }
        num=sb.toString() +num;
        return num;


    }

}

 

------------恢复内容结束------------

这篇关于sql的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!