数据库之mysql的基本操作

1 数据库

1.1 数据库介绍

为什么要有数据库?

数据需要大量的存储,把数据永久保存下来,可以保存到文件中,当然也可以保存到数据库中。

数据库:通俗的说,存储数据的仓库,是管理数据的文件夹;存放数据的仓库,只不过这个仓库是在计算机存储设备上,而且数据是按一定的格式存放的,是长期存放在计算机内、有组织、可共享的数据即可,数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性。

数据库管理软件:

       mysql            开源、免费

       oracle           企业级数据库管理软件

       sqlserver      图形化界面、更加简单、直观

       db2               最适于海量数据处理

1.2 mysql数据库服务端和客户端

mysql包括两部分 :

服务端: mysqld

客户端: 通常有cmd  php  python;mysql客户端有很多对其进行友好的支持。

1.3 sql语句规范

SQL是专门为数据库而建立的操作命令集,是一种功能齐全的数据库语言。

SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持sql。

1.在数据库系统中,SQL语句不区分大小写(建议用大写) 。但字符串常量区分大小写。建议命令大写,表名库名小写;

2.SQL语句可单行或多行书写,以“;”结尾。关键词不能跨多行或简写。

3.用空格和缩进来提高语句的可读性。子句通常位于独立行,便于编辑,提高可读性。

4.注释:单行注释:--    多行注释:/*......*/

5.sql语句可以折行操作

2 数据库操作

1.创建数据库(在磁盘上创建一个对应的文件夹)

create database [if not exists] db_name [character set ***]

mysql> create database if not exists db_test character set utf8;
Query OK, 1 row affected (0.00 sec)

2.查看数据库

  show databases;                 查看所有数据库

  show create database db_name;   查看数据库的创建方式


mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db_test | | mysql | | performance_schema | +--------------------+ 5 rows in set (0.00 sec) mysql> show create database db_test; +----------+------------------------------------------------------------------+ | Database | Create Database | +----------+------------------------------------------------------------------+ | db_test | CREATE DATABASE `db_test` /*!40100 DEFAULT CHARACTER SET utf8 */ | +----------+------------------------------------------------------------------+ 1 row in set (0.00 sec)

3.修改数据库

       修改数据库,只是修改数据库的字符集;不能修改数据库的名字,暂时不支持数据库改名字;

       如果真想改名字,去文件夹下改名字;

       修改数据库的名字,没有意义;建议不要修改数据库的名字;

       修改数据库的字符集,例如:

alter database db_name [character set xxx]

mysql> alter database db_test character set latin1;

Query OK, 1 row affected (0.00 sec)


mysql> show create database db_test;

+----------+--------------------------------------------------------------------+

| Database | Create Database                                                    |

+----------+--------------------------------------------------------------------+

| db_test  | CREATE DATABASE `db_test` /*!40100 DEFAULT CHARACTER SET latin1 */ |

+----------+--------------------------------------------------------------------+

1 row in set (0.00 sec)

4.删除数据库

drop database [if exists] db_name;

mysql> drop database db_test;

Query OK, 0 rows affected (0.05 sec)


mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

+--------------------+

4 rows in set (0.00 sec)

5.使用数据库

切换数据库 use db_name;

查看当前使用的数据库 select database();

3 数据表操作

3.1 创建表

语法

CREATE TABLE tab_name(

            field1 type[完整性约束条件],

            field2 type,

            ...

            fieldn type

        )[character set xxx];

示例

mysql> create table employee(

    ->             id int primary key auto_increment ,

    ->             name varchar(20),

    ->             gender bit default 1,

    ->             birthday date,

    ->             department varchar(20),

    ->             salary double(8,2) unsigned,

    ->             resume text

    ->           );

Query OK, 0 rows affected (0.05 sec)

3.2 查看表

desc tab_name                              查看表结构

show columns from tab_name       查看表结构

show tables                                   查看当前数据库中的所有的表

show create table tab_name         查看当前数据库表建表语句

mysql> desc employee;

+------------+----------------------+------+-----+---------+----------------+

| Field      | Type                 | Null | Key | Default | Extra          |

+------------+----------------------+------+-----+---------+----------------+

| id         | int(11)              | NO   | PRI | NULL    | auto_increment |

| name       | varchar(20)          | YES  |     | NULL    |                |

| gender     | bit(1)               | YES  |     | b'1'    |                |

| birthday   | date                 | YES  |     | NULL    |                |

| department | varchar(20)          | YES  |     | NULL    |                |

| salary     | double(8,2) unsigned | YES  |     | NULL    |                |

| resume     | text                 | YES  |     | NULL    |                |

+------------+----------------------+------+-----+---------+----------------+

7 rows in set (0.01 sec)
 

mysql> show columns from employee;

+------------+----------------------+------+-----+---------+----------------+

| Field      | Type                 | Null | Key | Default | Extra          |

+------------+----------------------+------+-----+---------+----------------+

| id         | int(11)              | NO   | PRI | NULL    | auto_increment |

| name       | varchar(20)          | YES  |     | NULL    |                |

| gender     | bit(1)               | YES  |     | b'1'    |                |

| birthday   | date                 | YES  |     | NULL    |                |

| department | varchar(20)          | YES  |     | NULL    |                |

| salary     | double(8,2) unsigned | YES  |     | NULL    |                |

| resume     | text                 | YES  |     | NULL    |                |

+------------+----------------------+------+-----+---------+----------------+

7 rows in set (0.00 sec)


mysql> show tables;

+-------------------+

| Tables_in_db_test |

+-------------------+

| employee          |

+-------------------+

1 row in set (0.00 sec)
 

mysql> show create table employeeG

*************************** 1. row ***************************

       Table: employee

Create Table: CREATE TABLE `employee` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(20) DEFAULT NULL,

  `gender` bit(1) DEFAULT b'1',

  `birthday` date DEFAULT NULL,

  `department` varchar(20) DEFAULT NULL,

  `salary` double(8,2) unsigned DEFAULT NULL,

  `resume` text,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

3.3 修改表结构

1.增加列(字段)

alter table t_name add [column] 列名 类型[完整性约束条件][first|after 字段名];

mysql> alter table t1 add tname varchar(20), add sex varchar(10);

Query OK, 0 rows affected (0.10 sec)

Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t1;

+-------+-------------+------+-----+---------+-------+

| Field | Type        | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| id    | int(11)     | YES  |     | NULL    |       |

| age   | varchar(20) | YES  |     | NULL    |       |

| tname | varchar(20) | YES  |     | NULL    |       |

| sex   | varchar(10) | YES  |     | NULL    |       |

+-------+-------------+------+-----+---------+-------+

4 rows in set (0.01 sec)

2.修改一列类型

alter table t_name modify 列名 类型 [完整性约束条件][first|after 字段名];

mysql> alter table t1 modify sex varchar(5) first;

Query OK, 0 rows affected (0.07 sec)

Records: 0  Duplicates: 0  Warnings: 0


mysql> desc t1;

+-------+-------------+------+-----+---------+-------+

| Field | Type        | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| sex   | varchar(5)  | YES  |     | NULL    |       |

| id    | int(11)     | YES  |     | NULL    |       |

| age   | varchar(20) | YES  |     | NULL    |       |

| tname | varchar(20) | YES  |     | NULL    |       |

+-------+-------------+------+-----+---------+-------+

4 rows in set (0.01 sec)

3.修改列名

alter table t_name change [column] 列名 新列名 类型 [完整性约束条件][first|after 字段名];

mysql> alter table t1 change sex sex_new int;

Query OK, 0 rows affected (0.07 sec)

Records: 0  Duplicates: 0  Warnings: 0
 

mysql> desc t1;

+---------+-------------+------+-----+---------+-------+

| Field   | Type        | Null | Key | Default | Extra |

+---------+-------------+------+-----+---------+-------+

| sex_new | int(11)     | YES  |     | NULL    |       |

| id      | int(11)     | YES  |     | NULL    |       |

| age     | varchar(20) | YES  |     | NULL    |       |

| tname   | varchar(20) | YES  |     | NULL    |       |

+---------+-------------+------+-----+---------+-------+

4 rows in set (0.02 sec)

4.删除一列

alter table t_name drop [column] 列名;

mysql> alter table t1 drop sex_new;

Query OK, 0 rows affected (0.06 sec)

Records: 0  Duplicates: 0  Warnings: 0
 

mysql> desc t1;

+-------+-------------+------+-----+---------+-------+

| Field | Type        | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| id    | int(11)     | YES  |     | NULL    |       |

| age   | varchar(20) | YES  |     | NULL    |       |

| tname | varchar(20) | YES  |     | NULL    |       |

+-------+-------------+------+-----+---------+-------+

3 rows in set (0.00 sec)

5.修改表名

rename table 表名 to 新表名;

mysql> rename table t1 to t1_new;

Query OK, 0 rows affected (0.05 sec)


mysql> show tables;

+-------------------+

| Tables_in_db_test |

+-------------------+

| employee          |

| t1_new            |

+-------------------+

2 rows in set (0.00 sec)

6.修该表所用的字符集   

alter table t_name character set utf8;

mysql> alter table t1 character set latin1;

Query OK, 0 rows affected (0.05 sec)

Records: 0  Duplicates: 0  Warnings: 0
 

mysql> show create table t1G

*************************** 1. row ***************************

       Table: t1

Create Table: CREATE TABLE `t1` (

  `id` int(11) DEFAULT NULL,

  `age` varchar(20) CHARACTER SET utf8 DEFAULT NULL,

  `tname` varchar(20) CHARACTER SET utf8 DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 row in set (0.00 sec)

3.4 删除表

drop table if exists t_name;

mysql> show tables;

+-------------------+

| Tables_in_db_test |

+-------------------+

| employee          |

| t1                |

+-------------------+

2 rows in set (0.00 sec)
 

mysql> drop table t1;

Query OK, 0 rows affected (0.03 sec)


mysql> show tables;

+-------------------+

| Tables_in_db_test |

+-------------------+

| employee          |

+-------------------+

1 row in set (0.00 sec)

4 表记录操作

4.1 插入记录

1.插入一条记录:

insertinto] t_name (field1,filed2,.......) values (value1,value2,.......);

2.插入多条记录:

insertinto] t_name (field1,filed2,.......) values (value1,value2,.......),
                           (value1,value2,.......),...;

4.2 修改记录

update t_name set field1=value1,field2=value2,......[where 语句]

示例:

update t_new set brith="1989-10-24" where id=1;

4.3 删除记录

delete只能用来删除一行记录,删除记录,是一行一行的删除。

TRUNCATE TABLE也可以删除表中的所有数据,首先摧毁表,再新建表。

4.4 查询记录

存储与查询效率冲突时,查询优先;也就是查询时最重要的一步,建立索引是为了提高查询效率

5 查询记录

5.1 概述

  查询语法:

   select *|field1,filed2 ...   from t_name

                  where 条件

                  group by field

                  having 筛选

                  order by field

                  limit 限制条数

   mysql在执行sql语句时的执行顺序:

    from  where  select  group by  having order by

5.2 where 子句使用

where字句中可以使用:

      比较运算符:

                > < >= <= <> !=

                between ** and **

                in(**,**,**)

                like 'chen%'

      逻辑运算符

                在多个条件直接可以使用逻辑运算符 and or not

5.3 group by子句

group by语句根据某个列对结果集进行分组。在分组的列上我们可以使用 count、sum、avg等函数进行相关查询。其主要目的是为分组之后的统计而用的。

示例:

select name,count(name) as num from t1 group by dep order by num desc;

select name,max(age) as num from t1 group by dep;

5.4 having子句

having子句,是过滤用的;是对分组之后的再次过滤。

5.5 order by子句

按指定的列进行,排序的列即可是表中的列名,也可以是select语句后指定的别名。

select *|field1,field2... from tab_name order by field [asc|desc]

5.6 limit

select * from t1 limit 1;

6 多表查询

6.1 笛卡尔积

select * from t1,t2;

6.2 内连接

查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。

select * from t1 inner join t2 on t1.id = t2.t1_id;

6.3 左外连接

左外连接:在内连接的基础上增加左边有右边没有的结果,也就是以左边的表为主;例如

 select * from t1 left join t2 on t1.id= t2.t1_id;

6.4 右外连接

右外连接:在内连接的基础上增加右边有左边没有的结果,也就是以右边的表为主;例如:

select * from t1 right join t2 on t1.id= t2.t1_id;

7 完整性约束

完整性约束是对字段进行限制,从而符合该字段达到我们期望的效果比如字段含有默认值,不能是NULL等 。直观点说:如果插入的数据不满足限制要求,数据库管理系统就拒绝执行操作

7.1 唯一性约束

唯一约束可以有多个但索引列的值必须唯一,索引列的值允许有空值。

如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE。

创建唯一约束:

create unique index UK_t1_name on t1 (name);

建表后添加约束:

alter table t1 add constraint UK_t1_name unique (name);

如果不需要唯一约束,则可以这样删除

alter table t1 drop index UK_t1_name;

7.2 自增约束

MySQL每张表只能有1个自动增长字段,这个自动增长字段通常作为主键,也可以用作非主键使用,但是请注意将自动增长字段当做非主键使用时必须必须为其添加唯一索引,否则系统将会报错。

7.3 主键约束

主键是用于唯一标识一条记录的约束,如同身份证。

主键有两个约束:非空且唯一!

7.4 复合主键

所谓的复合主键 就是指你表的主键含有一个以上的字段。

如果一列不能唯一区分一个表里的记录时,可以考虑多个列组合起来达到区分表记录的唯一性,形式

建表时:

create table t1 (

    c_id int,

    d_id int,

primary key (c_id,d_id)

);       

修改时:

alter table tb_name add primary key (字段1,字段2,字段3);

7.5 外键约束

   外键的定义语法:

  [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)

                    REFERENCES tbl_name (index_col_name, ...)

    [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

 该语法 可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。

8 表关系

表关系:是表与表之间的关系,有一对一、一对多、多对多;一定是两张表之间的关系。

一对多,将关联字段设置在多的表中

多对多,借助第三张表实现的

原文地址:https://www.cnblogs.com/goodshipeng/p/7518113.html