1.客户端
MySQL是一种客户端服务器结构,服务器是主体真正用来存储和管理数据的
MySQL客户端通过SQL语句访问MySQL服务器
①客户端通过网络的方式访问服务器,服务器再通过网络把响应发回到客户端,客户端发的是sql语句,服务器返回的是操作结果.
客户端编写语句敲回车,是在把sql发给服务器,由服务器执行,再把执行结果返回给客户端,在这个过程必须有网络干预
②MySQL客户端和MySQL服务器可以在一台主机上,也可以不在一台主机上
③必须要先保证服务器已经启动了。连接数据库之前必须保证服务器是正确运行的(开始菜单里搜服务找到Mysql查看是否正在运行)连接数据库之前必须保证服务器是正确运行的
输入密码的时候要切换到英文模式,密码输入错误是闪退
2数据库基本操作
MySQL服务器是一个数据库软件,在运行的过程中可以维护多个“逻辑”上的数据库。(一个逻辑上的数据库就是若干个表的集合,)
列如:实现一个学生管理系统,需要创建一个学生数据库;实现一个作业管理系统也需要创建一个作业数据库,(这里的数据库就是上述“逻辑”上的数据库).
Mysql中绝大部分SQL语句都需要带;
SQL:结构化查询语言(Structured Query Language)
2.1show databases; 查看数据库
查看当前数据库有哪些
2.2create database [数据库名]; 创建数据库;
数据库名只能是数字、字母、下划线,不能有其他字符,数据库名之间不能有空格
2.3use [数据库名]; 使用数据库
在有多个数据库情况下,通过“使用”操作,选中某个数据库,接下来的命令都是针对选中的数据库
cmd中的粘贴复制:选中内容,enter复制,鼠标右键粘贴
2.4drop databse [数据库名]; 删除数据库
非必要不要使用该操作,删除之后一般找不回
–空格[注释内容]
3表基本操作
3.1 create table 表名; 创建表
①[]括号里面写表的列名以及每一列的数据类型,每一列都重新起一行;
字段(列名)写在前,数据类型写在后
②创建表的时候,表名或者列名不能和SQL中的关键字重复,否则就会报错,
解决问题的方法:把名字冲突的部分用反引号 ·引起来(反引号esc的下方1的左边)
③常见类型
int 整数
double 小数
decimal 更精确的小数,decimal(3, 1):小数1位,小数位和整数位总共3位
varchar 字符串
text 更长的字符串
mysql> create table student(
-> id int,
-> name varchar(20),
-> score decimal(3,1),
-> email varchar(50)
-> );
Query OK, 0 rows affected (0.07 sec)
mysql> -- 创建表student含字段id,name,score,email
3.2show tables; 查看表
查看当前数据库里有那些表
3.3 desc [表名]; 查看表结构
mysql> desc student;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| score | decimal(3,1) | YES | | NULL | |
| email | varchar(50) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
4 rows in set (0.05 sec)
方法二:show columns from[表名];
describe(desc)[表名];是show columns from[表名]; 的快捷方式
3.4插入数据
(a) insert into [表名] values (对应的字段内容); 全列插入
①对应的字段内容要注意:插入的字段数目和类型需要和表结构中要求的一致。
(列如下面1就是student表中第一列id中的int型,98.5就是第三列score中要求的类型数据decimal(3,1))
②插入的数据要用引号引起来,单引号双引号都可以
mysql> insert into student values (1,'test','98.5','test.qq.com');
Query OK, 1 row affected (0.05 sec)
(b) insert into [表名] (指定列[中间用,隔开]) values (插入的内容[中间用,隔开]); 指定列插入
①插入的数目和类型都要对应,指定的列要在表头中存在
②没有插入的列会自动被填充成NULL
<mysql> insert into student values (1,'test','98.5','test.qq.com');
© insert into [表名] (指定列)values (插入的指定列对应内容),(插入指定列对应内容); 同时插入多组数据用,把多组values数据值隔开
<mysql> insert into student(id,name) values (3,'tang'),(4,'li');
(d)插入检索出的数据
<mysql> insert into customers(
cust_id,
cust_contact,
cust_email,
cust_name,
cust_address)
select cust_id,
cust_contact,
cust_email,
cust_name,
cust_address
from custnew;
--使用insert select 从custnew 将所有数据导入到customers中
①该插入对列名没有要求,可以使用相同的列名也可以使用不同的
②select 中(custnew)第一列会插入到insert (customers)第一列中,第二列插入到第二列中,和位置有关系
③插入数据不是从0开始,先清空表
truncate table [表名];
3.5 drop table [表名]; 删除表
尽量不要使用
3.6 查看数据
(1)select * from [表名]; 查看数据(查找所有列)
查看当前表中的所有数据
①*是一个通配符,意思是把所有的列都查找出来
此查找方式仅限于在测试环境中使用,千万不能在生产环境的服务器上执行这样的sql语句;因为生产环境的服务器压力本来就很大,同时生产环境的服务器(数据库)数量非常多,一旦执行此语句,可能会给生产环境的服务器造成很大的负担,生产环境的服务器如果挂了,会给用户造成恶劣影响,从而给公司带来经济损失;操作生产环境一定要谨慎
②办公环境:公司发的笔记本或者台式机
开发环境:服务器(Linux) 64G 16核CPU
生产环境/线上环境,256G 28核 ,(对外,普通用户可以用)生产环境称为线上环境
测试环境:服务器(Linux)
其他三个统称为线下环境
mysql> select * from student;
+------+-------+-------+-------------+
| id | name | score | email |
+------+-------+-------+-------------+
| 1 | test | 98.5 | test.qq.com |
| 2 | zhang | NULL | NULL |
| 3 | tang | NULL | NULL |
| 4 | li | NULL | NULL |
+------+-------+-------+-------------+
4 rows in set (0.00 sec)
(b)select [列名] from [表名]; 指定列查找
mysql> select name from student;
+-------+
| name |
+-------+
| test |
| zhang |
| tang |
| li |
+-------+
©select [列名1],[列名2] from[表名];多列查找
select name,score from student;
3.7运行结果
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0
Query OK, 2 rows affected (0.00 sec)
表示:成功了,并提示你两行内容收到了影响; 0.04指的是执行时间,单位秒
Records: 2 Duplicates: 0 Warnings: 0
[0.06 sec] = 60ms 从计算机视觉来看这个时间是特别特别慢的
3.8针对查到的列进行一定的表达式计算
(1)查找姓名和所有成绩之和
mysql> select name,chinese + math + english from exam_result;--查找姓名和所有的三门课程之和
+-----------+--------------------------+
| name | chinese + math + english |
+-----------+--------------------------+
| 张三 | 200.1 |
| 李四 | 204.0 |
| 王丹丹 | 222.9 |
| 张图 | 228.5 |
| 张九九 | 199.7 |
| 尚是 | 180.5 |
| 滴滴 | 204.8 |
| 张武 | 223.7 |
| 长都 | 230.4 |
| 李武 | NULL |
+-----------+--------------------------+
(2)查询字段指定别名
把语文,数学,英语之和的列叫total
别列指定了别名,其中as可以省略
mysql> select name,chinese + math + english as total from exam_result;
+-----------+-------+
| name | total |
+-----------+-------+
| 张三 | 200.1 |
| 李四 | 204.0 |
| 王丹丹 | 222.9 |
| 张图 | 228.5 |
| 张九九 | 199.7 |
| 尚是 | 180.5 |
| 滴滴 | 204.8 |
| 张武 | 223.7 |
| 长都 | 230.4 |
| 李武 | NULL |
+-----------+-------+
©查找姓名,在语文成绩上加十分mysql> select name,english + 10 from exam_result;
+-----------+--------------+
| name | english + 10 |
+-----------+--------------+
| 张三 | 86.3 |
| 李四 | 66.3 |
| 王丹丹 | 75.8 |
| 张图 | 102.5 |
| 张九九 | 42.8 |
| 尚是 | 87.7 |
| 滴滴 | 66.3 |
| 张武 | 76.6 |
| 长都 | 74.3 |
| 李武 | 108.0 |
+-----------+--------------+
10 rows in set (0.00 sec)
经过表达式计算出现 108.6与原来的列数据类型不一致,这个时候是尽可能保证结果正确,数据类型可以变化
3.9删除一行
可以按照id删也可也按照名字删
即现在需要删掉第一行,使用第一行中id列的数值能删掉,使用name列也能删掉
mysql> delete from exam_result where name = '李武';
Query OK, 1 row affected (0.01 sec)
3.10去重
去重之前的表
(a)删除math一列的重复值
mysql> select distinct math from exam_result;-- 针对数学一列去重
+------+
| math |
+------+
| 77.9 |
| 89.7 |
| 78.5 |
| 60.0 |
| 98.9 |
| 54.9 |
| 88.5 |
| 87.5 |
+------+
8 rows in set (0.04 sec)
(b)去重操作也能指定多列去重,此时就是要求指定的列都完全相同才会合并在一起
mysql> select distinct chinese ,math from exam_result;-- 假设第一行和第三行的语文,数学均相同的才能去重
+---------+------+
| chinese | math |
+---------+------+
| 45.9 | 77.9 |
| 58.0 | 89.7 |
| 78.6 | 78.5 |
| 76.0 | 60.0 |
| 68.0 | 98.9 |
| 47.9 | 54.9 |
| 60.0 | 88.5 |
| 78.6 | 87.5 |
+---------+------+
8 rows in set (0.00 sec)
(语文和数学都一样的那一行才能被去重,)
①去重操作.得到的结果表的行数和原来的可能不一样,
②大部分的select操作的结果无法和原来的表的记录一一对应
select得到的结果也相当于一张表(Mysql构造的一个临时表)
③使用distinct的时候,必须把对应的列都放到distinct之后
④所有的select操作对原来的表都不会造成影响,只是把查找出来的结果里出现的重复值删了,基于原来的表生成结果表
要想修改使用insert,update,delete等操作