【跟着官网学技术系列之MySQL】第8天之创建和使用数据库2

Scroll Down

前言

在当今信息爆炸的时代,拥有信息检索的能力很重要。
作为一名软件工程师,遇到问题,你会怎么办?带着问题去搜索引擎寻找答案?亦或是去技术官网,技术社区去寻找?
根据个人经验,一般遇到问题,基本搜索引擎都可以解决(抱着:我遇到的问题肯定别人也遇到过的心态去解决)
实在解决不了的,逛逛技术官网、社区,一般也可以解决!
以上解决问题的方法屡试不爽!

从今天开始,进军MySQL官网,跟着官网学MySQL!

今天要学习的章节是:Creating and Using a Database (创建和使用数据库2)

Creating and Using a Database (创建和使用数据库)

Retrieving Information from a Table (从表中检索信息)

从表中检索信息

数据准备(放在桌面Desktop文件夹下,或者其他本地路径)

  • pet.txt
Fluffy	Harold	cat	f	1993-02-04
Claws	Gwen	cat	m	1994-03-17
Buffy	Harold	dog	f	1989-05-13
Fang	Benny	dog	m	1990-08-27
Bowser	Diane	dog	m	1979-08-31	1995-07-29
Chirpy	Gwen	bird	f	1998-09-11
Whistler	Gwen	bird		1997-12-09
Slim	Benny	snake	m	1996-04-29
  • pet1.csv
Fluffy,Harold,cat,f,1993-02-04,
Claws,Gwen,cat,m,1994-03-17,
Buffy,Harold,dog,f,1989-05-13,
Fang,Benny,dog,m,1990-08-27,
Bowser,Diane,dog,m,1979-08-31,1995-07-29
Chirpy,Gwen,bird,f,1998-09-11,
Whistler,Gwen,bird,,1997-12-09,
Slim,Benny,snake,m,1996-04-29,

  • event.txt
Fluffy	1995-05-15	litter	4 kittens, 3 female, 1 male
Buffy	1993-06-23	litter	5 puppies, 2 female, 3 male
Buffy	1994-06-19	litter	3 puppies, 3 female
Chirpy	1999-03-21	vet	needed beak straightened
Slim	1997-08-03	vet	broken rib
Bowser	1991-10-12	kennel
Fang	1991-10-12	kennel
Fang	1998-08-28	birthday	Gave him a new chew toy
Claws	1998-03-17	birthday	Gave him a new flea collar
Whistler	1998-12-09	birthday	First birthday

Selecting All Data(选择所有数据)

  • 官网截图
    选择所有数据-官网截图1
    选择所有数据-官网截图2
  • 实操截图
    选择所有数据-实操截图.png
  • sql脚本
SELECT * FROM pet;

DELETE FROM pet;
LOAD DATA LOCAL INFILE '/localPath/pet.txt' INTO TABLE pet;

UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';

Selecting Particular Rows(选择特定行)

  • 官网截图
    选择特定行-官网截图1
    选择特定行-官网截图2
  • 实操截图
    选择特定行-实操截图
  • sql脚本
 SELECT * FROM pet WHERE name = 'Bowser';
 
 SELECT * FROM pet WHERE birth >= '1998-1-1';
 
 SELECT * FROM pet WHERE species = 'dog' AND sex = 'f';
 
 SELECT * FROM pet WHERE species = 'snake' OR species = 'bird';
 
 SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm')
       OR (species = 'dog' AND sex = 'f');

Selecting Particular Columns(选择特定列)

  • 官网截图
    选择特定列-官网截图1
    选择特定列-官网截图2
  • 实操截图
    选择特定列-实操截图
  • sql脚本
SELECT name, birth FROM pet;

SELECT owner FROM pet;

SELECT DISTINCT owner FROM pet;

SELECT name, species, birth FROM pet
       WHERE species = 'dog' OR species = 'cat';

Sorting Rows(对行进行排序)

  • 官网截图
    对行进行排序-官网截图1
    对行进行排序-官网截图2
    对行进行排序-官网截图3
  • 实操截图
    对行进行排序-实操截图
  • sql脚本
SELECT name, birth FROM pet ORDER BY birth;

SELECT name, birth FROM pet ORDER BY birth DESC;

SELECT name, species, birth FROM pet
       ORDER BY species, birth DESC;
       

Date Calculations(日期计算)

  • 官网截图
    日期计算-官网截图1
    日期计算-官网截图2
    日期计算-官网截图3
    日期计算-官网截图4
    日期计算-官网截图5
    日期计算-官网截图6
  • 实操截图
    日期计算-实操截图1
    日期计算-实操截图2
    日期计算-实操截图3
  • sql脚本
SELECT name, birth, CURDATE(),
       TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
       FROM pet;
 
SELECT name, birth, CURDATE(),
     TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
     FROM pet ORDER BY name;

SELECT name, birth, CURDATE(),
       TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
       FROM pet ORDER BY age;
       
SELECT name, birth, death,
       TIMESTAMPDIFF(YEAR,birth,death) AS age
       FROM pet WHERE death IS NOT NULL ORDER BY age;
       
SELECT name, birth, MONTH(birth) FROM pet;

SELECT name, birth FROM pet WHERE MONTH(birth) = 5;

SELECT name, birth FROM pet
       WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
       
SELECT name, birth FROM pet
       WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
       
SELECT '2018-10-31' + INTERVAL 1 DAY;
SELECT '2018-10-32' + INTERVAL 1 DAY;
SHOW WARNINGS;

Working with NULL Values(使用NULL值)

  • 官网截图
    使用NULL值-官网截图1
    使用NULL值-官网截图2
  • 实操截图
    使用NULL值-实操截图
  • sql脚本
SELECT 1 IS NULL, 1 IS NOT NULL;

SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;

SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL;

Pattern Matching(模式匹配)

  • 官网截图
    模式匹配-官网截图1
    模式匹配-官网截图2
    模式匹配-官网截图3
    模式匹配-官网截图4
    模式匹配-官网截图5
  • 实操截图
    模式匹配-实操截图1
    模式匹配-实操截图2
  • sql脚本
SELECT * FROM pet WHERE name LIKE 'b%';

SELECT * FROM pet WHERE name LIKE '%fy';

SELECT * FROM pet WHERE name LIKE '%w%';

SELECT * FROM pet WHERE name LIKE '_____';

SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b');

SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b' COLLATE utf8mb4_0900_as_cs);
SELECT * FROM pet WHERE REGEXP_LIKE(name, BINARY '^b');
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b', 'c');

SELECT * FROM pet WHERE REGEXP_LIKE(name, 'fy$');

SELECT * FROM pet WHERE REGEXP_LIKE(name, 'w');

SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.....$');

SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.{5}$');

Counting Rows(计算行数)

  • 官网截图
    计算行数-官网截图1
    计算行数-官网截图2
    计算行数-官网截图3
    计算行数-官网截图4
    计算行数-官网截图5
  • 实操截图
    计算行数-实操截图1
    计算行数-实操截图2
  • sql脚本
SELECT COUNT(*) FROM pet;

SELECT owner, COUNT(*) FROM pet GROUP BY owner;

SELECT species, COUNT(*) FROM pet GROUP BY species;

SELECT sex, COUNT(*) FROM pet GROUP BY sex;

SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
 
SELECT species, sex, COUNT(*) FROM pet
       WHERE species = 'dog' OR species = 'cat'
       GROUP BY species, sex;
       
SELECT species, sex, COUNT(*) FROM pet
     WHERE sex IS NOT NULL
     GROUP BY species, sex;
     
SET sql_mode = 'ONLY_FULL_GROUP_BY';
SELECT owner, COUNT(*) FROM pet;

SET sql_mode = '';
SELECT owner, COUNT(*) FROM pet;

Using More Than one Table(使用多个表)

  • 官网截图
    使用多个表-官网截图1
    使用多个表-官网截图2
    使用多个表-官网截图3
  • 实操截图
    使用多个表-实操截图
  • sql脚本
CREATE TABLE event (name VARCHAR(20), date DATE,
       type VARCHAR(15), remark VARCHAR(255));
       
LOAD DATA LOCAL INFILE '/localPath/event.txt' INTO TABLE event;

SELECT pet.name,
       TIMESTAMPDIFF(YEAR,birth,date) AS age,
       remark
       FROM pet INNER JOIN event
         ON pet.name = event.name
       WHERE event.type = 'litter';
       
SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
       FROM pet AS p1 INNER JOIN pet AS p2
         ON p1.species = p2.species
         AND p1.sex = 'f' AND p1.death IS NULL
         AND p2.sex = 'm' AND p2.death IS NULL;

本章关键知识点总结

Selecting All Data(选择所有数据)

  • 查询万能框架:SELECT what_to_select FROM which_table WHERE conditions_to_satisfy;
  • 查询所有列 select * from table_nme;
  • 删除表中所有数据 delete from table_name;
  • 加载本地文件到mysql表中:LOAD DATA LOCAL INFILE ‘/localPath/pet.txt’ INTO TABLE table_name
  • 更新数据:update table_name set column_name = ‘newValue’ where column_name = ‘oldvValue’;

Selecting Particular Rows(选择特定行)

  • 查询特定行(等于):SELECT * FROM table_name WHERE column_name = ‘value’;
  • 查询特定行(大于等于):SELECT * FROM table_name WHERE column_name >= ‘value’;
  • 查询特定行(多条件与):SELECT * FROM table_name WHERE column_name1 = ‘value’ AND column_name2 = ‘value’;
  • 查询特定行(多条件或):SELECT * FROM table_name WHERE column_name1 = ‘value’ OR column_name2 = ‘value’;
  • 查询特定行(多条件与/或):SELECT * FROM table_name WHERE (column_name1 = ‘value1’ AND column_name2 = ‘value2’) OR (column_name1 = ‘value3’ AND column_name2 = ‘value4’);
  • 逻辑运算符AND和 OR可以混合使用,但 AND优先级高于 OR。如果同时使用这两个运算符,最好使用括号明确指示应如何对条件进行分组:

Selecting Particular Columns(选择特定列)

  • 查询特定列(多列):SELECT column_name1, column_name2 FROM table_name;
  • 查询特定列(一列):SELECT column_name FROM table_name;
  • 查询特定列(去重):SELECT DISTINCT column_name FROM table_name;
  • 查询特定列(多列,多条件):SELECT column_name1, column_name2, column_name3 FROM table_name WHERE column_name1 = ‘value1’ OR column_name1 = ‘value2’;

Sorting Rows(对行进行排序)

  • order by默认是升序的asc(不显式指定就是升序),desc代表降序
  • 查询多列根据单列排序:SELECT column_name1, column_name2 FROM table_name ORDER BY column_name1;
  • 查询多列根据单列降序排序:SELECT column_name1, column_name2 FROM table_name ORDER BY column_name1 desc;
  • 查询多列根据多列排序(且每列排序规则不同):SELECT column_name1, column_name2 FROM table_name ORDER BY column_name1, column_name2 desc;

Date Calculations(日期计算)

  • curdate():返回当前日期
  • timestampdiff():返回两个日期之间的差值
  • is null与is not null判断
  • month():返回日期的月份
  • year():返回日期的年份
  • dayofmonth():返回日期的天数
  • date_add():日期加法
  • interval:时间间隔
  • mod():取模
  • 日期直接加1天:select ‘2018-10-31’ + interval 1 day;

Working with NULL Values(使用NULL值)

  • null值的判断:a IS NULL, a IS NOT NULL;
  • null容易使代码抛出空指针异常

Pattern Matching(模式匹配)

  • 以x开头:like ‘x%’
  • 以xy结尾:like ‘%xy’
  • 包含x的:like ‘%x%’
  • 包含N个字符(N个就是N个_):like ‘_____’
  • regexp_like():正则表达式匹配
    • 以x开头的:REGEXP_LIKE(name, ‘^x’);
    • 匹配x开头的(区分大小写):
      • REGEXP_LIKE(name, ‘^x’ COLLATE utf8mb4_0900_as_cs);
      • REGEXP_LIKE(name, BINARY ‘^x’);
      • REGEXP_LIKE(name, ‘^x’, ‘c’);
    • 匹配以xy结尾的:REGEXP_LIKE(name, ‘xy$’);
    • 包含x的:REGEXP_LIKE(name, ‘x’);
    • 恰好包含N个字符的(N是几就几个.):REGEXP_LIKE(name, ‘^…$’);
      • 高级写法:REGEXP_LIKE(name, ‘^.{5}$’);

Counting Rows(计算行数)

  • 查询表所有行:count(*)
  • 单列分组后查询所有行:select column_name,count(*) from table_name group by column_name;
  • 多列分组查询行数:select column_name1, column_name2, count(*) from table_name group by column_name1, column_name2;
  • 多列分组加过滤查询行数:select column_name1, column_name2, count(*) from table_name where column_name1 = ‘value1’ or column_name1 = ‘value2’ group by column_name1, column_name2;
  • sql_mode = ‘ONLY_FULL_GROUP_BY’:严格模式,group by后必须select的列都要在group by后面
  • sql_mode = ‘’:宽松模式,不一定得有group by

Using More Than one Table(使用多个表)

  • 创建表:create table table_name(column_name1 type1, column_name2 type2);
  • 加载数据到表:LOAD DATA LOCAL INFILE ‘/localPath/event.txt’ INTO TABLE event;
  • 内连接:inner join
  • 别名:as

本章遇到问题

1.mysql导入csv,结果null值变为了0000-00-00
查询sql_mode_mode:
select @@sql_mode;
select @@global.sql_mode;
select @@session.sql_mode;
mysql的0000-00-00是一个主题,属于无效值,和null不同
解决:set sql_mode=''即可(主要是把No_zero_date去掉)

2.mysql导入csv,只导入了第一行
LOAD DATA local INFILE ‘/Users/xxx/Desktop/pet.csv’ INTO TABLE pet
FIELDS TERMINATED BY ‘,’ #分隔符
LINES TERMINATED BY ‘\n’#换行
解决:加上ENCLOSED BY ‘"’ #结尾符
核心在于:ENCLOSED BY ‘"’ #结尾符,别的文档对这个字段的解释不是很明确,
看来以后所有命令,每一个参数都要搞清楚哦

3.SELECT * FROM pet WHERE REGEXP_LIKE(name, BINARY ‘^b’); 报错
ERROR 3995 (HY000): Character set ‘utf8mb4_0900_ai_ci’ cannot be used in conjunction with ‘binary’ in call to regexp_like.
解决:SELECT * FROM pet WHERE REGEXP_LIKE(cast(name as binary), BINARY ‘^b’)

参考手册

MySQL8.4参考手册