> 文章列表 > SQL 学习 day1

SQL 学习 day1

SQL 学习 day1

day1 SQL 学习

1. 数据库概述

database: .数据持久化 - 将数据保存到能够⻓久保存数据的存储介质中,在掉电的情况下数据也不会丢失

excel 在数据体量方面有限,且解决问题的方法较为麻烦

数据库优点:不关注底层的存储细节、高效的数据访问、数据的完整性、数据管理(安全性、权限)、并发的数据访问、支持灾难恢复、减少应用程序开发的时间。

关系型数据库是数据库的核心类型

关系数据库特点。

  • 理论基础:关系代数(关系运算、集合论、⼀阶谓词逻辑)。

  • 具体表象:⽤⼆维表(有⾏和列)组织数据。

    表:(这里的表是没有顺序的,且在其历史背景中为了让其远离当时的地址和指针的概念,而选择了一个抽象的名字:关系模型 而不是表模型。


    数据(行列交汇处)

    行:记录 record 每一行就是一条记录 , row / record -元组 tuple

    ​ 行的数量 :势 cardinality

    列: column 字段 field 又叫 attribute 属性

    ​ 列的数量:度 degree

    关系键

    • 主键 (primary key) 可以唯一确定一条记录的数据所在列 唯一

    • 外键 (foreign key) 不是这张表的主键,但是别的表的主键 外来的主键

      ​ 可以有多个

    表 叫实体: 整张表就是一个实体 entiy

    ​ 又叫关系 relation


  • 编程语⾔:结构化查询语⾔(SQL)。只用于关系型数据库

  • 邻域特点语言

  • 声明式编程语言,不关注过程,只关注结果

    • DDL:数据定义语⾔ create/ drop(删除 需慎用) / alter /rename / truncate(截断 需慎用)
    • DML:数据操作语⾔ insert / delete / update(修改) / select(查询)
    • DCL:数据控制语⾔ grant to(授权) / revoke from(收回权限)
    • TCL:事务控制语⾔ start transaction(开启事务) / commit(提交) / rollback(撤回)

连接MySQL服务:

Window:

运行 MySQL 8.0 Command Line Client - Unicode 文件,输入密码

Maco: 打开终端输入:

export PATH=$PATH:/usr/local/mysql/bin

mysql -u root -p


数据库在命令提示符中更改超级用户权限密码:

alter user ‘root’@‘localhost’ identified by ‘更改后密码’;

查看数据库:show databases; (此处显示的数据库不能动,需要数据直接创建)

以上命令中分号都是英文输入法下的。

工具:GUI Client(须花钱)

2. MySQL命令

Day01总结1. 关系型数据库的特点~ 理论基础:关系代数(集合论、一阶逻辑、关系运算)~ 具体表象:用二维表装数据- 表 - table / entity - relation- 列 - column / field - attribute- 行 - row / record - tuple- 列的数量 - degree- 行的数量 - cardinality- 主键 - primary key- 外键 - foreign key~ 编程语言:结构化查询语言(SQL)2. SQL~ DDL(数据定义语言)- create / drop / altercreate database / drop databasecreate table / drop table / alter table- add column / drop column- modify column / change column- add constraint / drop constraint~ primary key~ foreign key~ check~ unique- rename to~ DML(数据操作语言)- insert / delete / update / select~ DCL(数据控制语言)- grant to / revoke from3. MySQL命令~ show databases;~ show tables;~ show engine;~ show character set;~ help 'xxx';~ use xxx;~ desc xxx;4. MySQL数据类型help 'data types';help 'decimal';~ 整数:- int / integer / int unsigned- bigint / bigint unsigned~ 小数:- decimal~ 字符串:- char- varchar~ 布尔:- boolean~ 日期时间:- date / time- datetime~ JSON- JSON数组- JSON对象5. 表关系~ 一对一~ 多对一 / 一对多~ 多对多

3. DDL

创建一个叫做hrs的数据库:

create database hrs default charset utf8mb4;;

删除慎用!!!drop

 create table tb_dept  创建表,表名为tb_dept,表名都以tb_开头-> (-> dno integer,              (列名 数据类型,列名2 数据类型)-> dname varchar(100),-> dloc varchar(50),-> primary key (dno)-> );drop table if exists tb_dept;  如果存在就删除show create table tb_dept; 查看表alter table tb_dept rename to aaa;
2)创建、修改、删除 表
-- 存在名为hrs的数据库就删除它
drop database if exists hrs;-- 创建名为hrs数据库并指定默认的字符集
create database hrs default charset utf8mb4;-- 切换到hrs数据库上下文环境
use hrs;-- 创建部门表
create table tb_dept
(
dno integer not null comment '部门编号',
dname varchar(20) not null comment '部门名称',
dloc varchar(10) not null comment '部门所在地',
primary key (dno)
) engine innodb comment '部门表';-- 描述表tb_dept
-- desc tb_dept;-- 创建员工表
drop table if exists tb_staff;create table tb_staff
(
snum integer not null comment '工号',
sname varchar(20) not null comment '姓名',
sgender char(1) default '男' not null comment '性别',
job varchar(8) not null comment '职位',
birth date not null comment '出生日期',
primary key (snum)
) comment '员工表';-- desc tb_staff-- 修改表 添加一个salary列
alter table tb_staff add column salary decimal(10,2) not null;-- 修改表 删除名为job列
alter table tb_staff drop column job;-- 修改表 只修改sgender列的数据类型 用modify
alter table tb_staff modify column sgender boolean default 1 not null;-- 修改表  同时修改列名和数据类型 用change  只改名字也要写上数据类型
alter table tb_staff change column sgender sex char(1) default '男' not null;-- 修改表 添加一个约束,限制性别sex列数据只能选男或女  add constraint
alter table tb_staff add constraint ck_staff_sex check (sex in ('男','女'));-- 修改表 添加一个检查约束限制birth字段要大于等于1969-1-1
alter table tb_staff add constraint ck_staff_birth check (birth >= '1969-1-1');-- 修改表 删除约束条件
alter table tb_staff drop constraint ck_staff_birth;-- 修改表
alter table tb_dept rename to departments;
alter table tb_staff rename to employee;-- desc tb_staff;

/c

comment ‘部门所在地’ 注释 是MySQL的方言

engine innodb 指定引擎为innodb

3) 建立两张表的关系
--  1. 多对一 ;则在多的那一边增加外键列和外键约束----------------------
-- (1). 需要先建立两张表共同的列(在其中一张表中该列为主键)
alter table employee add column dno integer not null;-- (2). 添加外键约束,建立共同列的一致关系
-- 修改员工表添加一个外键约束限制员工表的dno必须参照部门表的dno
alter table employee add constraint fk_employee_dno
foreign key (dno) references departments (dno);-- 2.  一对一 除了添加外键列和外键约束外,还要添加唯一约束-----------------
-- unique (外键列名)   这个约束取名为 uk_表名_列名--  3. 多对多  添加一个中间表,将两个表的多对多拆成分别两个表对中间表的多对1 -------------------------------------create table tb_user
(
user_id integer not null comment '用户ID',
user_name varchar(50) not null comment '用户名',
user_birth date not null comment '出生日期',
user_level integer not null comment '用户等级',
primary key (user_id)
);create table tb_bike
(
bike_id integer not null comment '自行车ID',
bike_status integer not null comment '状态',
online_date date not null comment '上线日期',
primary key (bike_id)
);-- 创建中间表  用户使用共享单车记录表
create table tb_record
(
record_id bigint not null auto_increment,
user_id integer not null comment '谁用的车',
bike_id integer not null comment '用的那一辆车',
start_time datetime,
end_time datetime,
pay_way integer,
payment decimal(10,2),
primary key (record_id),
constraint fk_record_user_id foreign key (user_id) references tb_user (user_id),
constraint fk_record_bike_id foreign key (bike_id) references tb_bike (bike_id),
constraint ck_record_start_end check (end_time > start_time)
);
-- auto_increment 自动编号,为MySQL方言
-- 由于没有找到适合当主键的所有有创建一个流水号当主键:record_id
desc tb_record
4)数据类型
-- 1. 整数------------------------------
-- int / integer   - 4字节  31次方
-- tinyint   - 1字节  : -128  ~ 127
-- smallint   - 2字节   : -32768  ~ 32767
-- mediumint  - 3字节
-- bigint   - 8字节  -2的63次方 ~ -- 无符号整数,没有符号位,只有0和正数
-- int unsigned  -- 0 ~ 2^32 -1
-- int(4) zerofill ---  不够4位,前面补0  此处写的4 ,只是表不足四位用0 不足。也可以写4位以上-- 2. 小数-------------------------------- float
-- double / double precision
-- decimal/numeric  更常用
-- decimal(10,2)  一共最多10位有效数字,小数点后最多写两位
-- 最大65 和30: decimal(65,30), 不写时默认10和0-- 3. 布尔类型---------------------------
-- boolean   是tinyint, 0/1-- 4. 字符类型-----------------------------
-- char / character  最大 255
-- varchar / character varying   最大 16383
--  latin / ascii ---> varchar(65535)
-- utf8 ---> varchar(21845)
-- utf8mb4 ---> varchar(16383)-- char(20)  20是字符数,不是字节数  
-- varchar(20)  20是字符数,不是字节数   且输入完毕后多保存一个字节 /0,不显示--  char(1) : 一个字符
-- varchar(1): 两个字符,因为还有一个/0-- 5. 字节串(字节数,二进制)--------------
-- binary
-- varbinary / binary varying -- 6. 日期时间------------------------------
-- date
-- time
-- datetime
-- timestamp  时间戳(不轻易使用)-- 7. 其他---------------------------------
-- longblob --> blob : 很大的二进制
-- longtext --> clob :很大的字符对象
-- json
-- enum / set  是 MySQL 的方言,不推荐使用