SQL教程


Structured Query Language : 访问和处理关系数据库的计算机标准语言

1 数据模型

  • 层次模型
  • 网状模型
  • 关系模型

2 操作数据库

  • DDL: Data Definition Language
  • DML: Data Manipulation Language
  • DQL: Data Query Language

3 安装MySQL

  • 作为一个SQL接口包含多种数据引擎
  • 解压目录下新建配置文件
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
  
[mysqld]
# 设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\\download\\mysql-8.0.18
# 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错
# datadir=H:\\MyWork\\mysql-8.0.11\data
# 允许最大连接数
max_connections=100
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
  • 初始化安装并加入环境变量
mysqld --initialize --console
wykdgs,WP0zc
mysqld install
net start mysql
mysql -u root -p
alter user 'root'@'localhost' identified by 'sysqxt1009';
exit;
net stop mysql
mysqld --remove
  • macOS下安装MySql
brew install mysql
mysql.server start
mysql_secure_installation
mysql -u root -p
#使用mysql密码插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
#卸载mysql密码插件
UNINSTALL PLUGIN validate_password;
#重置密码
vim /usr/local/etc/my.cnf
skip-grant-tables#[mysqld]下添加
mysql.server stop
mysql.server start#重开新终端
mysql -u root -p
show databases;
use mysql;
update user set authentication_string='' where user='root';
flush privileges;
show variables like 'validtate_password%';
alter user 'root'@'localhost' identified by 'ipad air4';
flush privileges;
quit;
exit;

4 关系模型

  • 记录(行):Record
  • 字段(列):Coloumn
  • 任意两条记录不能重复
  • 字段尽量避免允许为NULL

4.1 主键

能唯一区分出不同记录的字段,最好是完全与业务无关的字段id

  • 自增整数类型(INT/BIGINT AUTO_INCREMENT)
  • 全局唯一GUID类型

4.2 外键

可以把数据与其他表关联起来的字段,通过定义外键约束实现

  • 外键约束(FOREIGN KEY CONSTRAINT)
ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id)
DROP FOREIGN KEY fk_class_id
DROP COLUMN (class_id)
  • 双鸭山气象站地面资料数据库采用一对一关系,先期建立日期降水、日期气温、日期风速三张表,避免NULL,提高查询速度。

4.3 索引

  • 因为主键能够保证绝对唯一,所以效率最高
  • 日期有缺失,但具有唯一性约束,所以将日期设为唯一索引
ALTER TABLE students
ADD INDEX idx_score(score)
ADD UNIQUE INDEX uni_name (name)
-- SELECT * FROM students;

5 查询数据

  • 对MySQL数据库的所有修改都会保存下来,再次运行脚本,恢复到初始状态。

5.1 基本查询

$ d:
$ cd documation\program\sql
$ net start mysql
$ mysql -u root -p < init-test-data.sql
$ mysql -u root -p
use test;
select * from students;
select name from classes;
select 1;

5.2 条件查询

  • 用来查询符合日期条件的各气象要素
    select score from students where id <> 2 and gender = 'M';
    not;
    or;
    like;
    %;
    between;
    

5.3 投影查询

5.4 排序

select id,name,gender,score 
from students 
where class_id = 1 
order by score desc,gender;

5.5 分页查询

  • limit = pageSize
  • offset = pageSize * (pageIndex - 1)
    SELECT id, name, gender, score
    FROM students
    ORDER BY score DESC
    LIMIT 3 OFFSET 0;
    limit 3,0;
    limit 3;
    

5.6 聚合查询

  • 统计查询出的气象要素
    select count(*) num from students where gender = 'M';
    -- 查询行数
    select sum(pre) total_pre from precipitation where (month between 6 and 8) and year = 2016;
    -- 计算2016年夏季降水量
    select avg(temp) avg_tmp from temperature where year between 1950 and 1980 by month;
    -- 计算30年每月平均气温
    max;
    -- 计算某一列的最大值
    min;
    -- 计算某一列的最小值
    
  • 数据库结构日期拆分成年、月、日,便于查询,目前还差入库方法。

5.7 多表查询

  • 有多少个气象要素就有多少张表
    select
      s.id id,
      s.name,
      s.gender,
      s.score,
      c.id cid,
      c.name cname
      from students s,classes c;
    

5.8 连接查询

  • 内连接:inner join
    SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
    FROM students s
    INNER JOIN classes c
    ON s.class_id = c.id;
    
  • 外连接:outer join
    right outer join;
    left outer join;
    full outer join;
    

    6 修改数据

  • 增查改删,CRUD:create(insert)、retrieve(select)、update、delete

6.1 INSERT

insert info <> () values
(),
();

6.2 UPDATE

update <> set ()=() where ();

6.3 DELETE

delete from <> where ()

7 MySQL

graph LR
id1[MySQL Client] --> |SQL/TCP|id2[MySQL Server]
  • 可视化图形界面:MySQL Workbench
    show databases;
    -- information_schema
    -- mysql
    -- performance_schema
    -- sys
    create database test;
    drop database test;
    use test;
    show tabels;
    desc students;
    show create table students;
    drop table students;
    alter table students add column birth vachar(10) not null;
    ALTER TABLE students CHANGE COLUMN birth birthday VARCHAR(20) NOT NULL;
    ALTER TABLE students DROP COLUMN birthday;
    
  • 实用SQL语句
    replace into students (id,class_id,name,gender,score) values (1,1,'小明','F',99);
    --插入或替换
    insert into students (id,class_id,name,gender,score) values (1,1,'小明','F',99) on duplicate key update name='小明',gender='F',score=99;
    --插入或更新
    insert ignore into students (id,class_id,name,gender,score) values (1,1,'小明','F',99);
    --插入或忽略
    create table student_of_class1 select * from students where class_id=1;
    --快照
    create table statistics (
      id bigint not null auto_increment,
      class_id bigint not null,
      average double not null,
      primary key (id)
    );
    --创建表
    insert into statistics (class_id,average) select class_id,AVG(score) from students group by class_id;
    --写入各班平均成绩
    select * from students force index (idx_class_id) where class_id = 1 order by id desc;
    

    8 事务

  • 数据库事务具有把多条语句作为一个整体进行操作的功能,全部成功或全部失败。
  • 特性,ACID:atomic(原子性)、consistent(一致性)、isolation(隔离性)、duration(持久性)
  • 隐式事务、显式事务
    begin;
    update accounts set balance = balance - 100 where id = 1;
    update accounts set balance = balance + 100 where id = 2;
    commit;
    --rollback;
    
  • 隔离级别
isolation level dirty read nonrepeatable read phantom read
read uncommitted yes yes yes
read committed - yes yes
repeatable read - - yes
serializable - - -
  • 有针对性的选择事务的隔离级别,保证数据一致。

8.1 Read Uncommitted

  • dirty read:一个事务会读到另一个事务更新后但未提交的数据。

8.2 Read Committed

  • non repeatable read:一个事务读取了被另一个事务修改前后的两次数据。

8.3 Repeatable Read

  • phantom read:一个不存在的数据事在被另一个事物添加后可以更新。

8.4 Serializable

  • serializable:事务串行执行,效率下降。
  • MySQL使用InnoDB,默认隔离级别Repeatable Read。

9 建表

create database sys50884;
create table temperature (
id int(5) default '0' not null,
date_id date not null,
year_id int(4) not null,
month_id int(2) not null,
day_id int(2) not null,
temp_min double(3,2),
temp_max double(3,2),
temp_av double(3,2),
primary key(id));
insert into temperature values(1,1996-03-01,1996,3,1,-18.9,-6.2,-10.3);