来看看mysql

数据库mysql的学习

关系数据库和非关系型数据库

关系型数据表会创建很多个二维数据表,表之间相互关联,一对一,一对多,多对多,使用sql语句查询,支持事务,对数据的访问更加安全

非关系型数据库

NoSQL

相对简单一些,存储数据更加自由,性能更高,不支持事务

目前大部分公司在进行后端开发时用的都是关系型数据库,比较·常用的用到非关系型数据库的场景是爬取大量数据

SQL语句

mysql –version 查看数据库版本

终端连接

mysql -uroot -p密码

mysql -uroot -phaoge666

进入mysql模式,

输入show databases;(标点符号很重要)可以查看所有数据库 不规范

创建数据库-表

create database 名字;

查看当前使用的数据库

select database();

use haotest;

查看当前使用数据库中的表

show tables;

建表

1
2
3
4
5
create table 名字(
name varchar(10), //可变字符类型
age int, //
height double) //

插入数据

insert into users(name,age,height) values (‘hao’,22,165);

命令行敲太麻烦 使用GUI

几种GUI工具推荐

Navicat后续收费,SQLYog免费,TablePlus免费限制较多

从b站上找到好心的up猪弄来了navicat的绿色版本,根据up猪的指导完成破解

新建连接

SQL语句

关键字大写 CREATE SHOW TABLE DATABASE 。。。。

一条语句结尾需要;

遇到关键字表明字段昵称 可以使用``包裹CREATE TABLE moment

语句分类

DDL语句,数据定义语言,通过DDL语句对数据库或者表进行创建删除修改

DML,数据操作语言,对表进行添加删除修改

DQL,数据查询语言,可以从数据库中查询记录

DCL,数据控制语言,对数据库,表的权限访问进行控制

删除数据库

DROP database IF EXISTS haotest;

SHOW TABLES

CREATE TABLE IF NOT EXISTS students ()

MYSQL的数据类型

数字类型:INTEGER,INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT

浮点数:FLOAT,DOUBLE(float是4个字节,double是八个)单精度浮点数,双精度浮点数

准确数字类型:DECIMAL,NUMERIC(decimal是numeric的实现形式)

日期类型:YEAR:只有年份,date:只有年份和月日,没有时间,DATETIME:既有年月日也有时分秒

TIMESTAMP和DATETIME类似,但是时间范围是UTC的时间范围,都可以表示微秒,如果想自由设置时间就选择DATETIME

都有各自支持的时间范围

字符串类型:

CHAR,创建时为固定长度,一般是0-255之间,在被查询时,会删掉后面的空格,一个字节

VARCHAR是可变长度的字符串类型,长度可以是0-65535的任意值。在被查询时,不会删掉后面的空格

BINARY和VARBINARY是存储二进制的字符串

BLOB是用于存储比较大的二进制类型

TEXT是用于存储大的字符串类型

表约束

主键:PRIMARY KEY

一张表中为了记录每一条记录的唯一性,必须有一个字段永远不重复,并且不会为空,这就是主键,主键是表中唯一的索引,必须是NOT NULL,不主动设置,数据库也会自动设置成NOT NULL

主键也可以是多列索引,一般称为联合主键,

开发中主键和业务是无关的,尽量不要使用业务字段作为主键

唯一:UNIQUE

有些 字段是唯一的,不会重复的,身份证等,用UNIQUE约束,使用后该字段必须不相等,允许列值包含多个null

不能为空:NOT NULL不能为空

默认::DEFAULT

自动递增:AUTO_INCREMENT,id

外键约束:多表关系适用

创建一个完整的表

CREATE TABLE IF NOT EXISTS students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
age INT DEFAULT 0,
phoneNum VARCHAR(20) UNIQUE DEFAULT ‘’,
createTime TIMESTAMP
);

修改创建完后的表

修改表名

ALTER TABLE students RENAME TO haos;

添加新的列

ALTER TABLE haos ADD updateTime TIMESTAMP;

修改字段名称

ALTER TABLE haos CHANGE phoneNUm tel VARCHAR(20);

修改字段类型

ALTER TABLE haos MODIFY name VARCHAR(30);

删除一个字段

ALTER TABLE haos DROP tel;

根据一个表结构创建另一个表

CREATE TABLE user2 LIKE haos;

根据其他表的所有内容创建

CREATE TABLE user3 (SELECT * FROM user2);

只复制内容,其他东西不复制

DML语句 对数据库进行增删改

插入

INSERT INTO users VLUES(100,’hoage’);

INSERT INTO users (name,tel) VALUES (‘haoge’,’192xxxxx’)

删除

删除所有数据

DELETE FORM users

DELETE FROM users WHERE id = 10;

更新数据

此处没有指定哪一个数据修改,会将所有数据修改

UPDATE users SET name = ‘zhangsan’,age = 22;

更新符合条件的数据

UPDATE users SET name = ‘zhangsan’,age = 22 WHERE id = 22;

DQL语句 数据查询语言

SELECT 从一个或多个表中国检索选中的行,记录

查询所有字段

SELECT * FROM users;

查询指定字段

SELECT title,price FROM users;

取别名

SELECT title as phonetitle,price FROM users;

where条件
逻辑运算语句

SELECT * FROM users where price > 900 AND/&& price < 1000

SELECT * FROM users where price > 900 OR/|| price < 1000

将某些值设定为NULL

UPDATE products SET url = NULL where id;

查询某一个值为null

SELECT * FROM users WHERE url IS NULL

SELECT * FROM users WHERE url IS NOT NULL

模糊查询

搭配LIKE和%与_搭配

%表示匹配任意个字符串,_表示匹配一个的任意字符

SELECT * FROM products WHERE title LIKE ‘%华为%’;只要有华为就可以

SELECT * FROM products WHERE title LIKE ‘_华为%’;最前面的一个字符是任意的,后面接着华为

IN

表示取多个值中的其中一个即可

SELECT * FROM products WHERE brand = ‘华为’ || brand = ‘小米’

可是如果条件多的话就brand = xxx || brand = xxx || brand = xxx;

SELECT * FROM products WHERE brand IN ( ‘华为’ ,’小米’,’苹果’)

对查询结果进行排序

SELECT * FROM products WHERE brand IN ( ‘华为’ ,’小米’,’苹果’) ORDER BY price ASC;根据价格升序

SELECT * FROM products WHERE brand IN ( ‘华为’ ,’小米’,’苹果’) ORDER BY price ASC ,score DESC;根据价格升序后再对比评分降序

分页查询

SELECT * FROM users LIMIT 20 OFFSET 0;

SELECT * FROM users LIMIT OFFSET LIMIT;

SELECT * FROM users LIMIT 0 20;

创建多表

聚合函数

常用的聚合函数

计算所有商品总价值

SELECT SUM(price) as totalPrice FROM products

求所有华为手机价格的总和

SELECT SUM(price) FROM products WHERE brand = ‘华为’,

计算华为手机平均价格

SELECT AVG(price) FROM products WHERE brand = ‘华为’,

计算价格最大值

SELECT MAX(price) FROM products,

计算价格最小值

SELECT MIN(price) FROM products,

求华为手机个数

SELECT COUNT(*) FROM products brand = ‘华为,

求苹果手机有url的个数

SELECT COUNT(url) FROM products brand = ‘苹果,

去除相同价格

SELECT COUNT(DISTINCT price) FROM products,

GROUP BY 分组

根据品牌进行分组

SELECT brand, AVG(price),COUNT(*),AVG(score) FROM products GROUP BY brand;

HAVING

根据查询出来的结果筛选出》2000的手机

SELECT brand, AVG(price) as toal,COUNT(*),AVG(score) FROM products GROUP BY brand HAVING total > 2000;

求评分大于7.5的手机的平均价格

SELECT AVG(price) FROM products WHERE score > 7.5

按照品牌分类以后求评分大于7.5的手机的平均价格

SELECT * FROM products WHERE score > 7.5 GROUP BY brand;44

创建多张表

CREATE TABLE IF NOT EXISTS brand(

​ id INT PRIMARY KEY AUTO INCREMENT,

​ name VARCHAR(20) NOT NULL,

​ webSite VARCHAR(100),

​ phoneRank INT

INSERT INTO brand (name,website,phoneRank) VALUES (‘华为’,’www.baidu.com',20)

ALTER TABLE products add brandid INT;通过新增加的brandid去查询另一张表的数据

但是该brandid必须要限制

外键限制foreign key

create table products (

​ foreign key(brandid) reference brand(id)

)

修改brandid为外键

alter table products ADD FOREIGN KEY(brandid) REFERENCES brand(id)

外键内置两个action,一个是删除时,一个是更新时

不能随意更改外键及其相关值

RESTRICT默认属性,当更新或者删除某个值时,会检查该值是否有关联的外键记录,有的话会报错,不允许更新或删除

CASCADE:关联联动,当更新或者删除每个值时,检查是否有外键记录,如果是更新,那么则更新对应记录如果是删除,则删除对应记录

SET NULL当更新或者删除值时,会检查是否有该值的外键记录,有的话则设置为NULL

将RESTRICT修改为CASCADE

1:获取目前外键名称

SHOW CREATE TABLE products

2:根据名称将外键删掉

ALTER TABLE products DROP FOREIGN KEY products_ibfk_1;

3:重新添加外键约束

ALTER TABLE products ADD FOREIGN KEY (brandid)REFERENCES brand(id)

ON UPDATE CASCADE

ON DELETE RESTRICT // 删除时是非常危险的,不能直接用cascade,建议使用默认值

多表查询

多连接sql join

左连接 :LEFT JOIN

右连接 RIGHT JOIN

内连接 INNER JOIN

全连接 FULL OUTER JOIN 注:mysql不支持