创建表+数据增删改查 及其权限功能

174 阅读12分钟

一:环境搭建

​ 启动数据库服务

​ 配置环境变量----客户端

​ 创建用户

​ 赋予权限

​ 创建数据库

​ 创建表

二:数据库表

1:创建表的方法

   mysql> create table if not exists _testmoviestar(
    -> t_name int,
    -> t_address int,
    -> t_gender enum('男','女'),
    -> t_birthdata date
    -> );
Query OK, 0 rows affected (0.20 sec)

2:数据类型

​ 整数

​ 小数

​ 字符串

​ 时间

​ 特殊类型 枚举 集合 json

3:数据的操作

​ 数据的存储,表格中添加数据

insert into 表名(字段列表)values(对应的值)

4:数据库的数据约束

1:非空约束 not null

​ 当字段添加非空约束时,当前字段不允许插入null值

​ 如果插入会报错

字段名 类型(长度) not null

2:默认 default

​ 如果没有给此字段添加数据,默认自动添加默认值

字段名 类型(长度) default 默认值

例如:

mysql> create table _testdef(
-> t_user varchar(10) not null,
-> t_passw varchar(10) default '33333'
-> );
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    20
Current database: movie

Query OK, 0 rows affected (0.20 sec)

mysql> insert into _testdef(t_user) values('张三');
Query OK, 1 row affected (0.03 sec)

mysql> select * from _testdef;
+--------+---------+
| t_user | t_passw |
+--------+---------+
| 张三   | 33333   |
+--------+---------+
1 row in set (0.00 sec)

mysql> insert into _testdef(t_user,t_passw)values('李四','1234');
Query OK, 1 row affected (0.07 sec)

mysql> select * from _testdef;
+--------+---------+
| t_user | t_passw |
+--------+---------+
| 张三   | 33333   |
| 李四   | 1234    |
+--------+---------+
2 rows in set (0.00 sec)

3:检查cherk

​ 检测传入的值是否在给定范围内

​ mysql不支持 使用 enum 和 set 实现

4:唯一unipue

​ 一旦字段被定义成唯一约束,表示当前字段的值不能重复,可以为null

语法:

字段添加:字段名 类型(长度)unique

独立添加:【constraint】约束名 unique(字段名)

​ 因为标注的数据列是唯一的,所以方便与查询,而数据库系统会自动对该字段建立索引 Btree【二叉树】

​ 如果没有给唯一约束起名字,默认是约束创建的索引名字是字段名,可以自己给索引起名字

查看对应表的索引语法:

show index from 表名;

例如:

mysql> create table _testuni(
-> t_id int unique,
-> t_name varchar(10)
-> );
Query OK, 0 rows affected (0.32 sec)

mysql> desc _testuni;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| t_id   | int(11)     | YES  | UNI | NULL    |       |
| t_name | varchar(10) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> insert into _testuni(t_id,t_name)values(12,'傻逼');
Query OK, 1 row affected (0.05 sec)

mysql> insert into _testuni(t_id,t_name)values(12,'傻逼');
ERROR 1062 (23000): Duplicate entry '12' for key 't_id'
mysql> show index from _testuni;
+----------+------------+----------+--------------+-------------+-----------+---
----------+----------+--------+------+------------+---------+---------------+
| Table    | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Ca
rdinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------+--------------+-------------+-----------+---
----------+----------+--------+------+------------+---------+---------------+
| _testuni |          0 | t_id     |            1 | t_id        | A         |
        1 |     NULL | NULL   | YES  | BTREE      |         |               |
+----------+------------+----------+--------------+-------------+-----------+---
----------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

5:主键约束 primary key

​ 相当于unique + not null,但是 primary key 比 unique + not null 高

​ 主键约束的字段,唯一且不为空【因为null值在数据库中表示无穷,无法用于比较】

​ 主键才是替代 unique 来进行准确的数据查询

主键约束分类:

​ 单主键的方式,一个表中只有一列拿出来作为主键,方便唯一查询

联合主键的方式:

​ 一个表中有多个字段一起来表示一条数据唯一,不为空,是unique做不到的

例如:

uname【primary key】uid【primary key】
张三123
张三1234
李四123

创建方式:

字段:字段名 类型(长度) primary key

独立:constraint 约束名 primary key(字段1,字段2)

备注:每一个表只能创建一个主键,只能用一次 primary key

​ 联合主键唯一方式:

​ 主键字段1 - 主键字段2 - 主键字段3……的值是唯一的

​ 联合主键比较耗资源---非必要不用

例如:

mysql> create table _testpri2(
    -> t_user varchar(10),
    -> t_passw varchar(11),
    -> constraint myconcatprikey primary key(t_user,t_passw)
    -> );
Query OK, 0 rows affected (0.27 sec)

mysql> desc _testpri2;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| t_user  | varchar(10) | NO   | PRI | NULL    |       |
| t_passw | varchar(11) | NO   | PRI | NULL    |       |
+---------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> show index from _testpri2;
+-----------+------------+----------+--------------+-------------+-----------+--
-----------+----------+--------+------+------------+---------+---------------+
| Table     | Non_unique | Key_name | Seq_in_index | Column_name | Collation | C
ardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+----------+--------------+-------------+-----------+--
-----------+----------+--------+------+------------+---------+---------------+
| _testpri2 |          0 | PRIMARY  |            1 | t_user      | A         |
         0 |     NULL | NULL   |      | BTREE      |         |               |
| _testpri2 |          0 | PRIMARY  |            2 | t_passw     | A         |
         0 |     NULL | NULL   |      | BTREE      |         |               |
+-----------+------------+----------+--------------+-------------+-----------+--
-----------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

mysql> insert into _testpri2(t_user,t_passw)values('张三','123');
Query OK, 1 row affected (0.03 sec)

mysql> insert into _testpri2(t_user,t_passw)values('张三1','123');
Query OK, 1 row affected (0.09 sec)

mysql> insert into _testpri2(t_user,t_passw)values('张三1','123');
ERROR 1062 (23000): Duplicate entry '张三1-123' for key 'PRIMARY'
mysql> insert into _testpri2(t_user,t_passw)values('张三1','1233');
Query OK, 1 row affected (0.03 sec)

6:外键约束 froeign key

​ 主要用来关联多个表

​ 外键一般关联另一个表的主键

​ 外键与被关联的主键定义一致,依赖于被关联的主键存在

语法:

【constraint 外键的名字】foreign key(字段名) references 关联的表(主键字段)

​ 注意:一旦两个表发生了主外键关联,外键字段中添加的值必须是关联的主键字段中有的才行

例如:学生和成绩的关联

​ 学生表:学号 名字

​ 成绩表:学生学号 成绩 科目

7:自增约束 auto_Increment

​ 当字段名被定义了自增约束,当前字段的数据就会自动增长,一般用表格数据的主键编号

语法:

字段名 类型(长度) auto_Increment

8:删除表的操作

语法:

drop table 【if exists】表1,表2……

9:修改表

1)查看数据库表创建语法

show create table 表名;

2)修改数据库表的名字

alter table 原来的表名 rename to 新的表名;

rename table 原来的表名 to 新的表名;

 mysql> create table student(
-> s_id int
-> );
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    45
Current database: work

Query OK, 0 rows affected (0.31 sec)

mysql> alter table student rename to stu;
Query OK, 0 rows affected (0.10 sec)

mysql> show tables;
+----------------+
| Tables_in_work |
+----------------+
| stu            |
+----------------+
1 row in set (0.00 sec)
3)添加信息

添加字段:

alter table 表名 add column 字段名(长度)【约束】【first | after 字段】

mysql> alter table student add column s_name varchar(10) not null;
Query OK, 0 rows affected (0.52 sec)
Records: 0  Duplicates: 0  Warnings: 0

添加约束和索引等:(独立添加)

alter table 表名 add primary key(字段)

foreign key(字段)

references 表名(字段)

unique(字段)

mysql> alter table student add primary key(s_id);
Query OK, 0 rows affected (0.52 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| s_id   | int(11)     | NO   | PRI | NULL    |       |
| s_name | varchar(10) | NO   |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
4)删除信息

删除约束:

alter table 表名 drop column 字段名 / 约束名

删除主键

alter table 表名 drop primary key;

mysql> alter table student drop column s_id;
Query OK, 0 rows affected (0.65 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    49
Current database: work

+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| s_name | varchar(10) | NO   |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
1 row in set (0.03 sec)

mysql>  alter table student add column s_id varchar(10) not null;

Query OK, 0 rows affected (0.51 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| s_name | varchar(10) | NO   |     | NULL    |       |
| s_id   | varchar(10) | NO   |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> alter table student add primary key(s_id);
Query OK, 0 rows affected (0.37 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| s_name | varchar(10) | NO   |     | NULL    |       |
| s_id   | varchar(10) | NO   | PRI | NULL    |       |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> alter table student drop primary key;
Query OK, 0 rows affected (0.53 sec)
Records: 0  Duplicates: 0  Warnings: 0

删除外键

alter table 表名 drop FOREIGN KEY 外键名字

删除索引

alter table 表名 drop index 索引名

删除字段

alter table 表名 drop column 字段名

5)修改字段信息

alter table 表名 MODIFY【COLUMN】旧的列名 新类型(长度) 【FIRST | AFTER col_name】

alter table 表名 CHANGE【COLUMN】旧的列名 新的列名【类型】【约束】 column_definition 【FIRST | AFTER col_name】

三:数据处理---DML

1:DML语言数据处理

​ 将数据添加到表格,从表格中移除,修改数据,从表格获取数据查看

2:创建数据库,创建表

3:表中添加数据的语法 要插入数据 关键字 insert

语法1:

insert into 表名(字段1,字段2,……)values(值1,值2,……)

备注:字段需要和值一一对应,个数和顺序对应,每插入一条数据就表示在表格中添加一行数据

如果我们是给表中所有字段添加数据,表名后面的字段列表可以省略,默认的字段个数就是表中所有字段,顺序按照添加字段或者创建表的时候字段顺序

insert into 表名 values(值1,值2)

​ 例如

                insert into _stu(s_name,s_sex,s_birtime)

                             values('a12','misliu','男','2023-02-02');

语法2:

insert into 表名(字段1,字段2,……)values(值1,值2,……),(值1,值2,……),(值1,值2,……)

语法3:

insert into 表名(字段1,字段2)select 字段1,字段2,…from 存在的表名

​ 例如:insert into ——stu(s_num,s_name,s_sex,s_birtime)select st_id,st_name,st_se

4:删除数据 delete

delete from 表名【where 条件】

备注:如果不加【where 条件】表示删除所有数据

​ 截断表:

truncate table 表名;

delete 和 truncate的区别

​ delete只是删除的表中的数据。表中的一些特殊设置结构没有改变,比如自增

​ truncate,截断表,不仅仅是删除数据,相当于将表删除,再重新创建一个新的

指令

-- 查看当前用户 SELECT USER();

-- root 专区

-- 创建一个用户 CREATE USER scott@'%' IDENTIFIED BY 'a1234';

-- 查看用户 SELECT USER,HOST FROM mysql.user;

-- 赋予权限 GRANT ALL ON student.* TO scott@'%'; -- sott专区 -- 创建数据库和表 -- 查看表的信息 -- 回顾投影 SELECT 20 DIV 10 AS result; SELECT DISTINCT s_sex FROM _stu; SELECT s_name,s_sex FROM _stu; /*

  1. 投影查询之-函数
  2. MySQL经常做的一些操作编写出来--封装起来--函数
  3. 提供了很多的功能函数分为两类
  4. 单值函数【一个或者零个参数进 一个结果返回】
  5. 数学函数
  6. 字符串函数
  7. 日期函数
  8. 条件函数
  9. 信息函数和加密函数
  10. 其他函数
  11. 多值函数,也叫聚合函数 【0个或者多个参数进 一个结果出】

/ 单值函数--数学 abs(x) */

-- 绝对值和圆周率 SELECT ABS(-125),PI();

-- 数据精度处理 小数转化成整数 -- floor(x) 直接取出x的小数部分保留整数 -- ceil(x)和ceiling(x) 等到的结果是大于等于x的最小整数

-- round(x) 小数位,四舍五入 SELECT FLOOR(12.55),CEIL(12.56),CEILING(12.77),ROUND(12.88); SELECT FLOOR(12.22),CEIL(12.22),CEILING(12.22),ROUND(12.22); -- 将获取随机数 rand() rand(x) 获取一个随机数 -- rand() 获取 包含0- 不包含1 的随机数 SELECT RAND(); SELECT RAND(10);

-- 获取1-9随机整数 SELECT ROUND(RAND()*8+1);

-- 求余数和平方根 SELECT SQRT(9),MOD(12,5);

-- 数据的幂运算 SELECT POW(2,3),POWER(2,4);

-- 小数精度处理 -- round(x,n) x小数保留小数点后n位 可以是负数 四舍五入 -- truncate(x,n) x小数保留小数点后面n位,直接舍弃后面多的小数 SELECT ROUND(1.2345,2),TRUNCATE(12.35,1); -- 三角函数 sin() tan()等 -- 对数 log /* 函数查询--字符串函数 主要用于字符串的处理 */ -- 获取字符串的长度 -- CHAR_LENGTH(x)返回的是字符串x的字符个数 -- length(x) 返回的是字符串x在当前数据编码环境中占得字节数 SELECT CHAR_LENGTH('今天不错'),LENGTH('今天不错');

-- 字符串的拼接 -- concat(字符串1,字符串2.....) 可以将多个字符串拼接成一个长字符 -- CONCAT_WS(连接符,字符串1,字符串2.....)可以将多个字符串同连接符连成一个字符串 SELECT CONCAT('今天','不要再玩了','学点东西'); SELECT CONCAT_WS('-','你好','学点吧');

-- 大小写转化,lower和upper SELECT LOWER('sadaWWWW'),UPPER('awads'); -- 翻转字符串 SELECT REVERSE('今天不错'); -- 截取字符串 -- 截取空格 -- trim(x) 会将x两边前后空格去除 -- LTRIM 会将x左边的空格去除 -- rtrin(x)会将右边的空格去除 SELECT LENGTH(TRIM(' 你好 ')),LENGTH(LTRIM(' 你好 ')); -- TRIM('x'FROM'y') 去除y两边的x字符串 SELECT TRIM('aa'FROM'aadawasdaa');

-- 获取子字符串 获取我们想要的字符串 -- left(x,n) 获取x字符串左边n个字符 -- right(x,n)获取x字符串右边n个字符 SELECT LEFT('assffsaf',3),RIGHT('ssafasfff',4); SELECT LEFT(s_name,1) FROM _stu; -- 填补字符串 -- ipad(x1,len,x2) -- 如果x1的长度小于len会用x2去将x1填充到长度为len, -- 返回的结果就是len长度的字符串 -- 如果x1的长度大于len,会将字符串截取到len长度 SELECT LPAD('abcdefg',12,'2'),RPAD('ABCDEFG',2,'333'); -- 字符串 select -- substring(x,n)和substring(x from n)从x字符串的第n个字符开始截取返回 SELECT SUBSTRING('今天天气不错',2),SUBSTRING('今天天气不错'FROM 2); -- substring(x,n)和substring(x from n for)从x字符串的第n个字符开始截取len返回 SELECT SUBSTRING('今天天气不错',2,4),SUBSTRING('今天天气不错'FROM 2 FOR 2);

-- 重复字符串 SELECT REPEAT('下课',10); -- 练习给定字符' 老师,赶快下课吧,我不想学了,无所谓了!!! '前后空格未知 -- 要求去除字符串 获取老师两个字 -- 获取下课两个字 重复10遍 -- 获取字符串 '想不学' -- 获取'无所谓!!!!!!'

SELECT SUBSTRING(TRIM(' 老师,赶快下课吧,我不想学了,无所谓了!!! ') FROM 1 FOR 2);

SELECT REPEAT(SUBSTRING(TRIM(' 老师,赶快下课吧,我不想学了,无所谓了!!! ') FROM 6 FOR 2),10);

SELECT CONCAT(REVERSE(SUBSTRING(TRIM(' 老师,赶快下课吧,我不想学了,无所谓了!!! ') FROM 11 FOR 2)),

REVERSE(SUBSTRING(TRIM(' 老师,赶快下课吧,我不想学了,无所谓了!!! ') FROM 13 FOR 1)));

SELECT RPAD(SUBSTRING(TRIM(' 老师,赶快下课吧,我不想学了,无所谓了!!! ') FROM 16 FOR 3),10,'!');

/* 函数查询-日期处理函数 可以使用函数获取我们想要的日期信息 */ -- 基础处理 SELECT'2023-07-14'-'2002-5-17'; SELECT'2023-07-14'>'2002-5-17';

-- 获取当前日期的信息 SELECT CURDATE(),CURRENT_DATE(); -- 获取yyyy-MM-dd SELECT NOW(),SYSDATE(),LOCALTIME(),CURRENT_TIMESTAMP(); -- 获取yyyy-MM-dd hh:mm:ss SELECT CURRENT_TIME();-- 获取hh:mm:ss

-- 获取日期的月份 SELECT MONTH(NOW()),MONTHNAME(NOW());

-- 获取年 SELECT YEAR(NOW());

-- 获取天 SELECT DAY(NOW());

-- 获取小时 SELECTHOUR(NOW()),MINUTE(NOW()),SECOND(NOW());

-- 获取星期 -- DAYNAME(NOW()) 日期对应的英文名字 -- DAYOFWEEK(NOW()) 日期对应的引文日历(周日 周一..... 周六)(1,2....5) -- WEEKDAY(NOW()) 日期对应星期索引 (周一..... 周日)(0,1....6) SELECT DAYNAME(NOW()),DAYOFWEEK(NOW()),WEEKDAY(NOW());

-- 获取一些特殊时间 -- 获取一年中的周数 SELECT WEEK(NOW()),WEEKOFYEAR(NOW()); SELECT WEEKOFYEAR('2023-12-30'); 获取第几天 SELECT DAYOFYEAR(NOW()); -- 对应日期是一年中的第几天 SELECT DAYOFMONTH(NOW()); -- 对应日期是一个月中的第几天

-- 获取是第几个季度 SELECT QUARTER(NOW());

-- 日期转化 SELECT TIME_TO_SEC(NOW()); -- 当前小时时间分钟表转化成秒数 ` SELECT SEC_TO_TIME(2101223);``