02 . Mysql基础操作及增删改查
Posted 周常见(you-men)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了02 . Mysql基础操作及增删改查相关的知识,希望对你有一定的参考价值。
mysql基础操作及增删改查
一、SQL语句的注意事项
- 每条SQL语句结束时要以;做为结束符,也可以使用G以文本模式输出.(除了use命令)
- SQL语句的关键字不区分大小写(除了库名字和表名字)
- 当你需要补全大部分库和表名使用#
- 当你不需要一条语句输出的结果以c结束
- 当你想要退出数据库时,可以使用q或者是exit,ctrl+d
- 我们可以在命令行执行sql语句,要通过mysql -e参数
mysql -e "show databases G" 显示到shell上
- 如果需要获取SQL语句的帮助可以用help命令
如:help create
如果需要进一步获取帮助,可以继续使用help命令
如:help create database
二、系统数据库
系统数据库
information_schema: 虚拟库,存放在内存中,主要存储了系统中的一些数据库对象信息,如用户表信息,列信息,权限信息,字符信息等.
performance_schema: 主要存储数据库服务器的性能参数
mysql: 授权库,主要存储系统用户的权限信息
test: 公共库,任何人都能访问,Mysql数据库自动创建的测试数据库
sys: 系统的元数据信息,方便DBA发现数据库的很多信息,为解决性能瓶颈体用了巨大帮助
三、数据库相关操作
3.1 语法
create database 数据库名 character set = ‘utf8‘ collate=utf8_general_ci;
数据库命名规则:
1>可以由字母,数字,下划线,@,#,$
2>区分大小写
3>唯一性
4>不能使用关键字如create select
5>不能单独使用数字
6>最长128位
3.2 关于字符集
# 数据表里存放什么样的数据就选取相应的字符集: 简体中文的字符集是gb2312和gbk: utf8是国际通用字符集
show character set; # 查看Mysql支持的字符集
show collation; # 查看字符集的排序规则,utfs-generic支持大多数的排序规则
create database db character set = ‘utf8mb4‘ collate=utf8_general_ci;
# 创建数据库设置字符编码和字符集的排序规则
show create database dbG; # 查看db数据库字符编码
alter database db character set = latin1 # 修改数据库的字符编码
use 库名; # 切换数据库
show databases; # 查看所有的库
drop database # 删除数据库
四、 Mysql数据类型
Mysql常见的数据类型
在Mysql数据库管理系统中,可以通过存储引擎来决定表的类型,同时,Mysql数据库管理系统也提供了数据类型决定表存储数据的类型,数值类型越大对于内存的消耗越多,合适的数据类型在一定程度上能增加数据库的效率.
Mysql数据库管理系统提供的数据类型
- 整数类型: TINYINT SMALLINT MEDIUMINT INT BIGINT
- 浮点数类型: FLOAT 单精度浮点数值(7个有效位) DOUBLE双精度(15个)
- 字符串类型: CHAR VARCHAR
- 时间和日期类型: DATE TIME DATETIME TIMESTAMP YEAR
- 枚举类型: ENUM
- 集合类型: SET
数据类型的常用场景
- 整数类型:用于存储用户的年龄、游戏的Level、经验值等。
分为有符号(默认)和无符号 - 浮点数类型:作用:用于存储用户的身高、体重、薪水等
浮点数类型可以使用名称后加(M,D)的方式表示,表示一共显示M位数字(整数位+小数位),其中D表示小数点后面的位数,M和D又称为精度和标度。 - 时间和日期类型:用于存储用户的注册时间,在线时长,文章的发布时间,员工的入职时间等
- date类型:使用连字号为分隔符分隔开 (显示年月日)
- time类型:应该使用冒号作为分隔符且需要加上单引号,或者是直接使用具体的数字(显示时分秒)
- year类型:关于年的时间有个分界线是1970年,把在0069范围内的值转换为20002069范围内,而把7099范围内的值转换到19701999之内,为了避免发生这种现象最好就是写全了.
- datetime和timestamp类型:都用于存储包含当前日期和时间的时间戳
- 如果字段没有值或者是空值时timestamp会使用当前的系统时间作为他的时间戳,而datetime只显示出NULL。
- 当已有字段更新时,datetime类型所对应的时间不会发生变化,timestamp类型所对应的时间会更新为最新时间。
- 字符串类型:用于存储用户的姓名、爱好、发布的文章等
- char:定长字符串,需要大小修饰符来指定要存储值的长度,修饰符的范围是0-255
- varchar:变长字符串,需要大小修饰符来指定要存储值的长度,修饰符的范围是0-65535
- ENUM类型即枚举类型、集合类型SET
- 枚举类型:一般用于性别,是女或是男两者选一个,不包含的不能选
- set类型:可以多选,比如爱好中可以有一个或者多个,但不能超出范围,一个set最多包含64项。
五、Mysql增删改查
5.1 创建表
语法:
create table 表名(
字段名1 类型[(宽度)约束条件]
字段名2 类型[(宽度)约束条件]
...
)[存储引擎 字符集];
# 说明: 在同一张表中,字段名和类型是必须有的,且字段名是不能相同;
# 中括号里面的宽度和约束条件可选,整数类型不需要指定宽度,其他的浮点型和定点型等需要指定宽度,也就是约束条件。
表school.student1
字段 字段 字段 字段
id name sex age
1 tom male 23 记录
2 jack male 21 记录
3 alice female 19 记录
# 创建库
mysql> create database school;
# 创建表
create table school.student1
(id int,name varchar(50),sex enum(‘male‘,‘female‘),age int);
Example
create table student(stu_id INT NOT NULL AUTO_INCREMENT, name CHAR(32) NOT NULL, age INT NOT NULL, register_date DATE, PRIMARY KEY(stu_id) );
5.2 插入表数据
# 注意: 先看表的结构再去插值,插值的时候数字不需要用引号,字符串必须要用双引号或者是单引号引起来;
# 语法: insert into 表名(字段1,字段2...) values(字段值列表...)
# 顺序插入多个记录,不用指定字段名,此处指的顺序并非是id数字,而是插入的值和前面的字段是对应的;
mysql> insert into student1 values
(1,‘tom‘,‘male‘,23),
(2,‘jack‘,‘male‘,21),
(3,‘alice‘,‘female‘,19);
# 修改表
# 修改表名
mysql> alter table student1 rename student2;
1.插入完整数据(顺序插入)
语法一: insert into 表名(字段1,字段2,字段3..字段n) values(值1,值2,值3);
语法二: insert into 表名 values (值1,值2,值3..值n);
2.指定字段插入数据
语法一: insert into 表名(字段1,字段2) values (值1,值2);
3.插入多条记录使用逗号隔开
语法一: insert into 表名 values(值1,值2,值3),(值1,值2,值3..值n),(值1,值2,值3 );
4.插入查询结果
语法一: insert into 表1(字段1,字段2,字段3...字段n)
select (字段1,字段2,字段3) FROM 表2 WHERE ...;
Example
insert into student(name,age,register_date)values("youmen",21,"2020-02-12");
5.3 查看表
mysql> show table;
# 查看库中已有的表
# 查看表结构
mysql> desc student1;
mysql> show create table student1;
# 查询表中指定字段的值
mysql> select id,name,sex from student1G;
mysql> select * from student1;
# 查询表中所有字段的值,因为还没有插入字段,所以查询到数据都是空的
# 聚合查询
# 查询一个表中有多少条记录,可以使用SQL内置的count()函数查询~~~~
select count(*) from students;
5.4 更新数据update
# 语法: update 表名 SET 字段1=值1,字段2=值2... WHERE CONDITION;
# 表的修饰符
# not null 标识该字段不能为空
# default 为该字段设置默认值
mysql> update student2 set name=‘flying‘ where id=2; # 匹配id=2的哪一行,并将name字段换成flying;
mysql> update student2 set name=‘flying‘ where d=3 and sex=‘female‘; # 此处and也可以是or
# 添加字段
mysql> alter table student2 add id int(3) not null default 22, add gender enum(‘M‘,‘WW‘);
5.5 删除表
mysql> drop table 表名,表名;
mysql> drop table IF EXISTS student2; # 这个表存在就删除,不存在也不会报错,可以删除脚本使用
# 删除字段/表
delete FROM 表名 [where condtion];
mysql> alter table student2 drop id;
mysql> delete from student2;
mysql> delete from mysql.user where authentication_string=‘‘; # 出于安全考虑将表中没有密码的删掉
mysql> delete from student2 where id=2 and name=‘flying‘; # 匹配到id=2并且name=flying的删掉此类数据
六. 单表查询
6.1 简单查询:
1、单列查询去重:select distinct 字段名 from 表名; (distinct为去重)
2、查询同时运算:select 字段名(数据类型为数字)*14 from 表名;
3、 改变表头输出:select 字段名(数据类型为数字)*14 as(可以省略) 新表头 from 表名;
eg:
mysql> select name from student;
+-------+
| name |
+-------+
| zhou |
| alice |
+-------+
mysql> select CONCAT("name:",name)as message from student;
+------------+
| message |
+------------+
| name:zhou |
| name:alice |
+------------+
6.2 条件查询:
以下为操作符列表,可用于WHERE子句中。
下表中实例假定A为10,B为20
操作符 | 描述 | 实例 |
---|---|---|
= | 等号,检测两个值是否相等,如果相等返回true | (A = B) 返回false。 |
<>, != | 不等于,检测两个值是否相等,如果不相等返回true | (A != B) 返回 true。 |
> | 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true | (A > B) 返回false。 |
< | 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true | (A < B) 返回 true。 |
>= | 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true | (A >= B) 返回false。 |
<= | 小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true | (A <= B) 返回 true。 |
1、单条件查询:where
select 字段 from 表名 where 条件判断;
select 字段 from 表名 where 条件判断 and 条件判断;
select 字段 from 表名 where 条件判断(between A and B); --> 范围
eg: select name from haha where id between 0 and 2;
+------+
| name |
+------+
| ljt |
+------+
1 row in set (0.00 sec)
SELECT name, salary FROM employee5 WHERE salary NOT IN (4000,5000,6000,9000) ;
SELECT name,job_description from employee5 where job_description is null;(字段为空)
SELECT * FROM employee5 WHERE name LIKE ‘al%‘; %代表多个字符
SELECT * FROM employee5 WHERE name LIKE ‘al___‘; --> "_"下划线代表一个字符
正则:‘ = ‘ 精确匹配;‘like‘ 模糊查询; ‘ regexp ‘正则查询
select * from student where register_date > ‘2020-02-13‘;
# 使用主键来作为WHERE子句的条件查询是非常快速的.
2、排序:order by 字段(一般此字段都是数字,排个成绩啥的)
单列:默认升序,在末尾加DESC则变为降序;
eg:
mysql> select id from haha order by id ;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
+----+
4 rows in set (0.00 sec)
mysql> select id from haha order by id DESC;
+----+
| id |
+----+
| 4 |
| 3 |
| 2 |
| 1 |
+----+
4 rows in set (0.00 sec)
多列:先按第一条件,在第一条件框架中再按第二条件
eg: mysql> select id from haha order by money,id;
6.3 限制型查询:limit num1,num2 num1为从哪里开始,num2为包括第num1的接下来num2个
先用order排序,再使用limit 3,5;
eg: SELECT * FROM employee5 ORDER BY salary DESC LIMIT 3,5;
6.4 利用函数:count() 计数 max()最大 avg()平均 sum()和
6.5 分组查询:group by [分组其实就是把"某字段值"相同的"行"分为一组]
SELECT 字段1 FROM employee5 GROUP BY 字段2;---按字段2分组,字段2中值相同的记录被分为一组。
group_concat函数可以将分完组之后的,某一组的某个字段以列表方式打印出来。
eg: SELECT dep_id,group_concat(name) FROM employee5 GROUP BY dep_id;
过程解析:1、分组:先以dep_id字段为分组标准进行分组,dep_id字段相同的行被分为一组,
2、打印:使用group_concat函数调用name字段,将每个组中所有行的"name"字段做成一个列表,将此列表看作为一个值,进行打印;
多表查询
交叉连:笛卡尔积
eg:select a,b from info,departtment;
只有当info表,departtment表都包含
内外连接区别:内连接只能显示出两表中符合条件的字段
外连接可以显示主表的全部字段,未能匹配到副表的显示null
内连接:SELECT 字段列表 FROM 表1 ,表2 WHERE 表1.字段 = 表2.字段;
eg:select info.name,info.age,info.dep_num,department.dep_num from info,department where info.dep__num = department.dep_num;
外连接:
左连接:select info.name,info.age,info.dep_num,department.dep_name from info left join department on info.dep_num = department.dep_num;
~~~~~~ ~~~~
, where
右连接:
以上是关于02 . Mysql基础操作及增删改查的主要内容,如果未能解决你的问题,请参考以下文章