02 . Mysql基础操作及增删改查

Posted 周常见(you-men)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了02 . Mysql基础操作及增删改查相关的知识,希望对你有一定的参考价值。

mysql基础操作及增删改查

一、SQL语句的注意事项

  1. 每条SQL语句结束时要以;做为结束符,也可以使用G以文本模式输出.(除了use命令)
  2. SQL语句的关键字不区分大小写(除了库名字和表名字)
  3. 当你需要补全大部分库和表名使用#
  4. 当你不需要一条语句输出的结果以c结束
  5. 当你想要退出数据库时,可以使用q或者是exit,ctrl+d
  6. 我们可以在命令行执行sql语句,要通过mysql -e参数

mysql -e "show databases G" 显示到shell上

  1. 如果需要获取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数据库管理系统提供的数据类型

  1. 整数类型: TINYINT SMALLINT MEDIUMINT INT BIGINT
  2. 浮点数类型: FLOAT 单精度浮点数值(7个有效位) DOUBLE双精度(15个)
  3. 字符串类型: CHAR VARCHAR
  4. 时间和日期类型: DATE TIME DATETIME TIMESTAMP YEAR
  5. 枚举类型: ENUM
  6. 集合类型: SET

数据类型的常用场景

  1. 整数类型:用于存储用户的年龄、游戏的Level、经验值等。
    分为有符号(默认)和无符号
  2. 浮点数类型:作用:用于存储用户的身高、体重、薪水等
    浮点数类型可以使用名称后加(M,D)的方式表示,表示一共显示M位数字(整数位+小数位),其中D表示小数点后面的位数,M和D又称为精度和标度。
  3. 时间和日期类型:用于存储用户的注册时间,在线时长,文章的发布时间,员工的入职时间等
  4. date类型:使用连字号为分隔符分隔开 (显示年月日)
  5. time类型:应该使用冒号作为分隔符且需要加上单引号,或者是直接使用具体的数字(显示时分秒)
  6. year类型:关于年的时间有个分界线是1970年,把在0069范围内的值转换为20002069范围内,而把7099范围内的值转换到19701999之内,为了避免发生这种现象最好就是写全了.
  7. datetime和timestamp类型:都用于存储包含当前日期和时间的时间戳
  • 如果字段没有值或者是空值时timestamp会使用当前的系统时间作为他的时间戳,而datetime只显示出NULL。
  • 当已有字段更新时,datetime类型所对应的时间不会发生变化,timestamp类型所对应的时间会更新为最新时间。
  1. 字符串类型:用于存储用户的姓名、爱好、发布的文章等
  2. char:定长字符串,需要大小修饰符来指定要存储值的长度,修饰符的范围是0-255
  3. varchar:变长字符串,需要大小修饰符来指定要存储值的长度,修饰符的范围是0-65535
  4. ENUM类型即枚举类型、集合类型SET
  5. 枚举类型:一般用于性别,是女或是男两者选一个,不包含的不能选
  6. 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基础操作及增删改查的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 之基础操作及增删改查等

MySQL 入门教程:初学者一学就会,零基础 MySQL 安装及增删改查入门

mysql系列-安装及增删改查

java DMO及增删改查代码的自动生成

创建数据库及增删改查基本操作

JDBC中 mysql数据库的连接工具类 Java登录 及增删改查 整理