提示:以下是本篇文章正文内容,下面案例可供参考
一、关系型数据库
(1)关系数据库:通过具有行列关系的表进行数据存储。
(2)关系型数据库主要的类型:mysql,oracle,sqlserver等。
(3)mysql数据库的特点:免费的,跨平台的;在数据库中有默认的三个表:information_schema,mysql,performance_schema。
二、Mysql的数据类型
1.数字类型
1.1 int
与java整数类型的对应:
java的整数类型 | byte | short | int | long |
---|---|---|---|---|
mysql的整数类型 | tinyint(1个字节) | samallint(2个字节) | int(4个字节) | bigint(8个字节) |
1.2 浮点类型
(1)flloat:小数位少,精确度比较低
(2)double:小数位多,精确度比较高
double类型的数据在进行运算时,结果可能不精确。
(3)decimal
格式:decimal(数字1,数字2)
数字1:当前的数最多一共有几位
数字2:小数占几位
mysql> create table t4(age decimal(5,2));--age中的数最多5位,其中小数点后面有2位
Query OK, 0 rows affected (0.04 sec)
mysql> insert into t4(age) values(1.22);
Query OK, 1 row affected (0.02 sec)
mysql> select * from t4;
+------+
| age |
+------+
| 1.22 |
+------+
1 row in set (0.00 sec)
mysql> insert into t4(age) values(333.22);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t4(age) values(3313.22);
ERROR 1264 (22003): Out of range value for column 'age' at row 1--插入的数是6位超出范围
mysql> insert into t4(age) values(333);--存入虽然是整数,但是存入后默认有两位小数
Query OK, 1 row affected (0.00 sec)
mysql> select * from t4;
+--------+
| age |
+--------+
| 1.22 |
| 333.22 |
| 333.00 |
+--------+
3 rows in set (0.00 sec)
mysql> insert into t4(age) values(1.222435435465765);--虽然小数位数超出2位,但还是可以存,默认只存小数点后两位
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from t4;
+--------+
| age |
+--------+
| 1.22 |
| 333.22 |
| 333.00 |
| 1.22 |
+--------+
4 rows in set (0.00 sec)
2.字符串类型
2.1 varchar类型
(1)varchar在进行数据存储时,没有默认长度,必须指定长度,不然会报错
mysql> create table t5(age varchar);
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 ')' at line 1
(2)varchar类型进行字符串存储时,存储容量大。
2.2 char类型
char类型进行数据存储时,有默认长度为1,可以不指定长度,char类型的最大长度为255.
mysql> create table t5(age char);
Query OK, 0 rows affected (0.04 sec)
mysql> desc t5;--查询表中各字段的详细信息
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| age | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> create table t6(age char(99999));
ERROR 1074 (42000): Column length too big for column 'age' (max = 255); use BLOB or TEXT instead
如果没有指定字段类型,默认为char类型
varchar和char的区别:
(1)varchar是变长字符串,在进行数据存储时会根据字符串的实际长度进行空间的占用,剩下空间释放。
优点:可以节省空间;缺点:释放时浪费时间
(2)char是定长字符串,创建时分配的空间会进行全部占用,即使字符串实际长度不够占用全部空间,也会有空间磁盘占用
优点:节省时间 缺点:占用空间
3.text类型
优点:不用指定长度,若不知道字符串的长度,使用text类型
4. 日期类型
(1)用数字表示日期时,插入数据需要保证数据的位数:年份4位,月份2位,日期2位;
(2)插入字符串表示年月日("xxxx-x-x"),时分秒("x:x:x")可以不严格保证数据的位数,例如1999年1月1日,用数字插入必须写成:19990101,用字符串表示:“1999-1-1”就可以
-
date
表示年月日,可以表示生日
-
time
表示时分秒,可以用来线上考试计时
-
datetime 和 timestamp
表示年月日时分秒
-
year
年份的存储
三、数据类型相关的方法
1.数字类型方法
mysql> select pi();--查询π的值
+----------+
| pi() |
+----------+
| 3.141593 |
+----------+
1 row in set (0.00 sec)
mysql> select floor(9.9999);--向下取整
+---------------+
| floor(9.9999) |
+---------------+
| 9 |
+---------------+
1 row in set (0.00 sec)
mysql> select ceil(2.0001);--向上取整
+--------------+
| ceil(2.0001) |
+--------------+
| 3 |
+--------------+
1 row in set (0.00 sec)
mysql> select round(4.5);--四舍五入取整
+------------+
| round(4.5) |
+------------+
| 5 |
+------------+
1 row in set (0.00 sec)
mysql> select pow(2,3);--计算平方
+----------+
| pow(2,3) |
+----------+
| 8 |
+----------+
1 row in set (0.00 sec)
mysql> select sqrt(9);--求平方根
+---------+
| sqrt(9) |
+---------+
| 3 |
+---------+
1 row in set (0.00 sec)
2.字符串类型方法
mysql> select length("中");-- 求字节长度
+--------------+
| length("中") |
+--------------+
| 3 |
+--------------+
1 row in set (0.18 sec)
mysql> select char_length("中");-- 求字符长度
+-------------------+
| char_length("中") |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.12 sec)
mysql> select substr("abcd",1,3);-- 1是截取的位置,3是截取的个数;字符串位置是从1开始的
+--------------------+
| substr("abcd",1,3) |
+--------------------+
| abc |
+--------------------+
1 row in set (0.17 sec)
mysql> select substr("123456789",-1);-- 截取最后一个字符
+------------------------+
| substr("123456789",-1) |
+------------------------+
| 9 |
+------------------------+
1 row in set (0.09 sec)
mysql> select right("fdgfdgfdgfhgfd",3);-- 截取倒数三个字符
+---------------------------+
| right("fdgfdgfdgfhgfd",3) |
+---------------------------+
| gfd |
+---------------------------+
1 row in set (0.09 sec)
mysql> select left("fdgfdgfdgfhgfd",3);-- 截取前三个字符
+--------------------------+
| left("fdgfdgfdgfhgfd",3) |
+--------------------------+
| fdg |
+--------------------------+
1 row in set (0.16 sec)
mysql> select concat("a",24,3,5,4,65,76,8,7);-- 字符串拼接
+--------------------------------+
| concat("a",24,3,5,4,65,76,8,7) |
+--------------------------------+
| a24354657687 |
+--------------------------------+
1 row in set (0.09 sec)
mysql> select concat_ws("-","a",24,3,5,4,65,76,8,7);-- 字符串拼接,以及拼接的分隔符为-
+---------------------------------------+
| concat_ws("-","a",24,3,5,4,65,76,8,7) |
+---------------------------------------+
| a-24-3-5-4-65-76-8-7 |
+---------------------------------------+
1 row in set (0.10 sec)
mysql> select replace("abc","b","B");-- 字符替换
+------------------------+
| replace("abc","b","B") |
+------------------------+
| aBc |
+------------------------+
1 row in set (0.10 sec)
mysql> select upper("abc");-- 字母转大写
+--------------+
| upper("abc") |
+--------------+
| ABC |
+--------------+
1 row in set (0.15 sec)
mysql> select lower("ABC");-- 字母转小写
+--------------+
| lower("ABC") |
+--------------+
| abc |
+--------------+
1 row in set (0.15 sec)
3.日期类型
mysql> select now();-- 获取现在时间
+---------------------+
| now() |
+---------------------+
| 2024-03-01 11:01:38 |
+---------------------+
1 row in set (0.17 sec)
mysql> select year(now());-- 获取现在的年份
+-------------+
| year(now()) |
+-------------+
| 2024 |
+-------------+
1 row in set (0.21 sec)
mysql> select month(now());-- 月
mysql> select day(now()); --日
mysql> select hour(now()); --时
mysql> select mimute(now()); --分
mysql> select second(now());-- 秒
mysql> select current_date()或者curdate();-- 获取现在的日期
+----------------+
| current_date() |
+----------------+
| 2024-03-01 |
+----------------+
1 row in set (0.08 sec)
mysql> select current_time();或者curtime();-- 获取现在是几点几分
+----------------+
| current_time() |
+----------------+
| 11:05:14 |
+----------------+
1 row in set (0.10 sec)
--获取到指定日期当前月份最后一天
mysql> select last_day(now());
+-----------------+
| last_day(now()) |
+-----------------+
| 2024-03-31 |
+-----------------+
1 row in set (0.15 sec)
mysql> select last_day("2023-2-1");
+----------------------+
| last_day("2023-2-1") |
+----------------------+
| 2023-02-28 |
+----------------------+
1 row in set (0.10 sec)
计算日期之间相差的年/月/日
select timestampdiff(year,过去的日期,now()) from ts --获取指定时间的间隔
四、运算符运算
1.算术运算符
- 加法:+
- 减:-
- 乘:*
- 除:/ 会有小数
- 整除://或DIV
- 取余:% 或 MOD(m,n)
一般字符串(报错)和日期(不报错,结果不是想要的)不能做算术远算符的运算,但是如果两个字符串第一个是数字可以做加减法运算,否则都为0;例如“1fjdijf”+"2fso"结果是3;日期可以做加减法但是结果不是想要的结果。
2.符号运算符
- +数字:表示正数
- -数字:表示负数
3.关系运算符
>,<,>=,<=,=,!=,<>计算结果会用0和1表示,0表示正确,0表示错误
使用关系运算符不能进行null值的查询,null值特殊,需要使用特殊的关键词进行查询。字符串可以进行大小比较,但一般不用;日期可以进行大小比较。
4.逻辑运算符
- and :同时满足条件
- or :可以满足任意一个条件
- not :取反
5.关键词运算符
- is null :进行null数据值的查询
- is not null :进行不是null数据值的查询
- between 小值 and 大值 :表示一个从小到大的范围 (between 15 and35:表示包括15和35之间的数)
- not between 小值 and 大值 :表示不在一个从小到大的范围
- in :例如in (值1,值2,.......),表示在我们构造的范围内
- not in :表示不在我们构造的范围内
- like (not like):模糊查询,一般和通配符搭配使用
通配符 | % | _ | __ | like |
释义 | 任何字符可以出现任何次 | 只能匹配单个字符 ,但不能没有字符 | 匹配字符数量不限 | 相当于= |
8.as :为表或者字段名起别名
9.distinct :去重,格式:distinct 去重的列
小结:运算符,关键词,方法运算都是基于行运算的
五、聚合函数
- sum(列名):求特定列的和
- max(列名):求特定列最大值
- min(列名):求特定列最小值
- avg(列名):求列平均值,不对null值进行计算
- coun(列名):求特定列的数据个数,会对null值进行统计
六、mysql数据库编码集问题
(1)mysql在安装时,默认的编码集是Latin1,不能存储中文;
(2)可以存储中文的编码集
- utf-8:一个中文字符3个字节(utf8不能存储表情包,utfmb4可以)
- gbk:一个中文2个字节
- Unicode:一个中文4个字节
注意:在创建数据库时,必须指定具体的编码集;表在创建时,不指定编码集,表的编码集默认和数据库一致;数据库的编码及改变后,已经创建的数据库中的表编码集不会随着改变。