目录
一.数据库基础代码
mysql -h 主机号 -P 3306 -u 用户名 -p密码 //P 端口 MySQL登录
show databases; //查看所有的数据库
use 表名 :切换到数据库
show tables; //展示当前数据库下的表单名
Ctrl +c 强行终止
describe 表名 :查看当前表内容
create database studnet1; //创建表
exit;//退出
-- 单行注释
/*
*/ 多行注释
drop database 数据库名 : 移除数据库
所有的语句封号结尾
==========================================
二.数据类型
1、数值
1.tinyint 十分小的数据,只占一个字符
2.smallint 较小的数据,2个字节
3. int 标准的数据 4个字节
4.mediumint 中等大小的数据 3个字节
5. bigint 较大的数据 8 个字节
6.float 浮点数 4个字节
7.double 浮点数 8个字节
8.decimal 字符串形式浮点数 金融计算会用到
2、字符串
1.varchar 可变字符串 0-65535
2. char 字符串固定大小 0-255
3.tinytext 微型文本 2^8 -1
4.text 文本串 2^16 -1 //保存大文本
3.日期
1.datetime 日期和时间加到一起
2.timestamp 时间戳 1970.1.1到现在的毫秒数
3.year 年份表示
4.null
不要用null计算任何数与null计算都是null
三.数据库的字段属性
1.填充零 不足的位数用零填充 int(3)5 ----005
2.自动递增 自动在上一条记录加一,必须是整数类型
3.无符号 声明该数据不能为负数
4.非空 勾了的就必须填值,不勾可以不写,默认是null
CREATE TABLE `ss` ( //表名与括号有空格 结尾用“;” “`”表名,字段名用这个
`id` int(4) NOT NULL,
`NAME` VARCHAR(50) NOT NULL
);
MySQL的引擎默认是InnoDB
四。修删表
1.修改
ALTER TABLE ss RENAME AS hailmyfuther //修改表名中间不能有空格,旧的在前,新的在后
alter table hailmyfuther modify id varchar(11); --修改约束
alter table hailmyfuther change id varchar(11); --字段重命名
ALTER TABLE hailmyfuther ADD ages INT(11) --删除表的字段名
2.删除
drop table stu_info;
============================================
五.DML语言
1.插入
INSERT INTO `WAR`(`tanks`) VALUES('虎式')
//插入多条语句
INSERT INTO `WAR`(`tanks`) VALUES('四号'),('美洲豹'),('鬣狗')
/*
ERROR 1364 (HY000): Field 'tanks' doesn't have a default value
因为NOT NULL被勾选所以必须要有值,解决的话就不要勾NOT NULL
*/
2.修改
update WAR set tanks ='三秃子' where tanks = '三号';
update WAR set plane ='彗星1',tanks ='彪马' where id >='4'; //id大于4或等于4
update WAR set plane ='彗星2',tanks ='齐柏林' where id between 2 and 4; // 在2和4之间
update WAR set plane ='俾斯麦',tanks ='小齐柏林' where id = '1'and'4'; //是id1和4
3.删除
delete from WAR where id = '10'; //删除制定数据
truncate hailmyfuthe; //清空表里的数据
*/mysql错误:Column count doesn't match value count at row 1 是因为列和数值不匹配
所以要 insert into test(id,coll) values('1','2');
六.查询语言
1.select查询语句
select * from WAR;//查找所以字段
+------+----------+----------+------+
| id | tanks | plane | wuqi |
+------+----------+----------+------+
| 1 | 小齐柏林 | 俾斯麦 | |
| 2 | 欧根 | 提尔比茨 | |
| 3 | 齐柏林 | 彗星2 | |
| 4 | 齐柏林 | 彗星2 | |
| 5 | 彪马 | 彗星1 | |
| 6 | 彪马 | 彗星1 | NULL |
| 7 | 彪马 | 彗星1 | NULL |
| 8 | 彪马 | 彗星1 | NULL |
| 9 | 欧根 | 提尔比茨 | 98K |
+------+----------+----------+------+
select tanks,plane from WAR;//查询指定字段
+----------+----------+
| tanks | plane |
+----------+----------+
| 小齐柏林 | 俾斯麦 |
| 欧根 | 提尔比茨 |
| 齐柏林 | 彗星2 |
| 齐柏林 | 彗星2 |
| 彪马 | 彗星1 |
| 彪马 | 彗星1 |
| 彪马 | 彗星1 |
| 彪马 | 彗星1 |
| 欧根 | 提尔比茨 |
+----------+----------+
select tanks as 战舰,plane as 飞机 from WAR; //别名。给字段,表名起名字
+----------+----------+
| 战舰 | 飞机 |
+----------+----------+
| 小齐柏林 | 俾斯麦 |
| 欧根 | 提尔比茨 |
| 齐柏林 | 彗星2 |
| 齐柏林 | 彗星2 |
| 彪马 | 彗星1 |
| 彪马 | 彗星1 |
| 彪马 | 彗星1 |
| 彪马 | 彗星1 |
| 欧根 | 提尔比茨 |
+----------+----------+
select concat('姓名:',tanks) as 新名字 from WAR;
+---------------+
| 新名字 |
+---------------+
| 姓名:小齐柏林 |
| 姓名:欧根 |
| 姓名:齐柏林 |
| 姓名:齐柏林 |
| 姓名:彪马 |
| 姓名:彪马 |
| 姓名:彪马 |
| 姓名:彪马 |
| 姓名:欧根 |
+---------------+
9 rows in set (0.04 sec)
2.数据表去重复
mysql> select distinct tanks from WAR; //去掉重复数据
+----------+
| tanks |
+----------+
| 小齐柏林 |
| 欧根 |
| 齐柏林 |
| 彪马 |
+----------+
4 rows in set (0.04 sec)
mysql> select version(); //查询版本号
+-----------+
| version() |
+-----------+
| 8.0.29 |
+-----------+
1 row in set (0.04 sec)
mysql> select 100*3-2; //计算
+---------+
| 100*3-2 |
+---------+
| 298 |
+---------+
1 row in set (0.03 sec)
mysql> select @@auto_increment_increment; //用来查询自增的步长
+----------------------------+
| @@auto_increment_increment |
+----------------------------+
| 1 |
+----------------------------+
1 row in set (0.04 sec)
mysql> select tanks,id +1 as 战力 from WAR //战力+1
-> ;
+----------+------+
| tanks | 战力 |
+----------+------+
| 小齐柏林 | 2 |
| 欧根 | 3 |
| 齐柏林 | 4 |
| 齐柏林 | 5 |
| 彪马 | 6 |
| 彪马 | 7 |
| 彪马 | 8 |
| 彪马 | 9 |
| 欧根 | 10 |
+----------+------+
9 rows in set (0.04 sec)
mysql> select tanks,plane from WAR where id !=6; //id不等于6的数据
+----------+----------+
| tanks | plane |
+----------+----------+
| 小齐柏林 | 俾斯麦 |
| 欧根 | 提尔比茨 |
| 齐柏林 | 彗星2 |
| 齐柏林 | 彗星2 |
| 彪马 | 彗星1 |
| 彪马 | 彗星1 |
| 彪马 | 彗星1 |
| 欧根 | 提尔比茨 |
+----------+----------+
8 rows in set (0.04 sec)
3.where条件子句
运算符 | 语法 | 描述 |
and | a and b | 逻辑与 |
or | a or b | 逻辑或 |
not | not a | 逻辑非 |
4.模糊查询
运算符 | 语法 | 描述 |
IS NULL | a if null | 如果描述符为null,结果为真 |
IS NOT NULL | a is not null | 如果操作符不为null,结果为真 |
BETWEEN | a between b and c | 若a在b和c之间,则结果为真 |
like | a like b | SQL匹配,如果a匹配b,则结果为真 |
IN | a in(a1,a2,a3...) | 假设a在a1,或者a2...其中的某一个值中,结果为真 |
mysql> select tanks,plane from WAR where tanks like '齐%';
//模糊查询字段里存在的有齐的字段,后面没有限制 %表示0-任意一个字段
+--------+-------+
| tanks | plane |
+--------+-------+
| 齐柏林 | 彗星2 |
| 齐柏林 | 彗星2 |
| 齐格飞 | NULL |
+--------+-------+
3 rows in set (0.04 sec)
mysql> select tanks,plane from WAR where tanks like '齐_';//_代表名字后只有一个字
Empty set (0.06 sec)
mysql> select tanks,plane from WAR where tanks like '%齐%';
+----------+--------+
| tanks | plane |
+----------+--------+
| 小齐柏林 | 俾斯麦 |
| 齐柏林 | 彗星2 |
| 齐柏林 | 彗星2 |
| 齐格飞 | NULL |
+----------+--------+
4 rows in set (0.04 sec)
mysql> select tanks,plane from WAR where id in (5,7,9); //in关键字
+-------+----------+
| tanks | plane |
+-------+----------+
| 彪马 | 彗星1 |
| 彪马 | 彗星1 |
| 欧根 | 提尔比茨 |
+-------+----------+
3 rows in set (0.04 sec
mysql> select tanks,plane,id from WAR where plane is null; //查询空值
+--------+-------+------+
| tanks | plane | id |
+--------+-------+------+
| 齐格飞 | NULL | 10 |
+--------+-------+------+
1 row in set (0.05 sec)
5.连表查询
mysql> select s.id,tanks,genreal from WAR as s inner join test as w where s.id = w.id;
//以两个表共有的属性“id”为基础去查询 语法 inner join
+------+----------+---------------+
| id | tanks | genreal |
+------+----------+---------------+
| 1 | 小齐柏林 | 艾尔温-隆美尔 |
| 2 | 欧根 | 巴顿 |
| 3 | 齐柏林 | 冯-博克 |
| 4 | 齐柏林 | 曼施坦因 |
+------+----------+---------------+
4 rows in set (0.04 sec)
mysql> select w.id,tanks,xinghao from WAR as s right join test as w on s.id = w.id;
//右查询
+----+----------+---------+
| id | tanks | xinghao |
+----+----------+---------+
| 1 | 小齐柏林 | 三号 |
| 2 | 欧根 | 二号 |
| 3 | 齐柏林 | 四号 |
| 4 | 齐柏林 | 五号 |
| 5 | 彪马 | 一号 |
| 6 | 彪马 | 六号 |
+----+----------+---------+
6 rows in set (0.04 sec)
操作 | 描述 |
INNER JOIN | 如果表中至少有一个匹配,就返回值 |
left join | 会从左表返回所有的值,即使右表中没有匹配 |
right join | 会从右表返回所有的值,即使左表没有匹配 |
6.自连接(了解)
一张表拆成两张一样的表
father | general | son |
4 | 艾尔温-隆美尔 | 三号 |
5 | 巴顿 | 三号 |
4 | 冯-博克 | 四号 |
4 | 曼施坦因 | 一号 |
5 | 艾森豪威尔 | 一号 |
4 | 古德里安 | 二号 |
父类:
general | father |
曼施坦因 | 4 |
艾森豪威尔 | 5 |
子类:
son | general | father |
4 | 艾尔温-隆美尔 | 三号 |
5 | 巴顿 | 七号 |
4 | 冯-博克 | 四号 |
4 | 古德里安 | 二号7 |
7.分页和排序
1.排序
mysql> select grades from students order by grades desc; //j降序
+--------+
| grades |
+--------+
| 95 |
| 91 |
| 89 |
| 85 |
+--------+
4 rows in set (0.05 sec)
mysql> select grades from students order by grades asc; //升序
+--------+
| grades |
+--------+
| 85 |
| 89 |
| 91 |
| 95 |
+--------+
4 rows in set (0.04 sec)
2.分页
mysql> select grades,name,id from students order by grades asc limit 1,5;
//查询第一到第五条的数据并以升序排列
+--------+----------+----+
| grades | name | id |
+--------+----------+----+
| 86 | 野兽前辈 | 5 |
| 89 | 小红 | 2 |
| 89 | 石田浩二 | 6 |
| 91 | 小马 | 3 |
| 95 | 小毛 | 4 |
+--------+----------+----+
5 rows in set (0.04 sec)
mysql> select grades,name,id,class from students where class like 'java' and grades > 86 limit 0,2;
//搜索课程java并且成绩大于86的名字,分页0-2
+--------+--------+----+-------+
| grades | name | id | class |
+--------+--------+----+-------+
| 91 | 小马 | 3 | java |
| 95 | 小毛 | 4 | java |
+--------+--------+----+-------+
2 rows in set (0.03 sec)
8.常用函数
mysql> select char_length('梅须逊雪三分白'); ---查询字段长度
+-------------------------------+
| char_length('梅须逊雪三分白') |
+-------------------------------+
| 7 |
+-------------------------------+
1 row in set (0.31 sec)
mysql> select concat('1','2','3'); ---把分开的连成一起
+---------------------+
| concat('1','2','3') |
+---------------------+
| 123 |
+---------------------+
1 row in set (0.03 sec)
mysql> select insert('hhhahah',1,2,'笑死'); --顶替第一,二中的字符
+------------------------------+
| insert('hhhahah',1,2,'笑死') |
+------------------------------+
| 笑死hahah |
+------------------------------+
1 row in set (0.03 sec)
mysql> select lower('hailmyfuther'); --改成小写
+-----------------------+
| lower('hailmyfuther') |
+-----------------------+
| hailmyfuther |
+-----------------------+
1 row in set (0.04 sec)
mysql> select upper('hailmyfuther'); ---改成大写
+-----------------------+
| upper('hailmyfuther') |
+-----------------------+
| HAILMYFUTHER |
+-----------------------+
1 row in set (0.03 sec)
mysql> select instr('zzzwqwew','q'); --查找字段中字符在第几位
+-----------------------+
| instr('zzzwqwew','q') |
+-----------------------+
| 5 |
+-----------------------+
1 row in set (0.04 sec)
mysql> select replace('人事如潮人如水,不胜今朝一场醉','如潮','如海'); --修改固定的字符
+---------------------------------------------------------+
| replace('人事如潮人如水,不胜今朝一场醉','如潮','如海') |
+---------------------------------------------------------+
| 人事如海人如水,不胜今朝一场醉 |
+---------------------------------------------------------+
1 row in set (0.03 sec)
mysql> select substr('人事如潮人如水,不胜今朝一场醉',3,4); --查找第三个字符的后四个字符
+----------------------------------------------+
| substr('人事如潮人如水,不胜今朝一场醉',3,4) |
+----------------------------------------------+
| 如潮人如 |
+----------------------------------------------+
1 row in set (0.03 sec)
mysql> select reverse('人事如潮人如水,不胜今朝一场醉'); ---反过来字符
+-------------------------------------------+
| reverse('人事如潮人如水,不胜今朝一场醉') |
+-------------------------------------------+
| 醉场一朝今胜不,水如人潮如事人 |
+-------------------------------------------+
1 row in set (0.04 sec)
mysql> select current_date(); ---查询时间
+----------------+
| current_date() |
+----------------+
| 2022-08-03 |
+----------------+
1 row in set (0.05 sec)
mysql> select now(); ---现在的时间
+---------------------+
| now() |
+---------------------+
| 2022-08-03 03:24:10 |
+---------------------+
1 row in set (0.03 sec)
mysql> select user(); ---查询版本号
+------------------+
| user() |
+------------------+
| mxx@1.83.124.115 |
+------------------+
1 row in set (0.04 sec)
1.聚合函数
mysql> select count(tanks) from WAR; --求总数,但包括null
+--------------+
| count(tanks) |
+--------------+
| 10 |
+--------------+
1 row in set (0.03 sec)
mysql> select count(*) from WAR; //包括空值
+----------+
| count(*) |
+----------+
| 10 |
+----------+
1 row in set (0.04 sec)
mysql> select count(1) from WAR; //两者(1)差不多推荐用(*),
+----------+
| count(*) |
+----------+
| 10 |
+----------+
1 row in set (0.04 sec)
mysql> select sum(grades) from students; //求总和
+-------------+
| sum(grades) |
+-------------+
| 731 |
+-------------+
1 row in set (0.06 sec)
mysql> select avg(grades) from students; //求平均值
+-------------+
| avg(grades) |
+-------------+
| 91.3750 |
+-------------+
1 row in set (0.04 sec)
mysql> select max(grades) from students;//求最大值
+-------------+
| max(grades) |
+-------------+
| 99 |
+-------------+
1 row in set (0.07 sec)
mysql> select min(grades) from students;//求最小值
+-------------+
| max(grades) |
+-------------+
| 99 |
+-------------+
1 row in set (0.07 sec)
mysql> select max(grades),min(grades),avg(grades),class from students where class = 'java';
//求java成绩最大,最小,平均值
+-------------+-------------+-------------+-------+
| max(grades) | min(grades) | avg(grades) | class |
+-------------+-------------+-------------+-------+
| 95 | 86 | 90.6667 | java |
+-------------+-------------+-------------+-------+
1 row in set (0.03 sec)
mysql> select max(grades),min(grades),avg(grades),class from students where class = 'java'group by id;
//求java成绩最大,最小,平均值,分组
+-------------+-------------+-------------+-------+
| max(grades) | min(grades) | avg(grades) | class |
+-------------+-------------+-------------+-------+
| 91 | 91 | 91.0000 | java |
| 95 | 95 | 95.0000 | java |
| 86 | 86 | 86.0000 | java |
+-------------+-------------+-------------+-------+
3 rows in set (0.04 sec)
2.MD5加密
mysql> update testmd5 set pwd = md5(pwd) where id =1; //将密码加密
Query OK, 1 row affected (0.20 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> insert into testmd5 values(4,'xiaoming',md5('123456789'));//插入时就加密
Query OK, 1 row affected (0.05 sec)
mysql> select * from testmd5 where name = 'xiaoming' and pwd =md5('123456789');
//检查密码是否正确,如果错误输出为空
+----+----------+----------------------------------+
| id | name | pwd |
+----+----------+----------------------------------+
| 4 | xiaoming | 25f9e794323b453885f5181f1b624d0b |
+----+----------+----------------------------------+
1 row in set (0.04 sec)
七.事务
1.acid
原子性(Atomicity)要么都成功,要么都失败
一致性(Consistency)事后数据要保持一致性
持久性(Durability)事务提交则不可逆,被持久化到数据库中
隔离性 (isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务所干扰且要相互隔离
mysql> SET AUTOCOMMIT = 0; //关闭自动传输
Query OK, 0 rows affected (0.03 sec)
mysql> start transaction; //设置一个事务
Query OK, 0 rows affected (0.03 sec)
mysql> update account set money = money-500 where name = 'A'; --A减500 //传值
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
-> ^C
mysql> update account set money = money+500 where name = 'B'; --B减500 //传值
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
-> ^C
mysql> COMMIT; //上传数据库
Query OK, 0 rows affected (0.04 sec)
mysql> ROLLBACK; //回滚到上一次正确的数据
Query OK, 0 rows affected (0.04 sec)
mysql> set autocommit = 1; //开始自动传输
Query OK, 0 rows affected (0.04 sec)
八.索引
1.通俗的说来使得MySQL查询数据更迅速高效
2.分类:主键索引(PRIMARY KEY)、唯一索引(UNIQUE KEY)
常规索引(KEY)
多用于大数据量
mysql> show index from account; //查看表的索引
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| account | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | | YES | NULL |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.03 sec)
mysql> alter table shop.account add fulltext index name(name); //添加索引fulltext到name
Query OK, 0 rows affected, 1 warning (0.85 sec)
Records: 0 Duplicates: 0 Warnings: 1
九.数据备份
选择自己要导出格式然后就一直下一步就完事了
也可以到处数据库
十、三大范式 (了解)
1.第一范式(1NF)原子性:保证每一列不可再分
2.第二范式(2NF)前提:满足第一范式 每张表只描述一件事
3.第三范式(3NF)前提:满足第一范式和第二范式,第三范式要确保数据表中每一列数据都和主键直接相关,不能间接相关
但三大范式不是完美的 1.考虑商业化的需求和目标数据库的性能更加重要
2.在规范性能的问题,要适当考虑规范性
3.故意给表加一些冗余的字段(从多表查询变为单表查询)
4.故意加一些计算列(从大数据量降低为小数据量的查询:索引)
十一、JDBC
把mysql.jar导入后要添加到项目中才能使用
MySQL的bug
No suitable driver found for "jdbc:mysql://43.142.160.32:3306/shop?useUnicode=true&characterEncoding
看有没有引号或者mysql的jar包版本是不是正确的,因为版本不同就导致书写不同我的是8.0.15
所以是以下写法
十二、数据库池化
为了节约空间而编写一种数据库,能更好的管理数据,而不因为数据连接或断开造成浪费