博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL基础部分学习笔记
阅读量:217 次
发布时间:2019-03-01

本文共 7612 字,大约阅读时间需要 25 分钟。

怎么理解数据库

本质:就是个放数据的仓库

数据存放

萌芽阶段

  • 放在内存里——瞬时:程序结束,上次的数据就没啦
  • 放在文件里——持久:进步了!能一直保存了(比如放在.txt文件里),但还是存在问题
    • 不安全
    • 不方便在中间插入、删除数据
    • 但也不是一无是处,可以应用于配置文件:.xml文件、.ini文件等等

数据库的产生

核心:CRUD(最难的是“查找”)

  • 层次模型

    • 优点:层次清晰

    • 缺点:(假如一张“专业”表有你,“学校”表也有你)

      • 查询效率低下(不知道查哪张)
      • 数据不完整(这张表改了那张表没改)
    • 致命:重复就GG了

  • 网状模型

    • 优点:解决复杂问题,数据也完整了,重复的话也只操作一个文件

    • 缺点:重复文件没法解决特殊性问题(假设计算机一班的人和上mysql课的有一部分人都是)

      • 计算机一班的每人收100元
      • 上mysql课的每人收233元
    • 致命:并未解决导航问题

  • 关系型

    • 解决了导航问题:比如每张表都有个学号(公共的编号)
    • 分批管理,各管各的
    • 数据完整,层次清晰
    • 说白了,关系就是共性,为了让每张表都能找到爹
    • 和谁都有关系,但是又互不影响

安装

  • 版本(看企业,贴合业务)

    • 5.7
    • 8.0
  • 下载

    • 点MySQL Community Download

    • 点MySQL Community Server、

    • 选MSI Installer(几百M的那个)

    • 选5.7.29

    • 太慢?在下载内容里复制链接到迅雷就行啦

  • 安装

    • sever only
    • 有excute就点,弹框确认就完了
    • 一路next就完了
  • 添加到环境变量(比如:C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin)

  • 在cmd下进入(u是用户名,p是密码)

# 不推荐直接在-p后输入密码mysql -u root -padmin# 建议这样mysql -u root -p>Enter Password:*****

root用户可以为所欲为!!!

MySQL是个啥

  • 用C++开发(bin中的.exe、include中的.h可以看出来…)

  • 典型C/S架构

    • server服务端:MySQL Sever mysql服务端(在本地,客户端要访问,需要开启服务)
    • client客户端:通过终端cmd去访问/操作数据库
# 关闭服务(大小写不敏感)net stop mysql# 开启服务net start mysql
  • 断开连接

    • quit
    • exit
    • \q
    • 直接关闭CMD
  • windows系统的情况屏幕命令:cls

  • 在MySQL Server 的目录下创建data文件夹

mysqld --initialize-insecure --user=root

库的基本操作

显示所有仓库

# 输入内容show databases;# 输出内容+--------------------+| Database           |+--------------------+| information_schema || how2java           || mybatis            || mysql              || performance_schema || test               |+--------------------+6 rows in set (0.00 sec)
  • information_schema:服务器管理数据库的信息

  • mysql:用户信息(比如root用户)

  • performance_schema:存储服务器性能的东西(5.5之后才有的)

  • test:自带的测试样例

建库

  • 通常做法
create database student;

tips:别用关键字,比如:database

  • 万一库很多,避免存在,可以先检查是否存在,再创建,并指定字符集(推荐这种做法,更规范)
create database if not exists `student` charset=utf8;
  • 查看当时怎么创建的(看到编码)
# 输入内容mysql>show create database student;# 输出内容+----------+--------------------------------------------------------------------+| Database | Create Database                                                    |+----------+--------------------------------------------------------------------+| student  | CREATE DATABASE `student` /*!40100 DEFAULT CHARACTER SET utf8 */ |+----------+--------------------------------------------------------------------+1 row in set (0.00 sec)

删库

  • 通常做法
drop database student;
  • 万一我删的是一个不存在的库(推荐这种做法,更规范)
drop database if exists 'student';

字符集设置

  • 默认latin1
  • win10下学习用gbk,实际开发用utf8
  • 修改字符集
alter database student charset=gbk;

使用数据库

use student;

表的基本操作

  • 本质:将仓库里的东西归类

显示库内的所有表

  • 首先要use,才能show
show tables;

表的创建

  • 简易创建
# 输入内容mysql> use school;# 输出内容Database changed# 输入内容mysql> create table student(    -> id int,    -> name varchar(30),    -> age int    -> );# 输出内容Query OK, 0 rows affected (0.01 sec)# 输入内容mysql> show tables;# 输出内容+------------------+| Tables_in_school |+------------------+| student          |+------------------+1 row in set (0.00 sec)
  • 规范创建
create table if not exists teacher(id int auto_increment primary key comment '主键id',name varchar(30) not null comment '老师的名字',phone varchar(20) comment '电话号码',address varchar(100) default '暂时未知' comment '住址')engine=innodb;

tips:

id name age:字段(field)

auto_increment:自动增长(必须是primary key

primary key:主键,唯一不重复,靠它来区分此表

comment:注释

not null:该字段不为空

default:默认值

engine=innodb:暂不解释

查看表结构

mysql> desc teacher;+---------+--------------+------+-----+----------+----------------+| Field   | Type         | Null | Key | Default  | Extra          |+---------+--------------+------+-----+----------+----------------+| id      | int(11)      | NO   | PRI | NULL     | auto_increment || name    | varchar(30)  | NO   |     | NULL     |                || phone   | varchar(20)  | YES  |     | NULL     |                || address | varchar(100) | YES  |     | 暂时未知 |                |+---------+--------------+------+-----+----------+----------------+4 rows in set (0.00 sec)

删表

  • 标准做法
drop table if exists 'stu';
  • 多张表可以逗号隔开
drop table if exists ooo,jjj,kkk;

修改表

  • 添加字段
alter table student add phone varchar(20);
  • 放在某字段后面
alter table student add gender varchar(2) after name;
  • 放在第一个
alter table student add sex varchar(1) first;
  • 删除字段
alter table student drop phone;
  • 修改字段属性(change可以改名字,也可以改类型;modify只能改类型)
alter table student change phone tel_phone int(11);alter table student modify tel_phone varchar(13);
  • 改名字(表名不能是复数,这边是不规范的)
alter table student rename to students;

数据的基本操作

添加

  • 插入单条数据
insert into teacher (name,phone,address) values('王帅真','18359730121','嘉园路');

顺序没要求,但属性一定要一一对应;

如果不写第一个"()"的内容,就要按顺序了,且id处填null

  • 插入多条数据
insert into teacher values(NULL,'Tom',NULL,default),(NULL,'Jack',NULL,default);

删除

  • 按属性删除
delete from teacher where id=2;delete from teacher where name="Tom";delete from teacher where age>18;
  • 清空表(自增id会从1开始,而delete不会)
truncate table student;

更新

where尽可能的唯一,防止SQL注入

update teacher set name='Jack' where id=1;

查找

  • 查整张表(*表示找出全部,方便但是性能低)
mysql> select * from teacher;+----+--------+-------------+---------+| id | name   | phone       | address |+----+--------+-------------+---------+|  1 | 王帅真 | 18359730121 | 嘉园路  |+----+--------+-------------+---------+1 row in set (0.00 sec)
  • 指定字段
mysql> select name from teacher where id=1;+--------+| name   |+--------+| 王帅真 |+--------+1 row in set (0.00 sec)

SQL语句区分

  • DDL:Data Definition Language
    • 针对【数据库】
    • 数据库定义语言 create alter drop show
  • DML:Data Manipulation Language
    • 针对【数据】
    • 数据库操纵语言 insert update delete select

查看字符集情况

  • 查找所有字符集设置
show variables like 'character_set_%';
  • 设置客户端字符集
set character_set_client=utf8;

数据类型

数值类型

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 byte (-128,127) (0,255) 小整数值
SMALLINT 2 bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值
  • 整型应用
create table user(id smallint unsigned auto_increment primary key comment 'id',age tinyint unsigned not null default 0,kkk int(6));

int()里的代表数据的宽度,即十进制位数

tinyint默认是3(255),smallint默认是5(65535)

  • 浮点数应用(**钱千万不能用浮点型!!!!!**存在精度丢失问题!!!)
create table t_1(num1 float(3,1),num2 double(5,2),)

()里的前一个是总宽度,后一个是小数部分宽度

如果我故意插入(2.99,2.777777777777)

最后会出来的是(3.0,2.78),也就是会被约

  • 定点数(Decimal)应用(钱用这个,不会丢失精度)

一部分空间存整数,一部分空间存小数

字符串类型

类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串(多余的空间会回收,但效率偏低)
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据(比如:存博客文章)
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据

日期和时间类型

业内规定,表内都要有!!!!!!

类型 大小 ( bytes) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

布尔类型

  • boolean
    • true:1
    • false:0

枚举类型

create table t_5(sex enum('man','woman','?','none','it'));

枚举类型有的才能取

第一个类型是1(‘man’)

第二个类型是2(‘woman’)

以此类推

实际存的就是整数数据

优点:

  • 速度快

  • 节省空间,限制数据(2byte)

集合类型

create table t_6(hobby set('哲学','经济学','IT','人文社科'));

插入的话只能插入一个字段

insert into t_6 values('IT,经济学');

哲学——2^0

经济学——2^1

IT——2^2

人文社科——2^3

比如:我插入1,就是'哲学';我插入5,就是'哲学','IT'

总之就是“位操作

转载地址:http://cobv.baihongyu.com/

你可能感兴趣的文章