数据库mysql的学习
关系数据库和非关系型数据库
关系型数据表会创建很多个二维数据表,表之间相互关联,一对一,一对多,多对多,使用sql语句查询,支持事务,对数据的访问更加安全
非关系型数据库
NoSQL
相对简单一些,存储数据更加自由,性能更高,不支持事务
目前大部分公司在进行后端开发时用的都是关系型数据库,比较·常用的用到非关系型数据库的场景是爬取大量数据
SQL语句
mysql –version 查看数据库版本
终端连接
mysql -uroot -p密码
mysql -uroot -phaoge666
进入mysql模式,
输入show databases;(标点符号很重要)可以查看所有数据库 不规范
创建数据库-表
create database 名字;
查看当前使用的数据库
select database();
use haotest;
查看当前使用数据库中的表
show tables;
建表
1 | create table 名字( |
插入数据
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,数据控制语言,对数据库,表的权限访问进行控制
CREATE DATABASES IF NOT EXISTS haoge
删除数据库
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不支持