数据库SQL学习

Posted jason1999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库SQL学习相关的知识,希望对你有一定的参考价值。

创建和使用数据库

在创建和使用数据库之前,先介绍几个命令

## 该SHOW语句查找服务器上当前存在的数据库:
## 该mysql数据库描述了用户访问权限。该test数据库通常可作为用户工作区尝试的事情了。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
6 rows in set (0.11 sec)
 
## use 命令表示使用指定的 mysql 数据库
mysql> use mysql
Database changed
mysql>

一,创建和选择数据库

## 1. 创建数据库
mysql> create database menagerie;
Query OK, 1 row affected (0.04 sec)

## 删除数据库
mysql> drop database menagerie;

## 注意:如果您收到错误,例如ERROR 1044(42000):在尝试创建数据库时,用户'micah'@'localhost'拒绝访问数据库'menagerie',这意味着您的用户帐户没有必要的权限。
 
## 2. 选择数据库,创建数据库时并不会选择它使用; 你必须明确地说明使用当前数据库,请使用以下语句:
mysql> use menagerie
Database changed
 
## 3. 进入数据库同时,选择使用指定数据库
C:\Users\zjy\Desktop $>mysql -uroot -p menagerie
Enter password: ******
 
## 4. 执行完3之后,你可以通过 select database(),确认是否已经使用制定数据库
mysql> select database();
+------------+
| database() |
+------------+
| menagerie  |
+------------+
1 row in set (0.00 sec)

二,创建表

创建数据库之后,我们可以看看它里面有什么

## 该menagerie数据库是空的集合
mysql> show tables;
Empty set (0.02 sec)

更难的部分是决定数据库的结构应该是什么:您需要哪些表以及每个表中应该包含哪些列。

您想要一张包含每只宠物记录的表格。这可以称为pet表格,它应该包含每个动物名称的最低限度。因为名称本身不是很有趣,所以该表应包含其他信息。例如,如果您家中有多个人饲养宠物,您可能需要列出每只动物的主人。您可能还想记录一些基本的描述性信息,如物种和性别。

年龄怎么样?这可能是有意义的,但存储在数据库中并不是一件好事。随着时间的推移,年龄会发生变化,这意味着您必须经常更新记录。相反,最好存储固定值,如出生日期。然后,无论何时需要年龄,您都可以将其计算为当前日期和出生日期之间的差异.MySQL提供了进行日期算术的功能,因此这并不困难。存储出生日期而不是年龄也有其他优点:

  • 您可以使用数据库执行任务,例如为即将到来的宠物生日生成提醒(如果您认为这种类型的查询有些愚蠢,请注意,您可能会在业务数据库的上下文中询问相同的问题,以确定您需要在当前一周或一个月内向其发送生日祝福的客户,计算机辅助个人触摸。)
  • 您可以计算与当前日期以外的日期相关的年龄。例如,如果您将死亡日期存储在数据库中,则可以轻松计算宠物死亡时的年龄。

您可能会想到在pet表格中有用的其他类型的信息,但到目前为止确定的信息是足够的:名称,所有者,物种,性别,出生和死亡。

可以使用创建表指定表的布局,对于名称来说,名称,所有者,种三列的值的长度是不尽相同的,我们使用可变长度的字符VARCHAR,的性别性别可以使用单个字符‘m‘状语从句:? ‘f‘,或者可能‘male‘和? ‘female‘。最简单的是使用单个字符‘m‘和‘f‘;对于birth和death?列使用date数据类型是一个相当明显的选择。

mysql> create table pet (name varchar(20),owner varchar(20),
    -> species varchar(20), sex char(1), birth date, death date);
Query OK, 0 rows affected (0.26 sec)

让我们来看看创建表之后的数据库

mysql> show tables;
+---------------------+
| Tables_in_menagerie |
+---------------------+
| pet                 |
+---------------------+
1 row in set (0.00 sec)

你可能不太满意,我希望看到更详细的表结构,验证表是否按预期方式创建,使用以下描述语句:

mysql> describe pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| owner   | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
| sex     | char(1)     | YES  |     | NULL    |       |
| birth   | date        | YES  |     | NULL    |       |
| death   | date        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

如果你忘记了表中列的名称或它们具有的类型,使用可以该 描述 命令

三,将数据加载到表中

创建表后,可以你用该 LOAD DATA状语从句:INSERT语句将数据填充到表中。
假设您的宠物记录可以如下所示进行描述。(注意MySQL期望‘YYYY-MM-DD‘格式的日期;这可能与你习惯的不同。),

pet.txt文件格式
每一项之间用Tab键进行分隔,如果该字段为NULL,则用\N表示。

Fluffy  Harol   cat     f   1993-02-04      2019-10-06  \N
Kifu    Hadon   dag     m   1998-03-04      2019-10-06  \N
Piger   Wang    bird    f   2003-05-01      2019-10-06  \N
Yao     Meng    nake    m   2008-02-04      2019-10-06  \N
Du      Tian    pig     f   1999-02-04      2019-10-06  \N
Zhang   Jinrui  bird    m   1998-02-04      2019-10-06  \N
  • 1.创建表 create table pet();

  • 2.写一个用于导入的文本文件 ==每一项之间用Tab键进行分隔,如果该字段为NULL,则用\N表示。==
  • 3.导入数据 输入命令,进行导入。
load data local infile “d:/pet.txt”
into table pet;
或
load data local infile “d:/pet.txt”
into table pet( , , , , , ,);

1. LOAD DATA方式载入文件数据

使用这种方式,你首先需要创建一个文件,如per.txt,将导入表格的数据写在一个该文件中,每行包含一个记录,其值由制表符分隔,并按照CREATE TABLE语句中列出的顺序给出。对于缺失值(例如未知性别或仍然生活的动物的死亡日期),你可以使用NULL?值。要在文本文件中表示? NULL?值,请使用? \N(反斜杠,大写-N)。下面给出一个例子:

Fluffy    Harold    cat    f    1993-02-04    \N

字幕:要将文件加载pet.txt到  pet表中,请使用以下语句:

mysql> load data local infile "D:/pet.txt" into table pet;

如果出现这个版本的数据库不支持该命令,这是因为安装的MySQL数据库时,系统自动设置本地INFILE的值为假,这么做的目的是为了防止别人恶意进行数据注入,攻击数据库,所以一般线上数据库都会关闭该load data local语句功能:

mysql> load data local infile "D:/pet.txt" into table pet;
ERROR 1148 (42000): The used command is not allowed with this MySQL version
mysql>

解决方法

2. INSERT方式,插入数据记录

mysql> insert into pet
    -> values ('Puffball','Diane','hamster','f','1999-03-30',NULL);
Query OK, 1 row affected (0.00 sec)

四,从表中检索信息

SELECT 语句用于从表中提取信息。声明的一般形式是:

SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy;
  • what_to_select 表示想要看到的内容(可以是列名或者* ,* 代表所有列);
  • which_table 表示要从哪一个表检索数据;
  • where条件是可选的。如果存在,则 conditions_to_satisfy 指定行必须满足的一个或多个条件才有资格进行检索。

一、检索所有数据

mysql> select * from pet;
+----------+--------+---------+------+------------+------------+
| name     | owner  | species | sex  | birth      | death      |
+----------+--------+---------+------+------------+------------+
| Fluffy   | Harold | cat     | f    | 1993-02-04 | 0000-00-00 |
| Claws    | Gwen   | cat     | m    | 1994-03-17 | 0000-00-00 |
| Buffy    | Harold | dog     | f    | 1989-05-13 | 0000-00-00 |
| Fang     | Benny  | dog     | m    | 1990-08-27 | 0000-00-00 |
| Bowser   | Diane  | dog     | m    | 1979-08-31 | 1995-07-29 |
| Chirpy   | Gwen   | bird    | f    | 1998-09-11 | 0000-00-00 |
| Whistler | Gwen   | bird    | NULL | 1997-12-09 | 0000-00-00 |
| Slim     | Benny  | snake   | m    | 1996-04-29 | 0000-00-00 |
| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
+----------+--------+---------+------+------------+------------+
9 rows in set (0.00 sec)
 
## 修改指定的一条记录的一个字段值
mysql> update pet
    -> set birth = '1989-08-31'
    -> where name = 'Bowser';
Query OK, 1 row affected (0.07 sec)
Rows matched: 1  Changed: 1  Warnings: 0
 
## 查询是否更改成功,可以看到,生日更改了
mysql> select * from pet where name = 'Bowser';
+--------+-------+---------+------+------------+------------+
| name   | owner | species | sex  | birth      | death      |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
1 row in set (0.00 sec)

二、检索特定行数据

mysql>  SELECT * 
        FROM pet 
        WHERE name = 'Bowser';
+--------+-------+---------+------+------------+------------+
| name   | owner | species | sex  | birth      | death      |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+

==字符串比较通常不区分大小写,因此您可以将名称指定为‘bowser‘, ‘BOWSER‘等等。查询结果是一样的。==

## 你可以在任何列上指定条件,而不仅仅是?name。例如,如果您想知道1998年或之后出生的动物:
mysql> select * from pet where birth>='1998-1-1';
+----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Puffball | Diane | hamster | f    | 1999-03-30 | NULL  |
+----------+-------+---------+------+------------+-------+
## 结合条件来定位雌性狗:
mysql> select * from pet where species='dog' and sex='f';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+
## 前面的查询使用 AND 逻辑运算符。还有一个 OR 运算符:
mysql> select * from pet where (species='cat' and sex='m')
    -> or (species='dog' and sex='f');
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

注: AND并且 OR可以混合,但 AND优先级高于 OR。如果您同时使用这两个运算符,最好使用括号明确指出条件应如何分组。

三、检索特定列数据

## 只查看 name, birth
mysql> SELECT name, birth FROM pet;
+----------+------------+
| name     | birth      |
+----------+------------+
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Buffy    | 1989-05-13 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+
 
## 要找出谁拥有宠物,请使用此查询:
mysql> SELECT owner FROM pet;
+--------+
| owner  |
+--------+
| Harold |
| Gwen   |
| Harold |
| Benny  |
| Diane  |
| Gwen   |
| Gwen   |
| Benny  |
| Diane  |
+--------+
 
## 上面的查询有重复的记录,要最小化输出,可以通过添加关键字 DISTINCT 检索每个唯一的输出记录
mysql> SELECT DISTINCT owner FROM pet;
+--------+
| owner  |
+--------+
| Benny  |
| Diane  |
| Gwen   |
| Harold |
+--------+
 
## 可以使用WHERE子句将行选择与列选择组合在一起。
mysql> SELECT name, species, birth FROM pet
    -> WHERE species = 'dog' OR species = 'cat';
+--------+---------+------------+
| name   | species | birth      |
+--------+---------+------------+
| Fluffy | cat     | 1993-02-04 |
| Claws  | cat     | 1994-03-17 |
| Buffy  | dog     | 1989-05-13 |
| Fang   | dog     | 1990-08-27 |
| Bowser | dog     | 1989-08-31 |
+--------+---------+------------+
 
## where species in ('dog','cat');
mysql> SELECT NAME, species, birth FROM pet 
    -> WHERE species IN ('dog','cat');
+--------+---------+------------+
| name   | species | birth      |
+--------+---------+------------+
| Fluffy | cat     | 1993-02-04 |
| Claws  | cat     | 1994-03-17 |
| Buffy  | dog     | 1989-05-13 |
| Fang   | dog     | 1990-08-27 |
| Bowser | dog     | 1989-08-31 |
+--------+---------+------------+

四、排序行数据

## 这是动物的生日,按日期排序:
mysql> SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name     | birth      |
+----------+------------+
| Buffy    | 1989-05-13 |
| Bowser   | 1989-08-31 |
| Fang     | 1990-08-27 |
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Slim     | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy   | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+
 
## 默认排序顺序为升序,首先是最小值。要按反向(降序)顺序排序,请将DESC关键字添加到要排序 的列的名称:
mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
+----------+------------+
| name     | birth      |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Claws    | 1994-03-17 |
| Fluffy   | 1993-02-04 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Buffy    | 1989-05-13 |
+----------+------------+
 
## 您可以对多个列进行排序,并且可以按不同方向对不同列进行排序。例如,要按动物类型按升序排序,然后按动物类型中的出生日期按降序排序(最年轻的动物首先),请使用以下查询:
mysql> SELECT name, species, birth FROM pet
    -> ORDER BY species, birth DESC;
+----------+---------+------------+
| name     | species | birth      |
+----------+---------+------------+
| Chirpy   | bird    | 1998-09-11 |
| Whistler | bird    | 1997-12-09 |
| Claws    | cat     | 1994-03-17 |
| Fluffy   | cat     | 1993-02-04 |
| Fang     | dog     | 1990-08-27 |
| Bowser   | dog     | 1989-08-31 |
| Buffy    | dog     | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim     | snake   | 1996-04-29 |
+----------+---------+------------+
## 上面的 DESC 关键字仅适用于紧邻其前面的列名(birth); 它不会影响species列排序顺序。

五、日期计算

MySQL提供了几个可用于执行日期计算的函数,例如,计算年龄或提取日期的部分。
要确定每只宠物的年龄,请使用此?TIMESTAMPDIFF()功能。它的参数是您希望表达结果的单位,以及两个可以区分的日期(出生日期,现今日期)。以下查询显示每只宠物的出生日期,当前日期和年龄。一个?别名(age)是用来使得最终输出的列标签更有意义。

mysql> select name,birth,curdate(),
    -> timestampdiff(year,birth,curdate()) as age
    -> from pet;
+----------+------------+------------+------+
| name     | birth      | curdate()  | age  |
+----------+------------+------------+------+
| Fluffy   | 1993-02-04 | 2018-08-13 |   25 |
| Claws    | 1994-03-17 | 2018-08-13 |   24 |
| Buffy    | 1989-05-13 | 2018-08-13 |   29 |
| Fang     | 1990-08-27 | 2018-08-13 |   27 |
| Bowser   | 1989-08-31 | 2018-08-13 |   28 |
| Chirpy   | 1998-09-11 | 2018-08-13 |   19 |
| Whistler | 1997-12-09 | 2018-08-13 |   20 |
| Slim     | 1996-04-29 | 2018-08-13 |   22 |
| Puffball | 1999-03-30 | 2018-08-13 |   19 |
+----------+------------+------------+------+
9 rows in set (0.01 sec)
 
## 查询有效,但如果以某种顺序显示行,则可以更轻松地扫描结果。
## 这可以通过添加一个ORDER BY name子句来按名称对输出进行排序来完成:
mysql> select name,birth,curdate(),
    -> timestampdiff(year,birth,curdate()) as age
    -> from pet order by name;
+----------+------------+------------+------+
| name     | birth      | curdate()  | age  |
+----------+------------+------------+------+
| Bowser   | 1989-08-31 | 2018-08-13 |   28 |
| Buffy    | 1989-05-13 | 2018-08-13 |   29 |
| Chirpy   | 1998-09-11 | 2018-08-13 |   19 |
| Claws    | 1994-03-17 | 2018-08-13 |   24 |
| Fang     | 1990-08-27 | 2018-08-13 |   27 |
| Fluffy   | 1993-02-04 | 2018-08-13 |   25 |
| Puffball | 1999-03-30 | 2018-08-13 |   19 |
| Slim     | 1996-04-29 | 2018-08-13 |   22 |
| Whistler | 1997-12-09 | 2018-08-13 |   20 |
+----------+------------+------------+------+
9 rows in set (0.00 sec)
 
## 以上结果可以通过 order by age 子句来排序
 
## 类似的查询可用于确定死亡动物的死亡年龄。可以通过检查death值 是否为NULL。然后,对于那些具有非NULL值的人,计算death和 birth值之间的差值:
mysql> select name,birth,death,
    -> timestampdiff(year,birth,death) as age
    -> from pet where death is not null order by age;
+--------+------------+------------+------+
| name   | birth      | death      | age  |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 |    5 |
+--------+------------+------------+------+
1 row in set (0.00 sec)
## 此处查询使用death IS NOT NULL而不是death <> NULL因为 NULL是一个特殊值,无法使用通常的比较运算符进行比较。
## <> 代表不等于 ,<=> 代表等于
 
## 如果你想知道哪些动物下个月有生日怎么办?对于这种类型的计算,年和日是无关紧要的; 
## 您只想提取birth列的月份部分 。MySQL提供了用于提取日期的部分,如一些功能 YEAR(), 
## MONTH()和 DAYOFMONTH()。 MONTH()可用于提取月份。
mysql> select name,birth,month(birth) as birthMonth
    -> from pet
    -> where month(birth)<=>month(curdate());
+--------+------------+------------+
| name   | birth      | birthMonth |
+--------+------------+------------+
| Fang   | 1990-08-27 |          8 |
| Bowser | 1989-08-31 |          8 |
+--------+------------+------------+
2 rows in set (0.00 sec)
 
## 如果当前月份是12月,则会出现一个小的复杂情况。你不能只在月份数字(12)中添加一个并查找月份出生的动物 13,因为没有这样的月份。相反,你寻找1月(月1)出生的动物 。
 
## 您可以编写查询,以便无论当前月份是什么,它都可以工作,因此您不必使用特定月份的数字。 DATE_ADD()使您可以将时间间隔添加到给定日期。如果您将值添加一个月CURDATE(),然后使用,则提取月份部分MONTH(),结果将生成查找生日的月份:
 
mysql> SELECT name, birth FROM pet
    -> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
 
## 完成相同任务的另一种方法是1在使用modulo函数(MOD)将月值包装0为当前值之后,添加1, 以获取当前后一个月:
 
mysql> SELECT name, birth FROM pet
    -> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
 
## MONTH()返回1和12之间的数字。并 MOD(something,12)在0和11之间返回一个数字。所以添加1,必须在MOD()之后 .
 

今天就先到这了,有关SQL相关内容在一下链接

1安装及连接和断开服务器
2输入查询
3创建和使用数据库
4从表中检索信息
5获取有关数据库和表的信息
6在批处理模式下使用mysql
7常见查询示例

以上是关于数据库SQL学习的主要内容,如果未能解决你的问题,请参考以下文章

SQL学习入门 概述

SQL 学习1 初级(转)

sql语句好用的sql语句之项目数据库学习总结

学习总结SQL的学习-2-sql操作

学习总结SQL学习总结之认识SQL

SQL注入学习整理