一、SQL语言分类
SQL(Structured Query Language 即结构化查询语言)
SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。
分类
DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER DDL(data definition language):
DML(data manipulation language)语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE
DQL语句 数据库查询语言: 查询数据SELECT DQL(Data Query Language )数据查询语言 SELECT
DCL(Data Control Language):)语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
二、名词解释
1.数据库服务器
运行着数据库应用程序的设备 DELL R760+CENTOS+Mysql
硬件+系统软件+MYSQL软件
2.数据库
默认数据库
mysql>show databases ;
information_schema: 虚拟库,主要存储了系统中的一些数据库对象的信息,例如用户表信息、列信息、权限信息、字符信息等
performance_schema: 主要存储数据库服务器的性能参数
1.提供进程等待的详细信息,包括锁、互斥变量、文件信息;
2.保存历史的事件汇总信息,为提供MySQL服务器性能做出详细的判断;
3.对于新增和删除监控事件点都非常容易,并可以随意改变mysql服务器的监控周期
mysql: 授权库,主要存储系统用户的权限信息
sys: 主要存储数据库服务器的性能参数
SYS database中,可以获取mem page、io 、latch/mutex/lock等各种性能数据,方便做peformance turning 和 troubleshooting。比如可以方便获取2个sql发生 lock block,用户占用的资源等信息。
表(EXCEL)的管理单元
3. 表 --记录的管理单元
信息的载体,字段的管理单元
张三,男,23,云计算工程师,月薪25K
4.字段(列)
字段名,字段类型(长度),字段约束组成(可选)
姓名,文字,不能为空
张三
5.类型
字符,数字,日期
6.约束
唯一,不能为空,自动增长
7.图示

三、DDL
1.DDL-库
定义库
创建业务数据库
语法
CREATE DATABASE 数据库名;
CREATE DATABASE discuz;
数据库名要求
区分大小写
唯一性
不能使用关键字如 create select
不能单独使用数字和特殊符号“如-"
正常的:用拼音或单词即可。
查看所有数据库
SHOW DATABASES;
选择/进入数据库
USE 数据库名
SELECT database();
调用函数,查询当前库
删除数据库
DROP DATABASE 数据库名;
系统中的位置
/var/lib/mysql/
清理 备份
2.数据类型
数据类型
1.数值类型:
整数类型 INT
TINYINT SMALLINT MEDIUMINT BIGINT
浮点数类型 FLOAT DOUBLE
定点数类型 DEC
位类型 BIT
2.字符串类型:
CHAR系列 CHAR VARCHAR
TEXT系列 TEXT TINYTEXT MEDIUMTEXT LONGTEXT
BLOB 系列 BLOB 特殊符号
BINARY系列 BINARY VARBINARY
枚举类型: ENUM 65536个元素
集合类型: SET 64个元素
3.时间和日期类型:
DATE TIME DATETIME TIMESTAMP YEAR
类型测试
===整数类型测试:tinyint,int
作用:用于存储用户的年龄、游戏的Level、经验值等。
LAB1:(int,tinyint的最大值)
前言 TINYINT有符号型最大127
INT有符号型最大2147483647
1 创建一个表
mysql> create table test1(
tinyint_test tinyint,
int_test int
); 注意TINYINT类型
2 查询表结构
mysql> desc test1;
+--------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------+------+-----+---------+-------+
| tinyint_test | tinyint(4) | YES | | NULL | |
| int_test | int(11) | YES | | NULL | |
+--------------+------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
Field字段名称(列名)
TYPE字段类型(字?数?日?)
NULL KEY DEFAULT EXTRA 略
3 插入数值
1 插入合法数值
mysql> insert into test1 values (111,111);
Query OK, 1 row affected (0.09 sec)
查询表内容 select * from test1
2 插入非法数值
错误的示例:
mysql> insert into test1(tinyint_test) values(128);
ERROR 1264 (22003): Out of range value for column 'tinyint_test' at row 1
正确的示例:
mysql> insert into test1(tinyint_test) values(127);
3 插入合法数值
mysql> insert into test1(int_test) values(2147483647);
Query OK, 1 row affected (0.05 sec)
4 插入非法数值
mysql> insert into test1(int_test) values(2147483648);
ERROR 1264 (22003): Out of range value for column 'int_test' at row 1
INT有符号型最大2147483647
LAB2:(无符号unsigned)
前言 数值无符号,就只能输入正值,不能输入负值
1 创建一个表
mysql> create table test2(
tinyint_test tinyint unsigned,
int_test int unsigned
);
Query OK, 0 rows affected (0.00 sec)
//约束条件unsigned限定只能存正值(无符号)
2 查询表结构
mysql> desc test2;
+--------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------------+------+-----+---------+-------+
| tinyint_test | tinyint(3) unsigned | YES | | NULL | |
| int_test | int(10) unsigned | YES | | NULL | |
+--------------+---------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
3 插入数据
1 插入合法数据
mysql> insert into test2(tinyint_test) values(255);
Query OK, 1 row affected (0.06 sec)
2 插入合法数据
mysql> insert into test2(int_test) values(2147483648);
Query OK, 1 row affected (1.87 sec)
3 插入非法数据
mysql> insert into test2 values(-20,-20);
ERROR 1264 (22003): Out of range value for column 'tinyint_test' at row 1
mysql和mariadb不同。
mysql提示输入错误
mariadb会输入0到表中。
但结果是肯定的,无符号只能输入正值
LAB3:(整数型,长度可变)
前言 插入大于INT宽度限制的值,仍然可以存储。但不能超过上限2147483647
INT整形的宽度仅为显示宽度,不是限制。因此建议整形无须指定宽度。
字符型需要使用宽度
1 创建一个表
mysql> create table t1 (
id1 int,id2 int(6)
);
2 查询表结构
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id1 | int(11) | YES | | NULL | |
| id2 | int(6) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
3 插入数据
mysql> insert into t1 values(22,22222222);
Query OK, 1 row affected (0.01 sec)
4 查询数据
mysql> select * from t1;
插入大于INT宽度限制的值,仍然可以存储。
但不能超过上限2147483647
LAB4:(零填充zerofill)
前言 zerofill 自动填充0
1 创建一个表
zerofill
mysql> create table t2 (
id1 int zerofill,
id2 int(6) zerofill
);
Query OK, 0 rows affected (0.05 sec)
2 查询表结构
mysql> desc t2;
+-------+---------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------------+------+-----+---------+-------+
| id1 | int(10) unsigned zerofill | YES | | NULL | |
| id2 | int(6) unsigned zerofill | YES | | NULL | |
+-------+---------------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
3 插入数据
mysql> insert into t2 values(2,2);
Query OK, 1 row affected (0.01 sec)
4 查询表内容
mysql> select * from t2;
+------------+--------+
| id1 | id2 |
+------------+--------+
| 0000000002 | 000002 |
+------------+--------+
1 row in set (0.00 sec)
===浮点数类型测试:float
作用:用于存储用户的身高、体重、薪水等
浮点数和定点数都可以用类型名称后加(M,D)的方式来表示,
(M,D)表示一共显示M位数字(总数位+小数位),
其中D位于小数点后面,M和D又称为精度和标度。
LAB1:(浮点数float)
浮点数float类型测试
1 创建一个表
mysql> create table test4(float_test float(5,2));//一共5位,小数占2位,整数3位
Query OK, 0 rows affected (0.00 sec)
2 查询表结构
mysql> desc test4;
+------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| float_test | float(5,2) | YES | | NULL | |
+------------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)
float(5,2)
5是整数加小数的总长
, 2是小数长度。
整数意味只有3位长度。
3 插入合法数据,非法数据
mysql> insert into test4 values (10.2), (70.243), (70.246);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
4 查询表内容
mysql> select * from test4;
+------------+
| float_test |
+------------+
| 10.20 |
| 70.24 |
| 70.25 |
+------------+
3 rows in set (0.00 sec)
5 插入非法数据
mysql> insert into test4 values (1111.2);
ERROR 1264 (22003): Out of range value for column 'float_test' at row 1
LAB2:(精准小数decimal)
定点数decimal类型测试:
定点数在MySQL内部以字符串形式存储,比浮点数更精确,
适合用来表示货币等精度高的数据。
decimal在不指定精度时,默认的整数位为10,默认的小数位为0
1 创建一个表
mysql> create table test5(decimal_test decimal(5,2));
2 插入数据
mysql> insert into test5 values (70.245);
Query OK, 1 row affected, 1 warning (0.05 sec)
注意有警告 超长部分不记录。会四舍五入
mysql> select * from test5;
3 请思考如何创建整数9位,小数5位的数据类型
区别
三者的区别介绍
float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位,小数点占一位)
double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效位)
decimal:数字型,128bit,常用于银行帐目计算。(28个有效位)
===时间和日期类型测试:year、date、time、datetime、timestamp
作用:用于存储用户的注册时间,文章的发布时间,文章的更新时间,员工的入职时间等
LAB1:(日期,时间)

LAB2:(当前时间)(了解)

LAB3:(年) 年YEAR类型测试

===字符串类型测试:CHAR、VARCHAR
LAB1:(字符、变长字符)
作用 :用于存储用户的姓名、爱好、发布的文章等
注意 CHAR 列的长度固定为创建表时声明的长度: 0 ~ 255
VARCHAR 列中的值为可变长字符串,长度: 0 ~ 65535
CHAR的长度是固定的
VARCHAR长度是可以变化的
固定与可变是针对存储介质(硬盘)来说的
假如:
CHAR和VARCHAR的默认长度都设为10,两个字段都分别写入 “abc”
CHAR 损耗了硬盘10字节 = “abc”长度 + 7个空字符
VARCHAR损耗了硬盘 3字节 = “abc”长度
设定默认值n(假如是 10 ) 则该字段内能写入的字符串长度最大只能为 10
在检索的时候,CHAR列删除了尾部的空格,而VARCHAR则保留这些空格
1 创建表
create table vc (
v varchar(4),
c char(4));
2 查看表结构
mysql> desc vc;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| v | varchar(4) | YES | | NULL | |
| c | char(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
3 插入数据
mysql> insert into vc values('a','a');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into vc values('ab ','ab ');
Query OK, 1 row affected, 1 warning (0.00 sec)
4 查询表内容
mysql> select * from vc;
+------+------+
| v | c |
+------+------+
| a | a |
| ab | ab |
+------+------+
1 row in set (0.00 sec)
5 调动函数

LAB2:(了解)(二进制字符)
前言
二进制字符串 类型包括:binary、varbinary、blob,主要是处理图像、视频、音频等文件,与字符集无关。
这类文件一般是放在服务器硬盘里,而不是数据库里,如果要放在数据库,就一定不能指定字符集类型,否则会把二进制字段转换成相应的非二进制字符,图像和视频就不能正常显示了。
关于非二进制字符串
非二进制字符串类型:包括:char、varchar、text,主要用于处理文本格式的文件。
字符集就是一堆字符的集合,字符集的编码格式主要有以下几种:
1、utf-8:基于unicode编码(万国码),国际标准化组织制定的一套包含了世界上所有编码类型的字符,如果一个网页上想同时显示简体、繁体以及其他地区的一些字符,就可以使用utf8编码。每个字符的长度是1-3个字节,比如说【a】是一个字节,【盾】是3个字节。
2、gb2312:简体字,包含6700多个汉字,每个汉字相当于2个字节,每个英文单词相当于1个字节。
3、gbk:简体字和繁体字,包含21000多个汉字,由中国内地编写的编码库,每个汉字相当于2个字节,每个英文单词相当于1个字节。
4、big5:繁体字,包含13000多个汉字,也叫大五码,每个汉字相当于2个字节,每个英文单词相当于1个字节。
字符串类型测试:BINARY、VARBINARY
BINARY 和 VARBINARY类似于CHAR 和 VARCHAR,
不同的是它们包含二进制字符,而不包含非二进制字符串
mysql> create table binary_t (c binary(3));
Query OK, 0 rows affected (0.03 sec)
mysql> desc binary_t;
+-------+-----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+-------+
| c | binary(3) | YES | | NULL | |
+-------+-----------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> insert into binary_t set c='aaa';
Query OK, 1 row affected (0.00 sec)
mysql> select *,hex(c) from binary_t;
+------+--------+
| c | hex(c) |
+------+--------+
| aaa | 616161 |
+------+--------+
1 row in set (0.00 sec)
set解释
在标准的SQL语句中,一次插入一条记录的INSERT语句只有一种形式。
INSERT INTO tablename(列名…) VALUES(列值);
而在MySQL中还有另外一种形式。
INSERT INTO tablename SET column_name1 = value1, column_name2 = value2,…;
第一种方法将列名和列值分开了,在使用时,列名必须和列值的数一致。如下面的语句向users表中插入了一条记录:
INSERT INTO users(id, name, age) VALUES(123, '姚明', 25);
第二种方法允许列名和列值成对出现和使用,如下面的语句将产生中样的效果。
INSERT INTO users SET id = 123, name = '姚明', age = 25;
616161解释 a是字符的话,对应ascII码是97,则二进制为01100001,转成16进制为61
===枚举类型、集合类型:ENUM类型,SET测试
LAB1:(单选、多选)
作用 字段的值只能在给定范围中选择
enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female
set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
目标

1 创建表
use school
create table student3(
name varchar(50),
sex enum('m','f'),
hobby set('music','book','game','disc') );
2 查看表结构

3 插入数据
mysql> insert into student3 values ('tom','m','book,game');
Query OK, 1 row affected (0.00 sec)
4 查询数据

5 插入非法数据
mysql> insert into student3 values ('jack','m','film');
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1
3.DDL-表
创表目的
表是数据库存储数据的基本单位,
表由若干个字段(列)组成,
主要用来存储数据记录(行)。
操作数据库实例1
创建1列的表格-序号
创库 create database haha;
使用库 use haha;
创表1 创建 表格 表名t1 (列名id 类型int );
CREATE TABLE t1 (id int);
查看所有表名 show tables;
插入数据 插入 到 表名t1 值 (1);
INSERT INTO t1 VALUES (1);
查询所有数据 查询 所有列 从 表名t1
SELECT * FROM t1;
删除表 drop table t1;
操作数据库实例2
创两列的表格-序号和姓名
创建 表格 表名t2 (第一列名id 数字类型, 第二列名name 字符类型(长度))
create table t2 (id int, name varchar(20));
查看表结构
描述 表t2
desc t2;
总结
mysql> show tables; 查看表名
mysql> select * from t2; 后续讲解。看表中的内容
mysql> desc t2; 查看表结构
插入数据
插入 到 表t2 值 (第一列信息,第二列信息);
INSERT INTO t2 VALUES (1,"zhangsan");
注意
数字不能加引号
字符必须加引号(转义符)
查询所有数据
select * from t2;
操作数据库实例3
1.创建表

2.查看表名

3.表中插入内容

4.查看表内容
mysql> select * from student1; 查询表中所有字段的值
5.查看表结构
