1、MySQL数据库的登录和退出

  • mysql数据库是一个关系型数据库管理系统

  • mysql优势:

    • 开源免费

    • 支持大型数据库

    • 使用标准的sql语言开发

    • 支持跨平台,多种语言接口

  • mysql的登录和退出

# 登录方式一:
mysql -uroot -p 回车
密码
# 登录方式二:
mysql -uroot -p密码
# 登录方式三:
mysql --user=root --password=密码
​
# 退出方式一:
exit
# 退出方式二:
quit
# 退出方式三:
ctrl + z
  • mysql支持远程连接

# 远程连接方式一:
mysql --user=root --host=192.168.88.100 --password=密码
# 远程连接方式二:
mysql -uroot -h192.168.88.100 -p密码

2、sql语句

  • sql语句的分类

    • DDL:数据库定义语言:对数据库和数据表进行构建,修改和删除

    • DML:数据库操作语言:对数据表中的记录进行增加,修改和删除

    • DQL:数据库查询语言:对数据表中的记录进行查询

    • DCL:对用户权限进行管理,对数据安全等级进行设定,用户的添加和删除

  • sql通用语法:

    • 可以单行显示,也可以多行显示,以分号结尾

    • 可以随意换行或者缩进,不影响sql语句的执行

    • 关键字不区分大小写

    • 注释类型

      • 单行注释 -- # ctrl + /

      • 多行注释/**/

3、sql通用数据类型

  • 整型:

    • tinyint (-128---127)

    • smallint(-65536-----65535)

    • int(-21亿----21亿)

    • bigint(-2等64次方 ----- 2的64次方-1)

  • 浮点型:

    • float 单精度浮点型

    • double 双精度浮点型

    • decimal 精确控制数字及小数位数量 decimal(10, 2)一共有10个数位,2个小数位,如果源数据多余该小数位数,会自动四舍五入

  • 日期类型:

    • date:日期类型 YYYY-MM-DD

    • datetime:日期时间类型 YYYY-MM-DD hh:mm:ss

  • 文本类型:

    • char:定长字符:char(10)占用10个字符的空间

      • 如果char(10)保存了两个字符的数据,那么空余字符用空格补齐。占用空间大小不变

      • char的检索速度和查询效率远高于varchar

    • varchar:变长字符varchar(10)最多占用10个字符的空间==

      • 如果varchar(10)保存了两个字符的数据,那么就占用两个字符的空间大小

4、数据库的创建

  • 创建数据库

    • create database 数据库名称

    • create database if not exists 数据库名称

    • 在创建数据库时可以指定字符集,一般指定字符集可以防止中文乱码。

# 创建数据库
CREATE DATABASE BigData_DB;
# 如果当前数据库不存在则创建,如果存在,则什么也不做
CREATE DATABASE IF NOT EXISTS BigData_DB;
# ctrl + d  可以进行整行复制
# 在linux中mysql 的数据库名称严格区分大小写,一般情况下定义数据库名称我们使用小写
CREATE DATABASE IF NOT EXISTS bigdata_db;
# 在定义数据库时可以指定字符集
# 指定字符集的作用
# gbk 国标编码 (不支持Ascii)
# Unicode编码  (前128位是ASCII,后边是扩展编码)
# 一般我们使用utf-8编码格式,兼容性好,空间占用率小
# 既包含了中文编码,又包含了ASCII码表
# 如果不设置utf8字符集,在插入中文信息时会报错,在读取中文信息时会乱码
CREATE DATABASE IF NOT EXISTS bigdata_db1 CHARACTER SET utf8;

5、数据库的展示、删除和使用

  • 数据库展示:show databases;

  • 数据库删除:drop database 要删除的数据库名称;

  • 数据库使用:use 要使用的数据库名称;

  • 查询当前正在使用的数据库:select database();

# 数据库的展示
SHOW DATABASES;
​
# 删除数据库
# 如果删除的数据库已经不存在,则会报错
# [HY000][1008] Can't drop database 'BigData_DB'; database doesn't exist
DROP DATABASE BigData_DB;
# 使用数据库
USE bigdata_db;
​
# 查询当前使用的数据库
SELECT database();

6、数据表的创建,删除 和查看

  • 数据表的创建

    • create table 表名(字段名 类型 约束, 字段名2 类型 约束 。。。。。。);

    • 在创建表时,最少有一个字段,不然无法创建

  • 删除数据表

    • drop table 表名;

  • 查看表

    • show tables; 查看当前数据库中所有表的名称列表。

    • desc 表名;查看指定表的表结构。

# 要创建数据表之前一定要使用一个数据库(USE)
USE bigdata_db;
# 创建数据表
/*
格式:
create table 表名(字段名1 类型  (约束),字段名2 类型  (约束),......
);
*/
CREATE TABLE category1      # 创建表,并定义表名
(cid   INT PRIMARY KEY, # 插入的字段,和类型,以及约束cname VARCHAR(100)     # 约束为可选,可以在定义字段时不添加约束
);
​
# 查看当前数据库中所有的表的名称列表(在这之前一定要use数据库)
SHOW TABLES;
​
# 查询指定的表的结构
DESC category;
​
# 删除表
# [42S02][1051] Unknown table 'bigdata_db.category1'
# 如果删除不存在的表,将会报错
DROP TABLE category1;

7、字段的相关操作

  • 字段的增加:

    • alter table 表名 add 新字段名 数据类型 (约束);

  • 字段的修改:

    • alter table 表名 change 旧字段名 新字段名 数据类型 (约束);

  • 字段的删除:

    • alter table 表名 drop 字段名称;

  • 表名的修改:

    • rename table 旧表名 to 新表名;

# use数据库
USE bigdata_db;
# 对数据表的结构进行查询
DESC category;
# 增加一个字段,字段名称为desc  字段类型为varchar(100),没有约束
# desc 是用来查询表结构的关键字,且关键字不区分大小写,所以会报错
# 要么改名,要么使用esc下边的点,将其包裹起来则可以正常使用,指明其为字段名称,并不是关键字
ALTER TABLE category ADD `desc` VARCHAR(100);
# 如果字段名称不与关键字重名,则不需要使用``进行包裹
ALTER TABLE category ADD num INT;
​
# 修改字段
# 使用change可以对字段的名称和类型以及约束同时进行修改
ALTER TABLE category CHANGE `desc` description VARCHAR(255);
# 使用change将num字段的数据类型改为varchar类型
# 如果需要修改其类型或者约束,不修改名称,名称也需要再书写一遍
# 如果修改的字段不存在,则报错[42S22][1054] Unknown column 'num' in 'category'
ALTER TABLE category CHANGE num num VARCHAR(100);
​
# 删除字段
# 如果删除的字段不存在则报错
# [42000][1091] Can't DROP 'num'; check that column/key exists
ALTER TABLE category DROP num;
​
# 修改表名
RENAME TABLE category TO category2;
# 查看所有的表
SHOW TABLES;
# 修改为category之后原表消失
DESC category2;
# [42S02][1146] Table 'bigdata_db.category' doesn't exist
DESC category;
# 将category2 修改为 category
RENAME TABLE category2 TO category;

8、插入记录

  • 插入记录(方式1):insert into 表名(字段名1, 字段名2) values(值1, 值2),(值1, 值2)。。。。。。

  • 插入记录(方式2):insert into 表名 values (值1,值2,值3....),(值1,值2,值3....),(值1,值2,值3....)。。。。。。。

  • 如果使用不指定字段的形式,必须将所有字段都进行赋值,否则会报错

  • 如果使用指定字段的形式,则必须讲指定的字段都进行赋值,否则会报错

# 使用数据库
USE bigdata_db;
# 查看category表中的结构
DESC category;
​
# 插入数据
# 指定字段后只对被指定的字段赋值,其余字段自动置为null(null代表空值)
# 在sql中字符型数据(文本型数据)必须使用''(引号)包裹起来,才能储存,(了解:日期数据,也要使用''包裹起来)
INSERT INTOcategory(cid, cname)
VALUES(1, '电器');
# 插入数据时不指定字段
# 如果传入数据的数量和字段数不相等则会报错
# Column count doesn't match value count at row 1
# INSERT INTO category VALUES (2, '水果');
INSERT INTOcategory
VALUES(2, '水果', '真的很甜');
​
# 一次性插入多条数据
INSERT INTOcategory(cid, cname)
VALUES(3, '图书'),(4, '服装');
​
# 使用完全插入的方式插入多条数据
INSERT INTOcategory
VALUES(5, '房产', '又升值了'),(6, '生活', '生活真好呀'),(7, '数码类', '买个照相机,就是cgx');

9、记录的更新

  • update更新数据:update 表名 set 字段名 = 值 (where 条件)

  • 如果使用where就可以控制要修改的行

  • 如果不适用where则对所有的行进行修改

  • 被修改后,数据类型不能发生改变

  • 不能超过原有数据的最大长度

  • 除了数值型数据之外(整型,浮点型)省下的数据都需要使用引号包裹起来

# 更新记录信息update
# 需求,将cid=5的房产信息中descripton中的'又升值了', 改为,'房价已经腰斩了'
# 使用update进行更新,set后边控制要更新的列,  where控制要更新的行
UPDATE category SET description = '房价已经腰斩了' WHERE cid = 5;
# 如果不指定where 就要对整列数据进行修改.
UPDATE category SET description= '好开心呀,又下课了,可以给男朋友打电话';
# 修改后的数据类型,一定要和修改前一致
# varchar类型中,可以存储数值型数据,但是不能超长,否则会出现问题
# UPDATE category SET cname = 2135678901 WHERE cid = 2;
# int类型的字段内不能存放字符型(文本型)数据
# Incorrect integer value: 'c001' for column 'cid' at row 1
UPDATE category SET cid = 'c001' WHERE cname = '服装';

10、删除记录

  • delete 删除记录:delete from 表名 where 条件筛选;

    • 如果使用where没有筛选到任何数据信息,删除操作不会报错,但是什么都不会执行

    • 如果where筛选出对应的数据,则将 数据删除

# 删除记录
# 如果经过条件筛选,未找到满足条件的数据,则不进行任何删除动作,同时也不报错
DELETE FROM category WHERE cid = 10;
# 如果删除的记录存在则将其删除
DELETE FROM category WHERE cid = 7;
# 如果在删除表的时候,不添加where进行条件筛选,则将删除所有的数据
DELETE FROM category;
# 使用truncate清空表,也可以将数据全部清空,但是不能使用条件过滤
TRUNCATE TABLE category;

11、主键约束

  • 主键的添加:

    • 在创建时添加

      create table 表名(字段名 字段类型  primary key,字段名 字段类型。。。。。
      );
    • 在创建表之后,再添加

      alter table 表名 add primary key(主键字段);
  • 主键的删除

    alter table 表名 drop primary key;
  • 注意事项:

    • 主键时非空的:不能为空

    • 主键是唯一的:不能重复

    • 主键被删除之后,该字段依然是非空的,不能传入null或者不赋值

# 查询当前使用的数据库
SELECT database();
# 查询category表中的主键约束
DESC category;
# 创建一个persons表,并设定id为主键
CREATE TABLE persons(id INT PRIMARY KEY ,last_name VARCHAR(20),first_name VARCHAR(20),address VARCHAR(20),city VARCHAR(20)
);
​
# 查询persons表的结构
DESC persons;
​
# 主键非空
# Field 'id' doesn't have a default value (id没有默认值)
# 在使用主键时,必须给主键传值或者设置默认值,否则会报错
# INSERT INTO persons(last_name, first_name) VALUES ('san', 'zhang');
​
# 主键唯一
INSERT  INTO persons(id, last_name, first_name) VALUES (1, 'san', 'zhang'), (2, 'si','li');
# 再插入一条信息,保证除主键外的其他内筒均不相同
# Duplicate entry '1' for key 'PRIMARY'
# 主键中不能插入重复值,如果插入的值在主键中已经存在,则会报错,无法插入成功
# INSERT INTO persons(id, last_name, first_name) VALUES (1, 'wu', 'wang');
​
# 创建表时,可以没有主键
CREATE TABLE persons1(id INT ,last_name VARCHAR(20),first_name VARCHAR(20),address VARCHAR(20),city VARCHAR(20)
);
# 创表完成后,依然可以添加主键
ALTER TABLE persons1 ADD PRIMARY KEY (id);
​
# 查看表结构
DESC persons1;
​
# 一张表中不能出现两个主键,如果定义两个主键,会出现如下报错
# Multiple primary key defined
ALTER TABLE persons1 ADD PRIMARY KEY (first_name);
​
# 主键的删除
ALTER TABLE persons1 DROP PRIMARY KEY ;
​
# desc查看表结构
# 在删除主键之后,原主键字段依然不能为空.
DESC persons1;
# Column 'id' cannot be null
# INSERT  INTO persons(id, last_name, first_name) VALUES (NULL, 'san', 'zhang'), (2, 'si','li');

12、自动增长

  • auto_increment:自动增长

    • 只能对整型自动增长

    • 只能修饰键(一般修饰主键)

# 创建一个新表persons2
CREATE TABLE person2(id INT PRIMARY KEY AUTO_INCREMENT,last_name VARCHAR(20),first_name VARCHAR(20),address VARCHAR(20),city VARCHAR(20)
);
# 查看表结构
DESC person2;
# 怎样验证自动增长呢?
# 不给id传值,且表中无其他数据,则id自动增长为从1开始自增的整数序列
INSERT INTO person2(last_name, first_name) VALUES ('san', 'zhang'), ('si', 'li');
# 如果给id传值,则表中将记录传入的id值,不进行自增操作
INSERT INTO person2(id, last_name, first_name) VALUES (6, 'san', 'zhang');
# 给id 传值为null也可以进行自增操作
# 主键自增时,是按照当前id值的最大值+1进行计算
INSERT INTO person2(id, last_name, first_name) VALUES (NULL, 'xiaolong', 'li');
INSERT INTO person2(id, last_name, first_name) VALUES (NULL, 'qingxia', 'lin');
​
# 创建一个新表persons3,查看是否可以不修饰键
# 结论:如果修饰的字段不是键,则会报如下错误
#  Incorrect table definition; there can be only one auto column and it must be defined as a key
# CREATE TABLE person3(
#     id INT AUTO_INCREMENT,
#     last_name VARCHAR(20),
#     first_name VARCHAR(20),
#     address VARCHAR(20),
#     city VARCHAR(20)
# );
​
# 修饰的内容可否不为整型
# 如果修饰的内容不是整型,则报如下错误
# Incorrect column specifier(指示语) for column 'id'
# CREATE TABLE person3(
#     id VARCHAR(20) PRIMARY KEY AUTO_INCREMENT,
#     last_name VARCHAR(20),
#     first_name VARCHAR(20),
#     address VARCHAR(20),
#     city VARCHAR(20)
# );

13、非空约束

  • not null:非空约束修饰的字段,不接受null值,在数据处理时不用对null值进行判断

  • 在定义时,可以在约束位置直接添加非空约束。

  • 在一个表中可以有多个非空约束。

# 创建persons3
CREATE TABLE persons3(id INT PRIMARY KEY AUTO_INCREMENT NOT NULL ,last_name VARCHAR(20) NOT NULL ,first_name VARCHAR(20),address VARCHAR(20),city VARCHAR(20)
);
​
# 查看表结构
# 通过表的查询,我们得知id 和 last_name是 非空约束
DESC persons3;
​
# 查看非空约束能否不传值
# 如果没有传值,且没有默认值,则会报如下错误.
# Field 'last_name' doesn't have a default value
INSERT INTO persons3(first_name, address, city) VALUES ('li', '天津', '滨海新区');
# 如果给非空约束的字段赋控制,则会报如下错误.
#  Column 'last_name' cannot be null
INSERT INTO persons3(last_name, first_name, address, city) VALUES (NULL ,'li', '天津', '滨海新区');
# 在使用null时不能使用引号包裹,否则将会变为文本类型数据,不再是空值
INSERT INTO persons3(last_name, first_name, address, city) VALUES ('null' ,'li', '天津', '滨海新区');
​
​
# null是一种数据类型,是空值类型
# 为什么null不用加引号呢?
# null是关键字
# 关键字:系统定义的具有特殊功能或者含义的字符组合
# 定义的字段名  叫做标识符
# 标识符:程序员自己定义的,具有特殊功能或含义的字符组合

14、唯一约束

  • unique : 保证数据的唯一性,如果被唯一约束修饰,则不能出现重复值。

  • 主键自动拥有唯一约束,如果主键被删除,则唯一约束消失。

# 创建一个新的表persons4
CREATE TABLE persons4(id INT PRIMARY KEY AUTO_INCREMENT,last_name VARCHAR(20) UNIQUE ,first_name VARCHAR(20) UNIQUE ,address VARCHAR(20),city VARCHAR(20)
);
# 查询表结构
DESC persons4;
# 通过查询表结构,我们得知,last_name不能重复, first_name也不能重复, id为主键,同样不能重复.
# 插入数据,查看是否可以重复
INSERT INTO persons4(id, last_name,first_name) VALUES (1,'san', 'zhang');
# last_name 字段不能重复,因为有唯一约束
#  Duplicate entry 'san' for key 'last_name'
INSERT INTO persons4(id,last_name,first_name) VALUES (2, 'san', 'li');
# 唯一约束,不能存重复值,但是可以存空值
INSERT INTO persons4(id,last_name,first_name) VALUES (NULL, 'si', NULL);
# 唯一约束,只约束字段设定的数据类型不能重复,如果为空值,不进行校对
INSERT INTO persons4(id,last_name,first_name) VALUES (NULL, 'wu', NULL);
# 空格可以存入数据库
INSERT INTO persons4(id,last_name,first_name) VALUES (NULL, null, ' ');
# 但是空格是varchar类型数据,也参与非空校验.
#  Duplicate entry ' ' for key 'first_name'
# INSERT INTO persons4(id,last_name,first_name) VALUES (NULL, null, ' ');

15、简单查询

  • 格式:select 字段名 from 表名

  • 字段名可以指定一个,也可以指定多个,使用*代表查询所有字段

  • 表名必须存在

  • select后边可以对指定字段进行数学运算

# 准备商品表
CREATE TABLE product
(pid         INT PRIMARY KEY,pname       VARCHAR(20),price       DOUBLE,category_id VARCHAR(32)
​
);
​
# 查询product表结构
DESC product;
​
# 插入数据
INSERT INTO product(pid,pname,price,category_id) VALUES(1,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(2,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(3,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(4,'杰克琼斯',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(5,'真维斯',200,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(6,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(7,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(8,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(9,'相宜本草',200,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(10,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(11,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(12,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(13,'海澜之家',1,'c002');
​
# 简单查询,不包含条件
# 将所有商品进行查询,查询后展示所有商品信息
# select 要查询的字段名 from 表名  代表要从某个表中查询某个字段.
# 使用*可以查询到当前表中的所有字段
SELECT * FROM product;
​
# 查询所有商品的指定字段(商品名,商品价格)
SELECT pname, price FROM product;
# 将商品名称及商品价格互换位置,则输出的数据列位置同样进行更改
SELECT price, pname FROM product;
​
# 查询所有商品价格的同时对所有的商品价格+10后进行输出
# 在select后边可以进行数学运算
SELECT pname, price + 10 FROM product;

16、比较查询

  • < > <= >= = != <>

# 条件查询
# 比较查询  >  <  >= <= = <> !=
# 需求:查询商品价格大于600的所有商品信息
SELECT * FROM product WHERE price > 600;
# 查询商品价格小于2000的所有商品信息
SELECT * FROM product WHERE price < 2000;
# 查询商品价格小于等于1000的所有商品的名称
SELECT pname FROM product WHERE price <= 1000;
# 查询 商品价格大于等于800的多有商品的名称和价格
SELECT pname, price FROM product WHERE price >= 800;
# 查询商品价格不等于800的所有商品的信息
SELECT * FROM product WHERE price != 800;
SELECT * FROM product WHERE price <> 800;

17、范围查询

  • between and 查询连续范围内的数据,包含左右边间,是一个闭区间

    • between and 必须从小值到大值进行范围划分,否则没有数据

  • in 查询不连续区间内的数据,in (数据1, 数据2 。。。。。)

  • 格式:select 列名 from 表名 where 字段名 in (数据1, 数据2, 数据3 。。。。)

# 范围查询
# between and 连续范围查询
# 需求: 查找,价格在200-2000范围内的所有商品,包含起始和终止位置,是一个闭区间[]
SELECT * FROM product WHERE price BETWEEN 200 AND 2000;
​
# in 不连续范围查询
# 需求:查找价格是200, 800, 2000, 5000的所有商品的全部信息
SELECT * FROM product WHERE price IN (200, 800, 2000, 5000);
​
# 回顾之前的题目  查询在安徽和北京的同学
# SELECT * FROM  student_info WHERE hometown in not ('安徽', '北京');
​
# 练习:
# 1/查询价格在600-2000范围内的所有商品的名称和价格
# between只能从小到大设置范围
SELECT pname, price FROM product WHERE price BETWEEN 600 AND 2000;
# SELECT pname, price FROM product WHERE price BETWEEN 2000 AND 600;
# 2/查询名字为真维斯,杰克琼斯以及香奈儿的所有商品
SELECT * FROM product WHERE pname IN ('真维斯', '杰克琼斯', '香奈儿');

18、逻辑查询

  • 逻辑运算符

    • and 逻辑与 同真即真

    • or 逻辑或 同假即假

    • not 逻辑非 非真即假,非假即真

# 逻辑运算符
# and  逻辑与  ? 同真即真
# or   逻辑或  ? 同假即假
# not  逻辑非  ? 真变假,假变真
# 如果条件成立,我们定义其结果为 True
# 如果条件不成立,我们定义其结果为 False
​
# True and True  ??  True  真
# True  and  False ?? False  假
# False and  True  ?? False  假
# False and False  ??  False  假
​
# True or True  ??  True  真
# True  or  False ?? True  真
# False or  True  ?? True  真
# False or False  ??  False  假
​
# not False  ?? True  真
# not  True   ??  False  假
​
# 第一题   not ((True  and  4 > 5) or  3 > 2)  ??? False
​
# 需求: 查询价格在200-2000之间的所有商品,如果需要包含边界,则需要使用大于等于和小于等于
SELECT * FROM product WHERE price <= 2000 AND price >= 200;
# 需求:查询价格不再200-2000范围内的所有商品信息
SELECT * FROM product WHERE NOT (price <= 2000 AND price >= 200);
# 方法二:
SELECT * FROM product WHERE price > 2000 OR  price < 200;

19、模糊查询

  • like关键字,可以进行模糊查询:根据指定规则进行查询

    • %:代表0个或多个字符

    • _:代表一个字符

  • 格式: select 列名 from 表名 where 字段 like 规则;

# 模糊查询:根据指定规则进行查询,满足规则将被筛选出来,不满足规则将隐藏
# LIKE 关键字可以进行模糊查询
# 通配符:  %代表任意多个字符(可以是0可以是n)   _代表任意一个字符(有且只有一个)
# 格式: select 列名 from 表名  where 字段  like  '规则';
​
# 需求:查询名字以"斯"结尾的所有商品
SELECT * FROM product WHERE pname LIKE '%斯';
​
# 需求,查询名字以"海"开头的所有商品
SELECT * FROM product WHERE pname LIKE '海%';
​
# 需求:查询名字中带有"霸"的所有商品
SELECT * FROM product WHERE pname LIKE '%霸%';
​
# 需求:查询名字是两个字的所有商品
SELECT * FROM product WHERE pname LIKE '__';
​
# 查询名字是三个字符,且结尾为斯的商品信息
SELECT * FROM product WHERE pname LIKE '__斯';
​
# 字符: 每一个符号,或者文字,占用一个字符
# 字节: 空间单位,每个符号或者文字占用的字节数不相同,比如  a b  占用一个字节  汉字 占用三个字节
# char  varchar 后边的括号内填写的是字符数

20、非空查询

  • is null 判断是否为空

  • is not null 判断是否不为空

  • 格式: select 列名 from 表名 where 字段名 is (not) null;

# 我们怎样判断空值?
# 格式:select 列名  from 表名 where 字段名 is null;(筛选出字段为空的记录)
# 格式:select 列名  from 表名 where 字段名 is not null;(筛选出字段不为空的记录)
# 需求: 删除pid =10 的category_id 的值
UPDATE product SET category_id = NULL WHERE pid = 10;
# 需求: 查询所有商品中,category_id为空的商品
# null 是不能和其他数据类型进行比较的
# 如果需要判断当前数据是否为空值,则使用is null判断
SELECT * FROM product WHERE category_id IS NULL;
# 需求:查询所有商品中category_id不为空的商品
SELECT * FROM product WHERE category_id IS NOT NULL;
SELECT * FROM product WHERE NOT (category_id IS NULL);
​
# 查询所有商品中category_id为空  且 pname 不为空的商品(加上括号易于阅读,并且不容易出错)
SELECT * FROM product WHERE (category_id IS NULL) AND (pname IS NOT NULL);

21、排序查询

  • order by:排序的关键字,可以构建指定字段,指定规则的排序

  • 格式: select 列名 from 表名 where 条件 order by 字段名 排序规则(asc 升序、 desc 降序);

  • 如果按照多个字段进行排序,先按照排在前边的字段进行排序,如果排序值相同,则按照后边的规则排序。

# 排序查询
# order by
# asc  升序   desc 降序
# 格式: select 类名 from 表名 where 条件 order by 字段名 排序规则(asc/desc)
​
# 需求:查询所有商品,并按照价格进行排序(降序排列)
SELECT *
FROMproduct
ORDER BYprice DESC ;
​
# 需求:查询所有商品中,价格大于2000的商品并按照升序进行排列.
# 如果需要升序排列,则不需要使用ASC,默认就是升序排列
SELECT * FROM product WHERE price > 2000 ORDER BY price ASC;
​
# 可不可以对两个字段进行排序呢?
# 按照多个字段规则进行排序,则先按照最前面的规则排序,如果排序过程中,值相同,则按照后边的规则进行排序
# 需求:按照categroy_id进行升序排列,如果categroy_id相同,则按照价格进行降序排列
SELECT * FROM product ORDER BY category_id ASC , price DESC ;
​
# 需求:按照价格进行降序排列,如果价格相同,则按照category_id进行升序排列
SELECT * FROM product ORDER BY price DESC , category_id;
​
# 文本型数据排序规则
# 没有数据 <  有数据
# 排序按照编码表顺序排序 排在前边的小   排在后边的大   0-9依次递增  < A-Z 依次递增 < a - z 依次等
# 文本型数据比较大小按位比较,第一位进行比较如果值大则大,值小则小,如果相同,则比较第二位
​
# '9' >'20'
# '小2' > '99999999'
# 'a' >  'Z'

22、聚合函数

  • 将整列数据进行聚合,计算成一个值的函数,如最大值,最小值,计数,求和,平均值等。

    • count 计数

    • sum 求和

    • max 最大值

    • min 最小值

    • avg 平均值

# 聚合查询  调用聚合函数:函数名(参数)
# 格式:select 聚合函数(字段名/*) from 表名;
# count  计数
# 需求:获取当前学员的总数
# 使用count(*)的时候,必须当前记录中所有字段都为空才能被忽略
SELECT count(*) FROM product;  # 13
# 使用聚合函数会忽略控制,在计算category_id的数量的时候没有统计空值
SELECT count(category_id) FROM product;  # 12
# 查询 price 和category_id都不为空的数据的个数 如下写法错误!
# SELECT count(category_id, price) FROM product;
​
# sum  求和
# 需求:将所有商品都购买一个一共需要多少钱
# sum 求和一样忽略了空值
SELECT sum(price) FROM product;
​
# max  最大值
# 需求:所有商品中最贵的商品价格是多少?
SELECT max(price) FROM product;
​
​
# min  最小值
# 需求,所有商品中最便宜的商品价格是多少?
SELECT min(price) FROM product;
​
# avg 平均值
# 需求,所有商品的平均价格是多少
SELECT avg(price) FROM product;
​
​
# 练习: 计算当前最大值与平均值的差,和最小值与平均值的差
SELECT max(price) - avg(price), min(price) - avg(price) FROM product;
​
# 聚合函数可不可以以使用在条件语句中呢?
# 不能讲聚合函数使用在where语句中
# SELECT * FROM product WHERE price > count(price);

23、分组查询

  • group by :将记录按照指定字段分成多组,字段相同的内容分为一组

  • 格式:select 分组字段/聚合函数/其他函数 from 表名 group by 分组字段 having 条件

  • having

    • 在group by 分组之后,不能使用where进行条件查询,只能通过having进行条件筛选

    • 在having中可以使用聚合函数,但是在where 中不可以使用

  • 在linux 中默认开启了group by 严格模式,在select后边不能使用除了分组字段外的其他字段

# 分组:就是根据指定的字段进行分类,如果类别相同则分为一组
# 需求:查询当前产品中每一类商品各有多少个
SELECT category_id, count(*) FROM product GROUP BY category_id;
# 需求:查询当前商品中,每一类商品的平均价格是多少?
SELECT category_id, avg(price) FROM product GROUP BY category_id;
# 需求:查询每一类商品的最大价格是多少?
SELECT category_id, max(price) FROM product GROUP BY category_id;
​
# 在分组的同时,可以进行条件筛选
# 需求,查询出商品种类超过两种的商品类型
# 在分组过后不能使用where进行数据筛选
# 在分组后,或者说在group by后边只能使用having 不能使用where 同时,在having后边可以使用聚合函数.
# 聚合,一般都是配合分组进行使用的
SELECT category_id, count(*) FROM product GROUP BY category_id HAVING count(*) >= 2;
​
# 根据多个字段进行分组
# 根据多个字段分组的原则就是,两个字段同时相等,则分为一组,如果有一个字段不相同,也不能分为一组
SELECT category_id, price FROM product GROUP BY category_id, price;
​
# group by 严格模式
# Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'bigdata_db.product.pname' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
# linux中默认开启group by 严格模式:在select 后边不能出现除分组字段外的其他字段,但是可以使用聚合函数
SELECT category_id, price, pname FROM product GROUP BY category_id, price;
​
# 拓展  查看当前每一类商品的所有商品名称
# 在查询数据时,每一个组中有多条记录,在查询过程中,不能使用除分组字段外的其他字段进行显示,因为对应记录较多,不知道该获取哪一条记录
SELECT category_id, group_concat(pname) FROM product GROUP BY category_id;

24、分页查询

  • 分页查询就是将查询到的数据按照一定的规则截取其中的一部分

    • 格式:select 字段 from 表名 limit m , n

    • m:当前也开始索引的位置

    • n:当前页所要展示的条目数

# 分页查询
# 格式:select 字段名 from 表名 limit m, n;
# m 是开始索引的位置,  计算开始索引的时候从0开始计算
# n 每页展示的条目数量
​
# 需求:查询所有的商品数据,并展示前三条数据
SELECT * FROM product LIMIT 0, 3;
# 如果从开头开始展示,可以将起始位置进行省略
SELECT * FROM product LIMIT 3;
# 需求:查询所有商品数据,并展示第5-7条数据
SELECT * FROM product LIMIT 4, 3;
​
# 需求:分页展示商品信息,每页3条数据,直到将数据完全展示完为止
# m:(当前页-1)*每页显示条数
# n : 每页展示的条目数
SELECT * FROM product LIMIT 0, 3;  # 第一页
SELECT * FROM product LIMIT 3, 3;  # 第一页
SELECT * FROM product LIMIT 6, 3;  # 第一页

25、外键索引

  • 如果数据表含有从属关系,比如部门和员工, 教室和桌椅,班级和同学就可以使用一对多的制表关系

  • 一的一方定义为主表, 多的一方定义为从表

  • 在多的一方添加一列,作为外键约束 ,引用少的一方的主键

  • 如果主表中的主键被应用,则该条数据无法被删除

  • 如果从表中的外键找不到相同值的主键,则无法被插入

# 创建分类表
CREATE TABLE category1
(cid   VARCHAR(32) PRIMARY KEY,cname VARCHAR(100)#分类名称
);
​
# 商品表
# 外键约束的添加格式
# 在创建时在最下方添加外键约束:constraint(约束) foreign key(外键字段) reference(参考) 主表(主键)
CREATE TABLE products
(pid         VARCHAR(32) PRIMARY KEY,name        VARCHAR(40),price         DOUBLE,category_id VARCHAR(32),CONSTRAINT FOREIGN KEY (category_id) REFERENCES category1 (cid) # 添加约束
);
​
# 添加商品数据
# Cannot add or update a child row: a foreign key constraint fails (`bigdata_db`.`products`, CONSTRAINT `products_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `category1` (`cid`))
# 当前我们想要插入商品信息时,由于外键绑定的关系,我们没有添加对应id的类别,不能进行添加
# 如果外键的值为null则不校验主表中的主键id
# 结论:从表中添加的外键的值,一定要在主表中的id里存在,否则就会报错,当然可以插入null 此时不对主表校验.
# INSERT INTO products VALUES (1, '服装', 15, 1);
INSERT INTO products VALUES (1, '服装', 15, NULL);
​
# 如果想要添加从表数据,先添加主表相对应的id的内容
INSERT INTO category1 VALUES (1, '服装');
# 在主表中存在该id后可以添加从表信息
INSERT INTO products VALUES (2, '风衣', 150, 1);
​
# 删除主表数据  id为1的类别
# [23000][1451] Cannot delete or update a parent row: a foreign key constraint fails (`bigdata_db`.`products`, CONSTRAINT `products_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `category1` (`cid`))
# 为了保证数据的完整性,如果当前主表中的数据已经被从表引用,则主表中的该数据无法被删除
# DELETE FROM category1 WHERE cid = 1;
# 所以我们需要先删除从表中的信息
DELETE FROM products WHERE pid = 2;
# 再删除主表中的信息
DELETE FROM category1 WHERE cid = 1;

26、多表查询

  • 内连接:交集,在查询过程中,保留左右两侧共有的记录

  • 左连接:差集,在查询过程中,保留左侧表全部数据,以及右侧表可以匹配到左表的数据

  • 右连接:差集,在查询过程中,保留右侧表全部数据,以及左侧表可以匹配到右侧表的数据

# 创建hero表
CREATE TABLE hero
(
hid   INT PRIMARY KEY,
hname VARCHAR(255),
kongfu_id INT
);
# 创建kongfu表
CREATE TABLE kongfu
(
kid     INT PRIMARY KEY,
kname   VARCHAR(255)
);
​
INSERT INTO hero VALUES(1, '鸠摩智', 9),(3, '乔峰', 1),(4, '虚竹', 4),(5, '段誉', 12);
​
INSERT INTO kongfu VALUES(1, '降龙十八掌'),(2, '乾坤大挪移'),(3, '猴子偷桃'),(4, '天山折梅手');
​
# 内连接:交集运算,左表中存在的数据,右表中也存在则被保存
SELECT * FROM hero INNER JOIN kongfu on hero.kongfu_id = kongfu.kid;
# inner可以被省略
SELECT * FROM hero JOIN kongfu on hero.kongfu_id = kongfu.kid;
​
# 左 外链接  左表中所有的数据都被保存下来,右表中只有能够匹配左表的数据被保留
SELECT * FROM hero LEFT OUTER JOIN kongfu ON hero.kongfu_id = kongfu.kid;
# outer 可以被省略
SELECT * FROM hero LEFT JOIN kongfu ON hero.kongfu_id = kongfu.kid;
​
# 右 外连接  右表中所有的数据都被保留下来,左表中只有能够匹配右表的数据被保留
SELECT * FROM hero RIGHT OUTER JOIN kongfu ON hero.kongfu_id = kongfu.kid;
# outer 可以被省略
SELECT * FROM hero RIGHT JOIN kongfu ON hero.kongfu_id = kongfu.kid;
​
# 所有的表,和字段可以其别名,但是如果起了别名,则只能使用别名,不能使用原有的名称
# 以内连接为例
# 字段名称和表名,可以使用as关键字,进行重命名
# 字段名称,重命名后,查询出来的内容的列名将会发生改变
# 表名重命名后,我们可以使用别名调用表中的字段,或者使用表
# 无论是表名还是字段名,起别名后,原来的名称都不能使用了
SELECT h.hname AS hero_name, k.kname  AS kongfu_name FROM hero AS h JOIN kongfu AS k ON h.kongfu_id = k.kid;
# as 可以被省略,但是初学阶段不建议省略,增加可读性,方便日后复习
SELECT h.hname hero_name, k.kname kongfu_name FROM hero h JOIN kongfu k ON h.kongfu_id = k.kid;

27、子查询

  • 子查询就是select中嵌套一个select语句

  • select 查询,可以作为一个值,一个数据序列, 也可以作为一个表出现

  • 子查询可以单独执行,如果子查询单独执行出现报错那放到其他语句中一样会报错

# 子查询:在一个select语句中,嵌套了另外一个一个select语句
# select可以查询出什么?
# 需求:获取所有商品的平均价格
SELECT avg(price) FROM product;  # select 获取的是一个值
​
# 需求:获取所有商品的名称
SELECT pname FROM product;  # select 获取的是一列数据 (或者说一个向量数据)
​
# 需求:获取所有商品的全部信息
SELECT * FROM product; # select 获取的是一个表  (或者说获取的是一个矩阵)
​
# 需求:获取产品价格大于平均价格的所有商品的信息
SELECT * FROM product WHERE price > (SELECT avg(price) FROM product);
​
# 需求: 获取和categroy_id= 1 的商品价格相同的所有商品
# 结构: 获取商品信息  价格  in (类别为1的所有商品的价格)
SELECT * FROM product WHERE price IN (SELECT price FROM product WHERE category_id = 'c001');
​
# 需求: 获取所有的数据,价格大于平均值 且category_id 不等于'c001'(仅了解  不要求掌握)
SELECT * FROM (SELECT * FROM product WHERE category_id != 'c002') AS c WHERE price > (SELECT avg(price) FROM product);

Python爬虫基础-mysql数据库相关推荐

  1. python如何删除mysql数据库_python删除数据mysql数据库连接

    Python学习之旅:访问MySQL数据库 Python学习之旅:访问MySQL数据库 MySQL是Web世界中使用最广泛的数据库服务器.为服务器端设计的数据库,能承受高并发访问. python如何使 ...

  2. python基础代码库-python爬虫基础教程:requests库(二)代码实例

    get请求 简单使用 import requests ''' 想要学习Python?Python学习交流群:973783996满足你的需求,资料都已经上传群文件,可以自行下载! ''' respons ...

  3. python基础知识整理-python爬虫基础知识点整理

    首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 根据我的经验,要学习Python爬虫 ...

  4. python爬虫基础(一)~爬虫概念和架构

    目录 1. 爬虫 1.1 概念 1.2 分类 2. 爬虫架构 2.1 url管理器 2.2 网页(html)下载(download)器 2.2.1 urllib下载html源码 2.2.2 reque ...

  5. 掌握Python爬虫基础,仅需1小时!

    随着互联网的发展,google.百度等搜索引擎让我们获取信息愈加方便.但需求总会不断涌现,纯粹地借助百度等收集信息是远远不够的,因此编写爬虫爬取信息的重要性就越发凸显. 比如有人为了炒股,专门爬取了多 ...

  6. python脚本监控mysql数据库_Python脚本监控mysql数据库,Python脚本监控mongo数据库

    任务:应帅气的领导要求,需要监控生产环境mysql和mongo数据库服务.不仅要connect successful还要进行数据交互进一步确认数据库服务正常. 思路: mysql和mongo 数据库i ...

  7. linux python开发环境sql数据迁移到mysql_linux环境下python怎样操作mysql数据库

    展开全部 linux环境下python怎样操作mysql数据库呢?方法如下: 首先在Linux环境下安装mysql-python 1.下载mysql-python 打开终端: cd /usr/loca ...

  8. python亿级mysql数据库导出_Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法...

    本文实例讲述了python实现将MySQL数据库表中的数据导出生成csv格式文件的方法.分享给大家供大家参考,具体如下: #!/usr/bin/env python # -*- coding:utf- ...

  9. Day2:python爬虫基础学习(大嘘)

    Day2:python爬虫基础学习(大嘘)) 教材&参考: 学习过程 Sublime配置教程 下载&安装 语言(设置中文) 设置字体/配色 配置Python环境 使用python官方编 ...

最新文章

  1. flink source code
  2. 78.Zabbix监控Nginx
  3. 调度流程图_Flink 实现Locality 模式调度
  4. 简单聊一下makefile中的 =, :=, ?=和+=
  5. ThreadLocal和线程同步机制的对比
  6. 通配符?子字符串匹配主字符串次数_leetcode 44 通配符匹配(c++)
  7. @Intercepts-mybatis拦截器
  8. Android自动播放下一曲,环信Android自动播放下一条语音
  9. 2022道路运输企业安全生产管理人员考试模拟100题及模拟考试
  10. x79主板不支持服务器内存条,x79主板支持什么内存
  11. 2018年10月7日虚拟机出现无法连接MKS错误提示和docx, rtf类型文件简介
  12. 微信小程序流量主开通 (如何赚钱)
  13. android 颜色color.xml文件及部分中英文对照
  14. bat实现 自动循环打开谷歌浏览器自动访问网站关闭浏览器功能
  15. python-gitlab
  16. java游戏开发杂谈 - 游戏编程浅析
  17. 解决ubuntu18.04环境下无法调整分辨率的问题
  18. 基于香蕉派平台的Raspberry Pi操作系统安装与配置
  19. 决定了,把以前做过的CF,TC总结都补上来
  20. 喜马拉雅追更攻略:如何订阅更新通知

热门文章

  1. c++ overload 、override、overwrite
  2. 【华为OJ】【067-求最小公倍数】
  3. 老男孩python全栈s21day04作业
  4. Substrate区块链框架学习小组
  5. verilog基础---always
  6. 基于C++实现两个分数的加减法
  7. 网红KOL营销怎么做?如何寻找合适的网红KOL?
  8. 自适应滤波(LMS,RLS)
  9. Java SDK和Java JDK的区别
  10. 电力系统机组组合优化调度(IEEE14节点、IEEE30节点、IEEE118节点)(Matlab代码实现)