MySQL数据库基础语句(进阶版)

12 篇文章 1 订阅

目录

第一篇:MySQL基础知识

1、常见数据库类型

2、数据库常见的概念

3、数据库存储数据的特点

第二篇:MySQL的基本使用

1、MySQL登录命令  mysql -u 用户 -p ;

2、修改MySQL的root用户密码

3、 显示数据库版本 --version

4、显示MySQL服务器上所有的库  show databases;

5、切换指定使用的数据库 use 库名;

 6、显示当前库中的所有表  show tables; 

7、在当前位置查看其他数据库中的所有表  show tables from 库名;

8、查看表的创建语句  show create table 表名;

9、查看表结构  desc +表名

10、显示当前所在的库  select database();

11、查询当前MySQL支持的存储引擎  show engines;

小结:基本语法规范

第三篇:SQL的语言分类

第四篇:MySQL的数据类型

第五篇:MySQL管理员常用的命令

1、MySQL权限工作原理

2、创建用户  create user

操作1:不指定主机名

操作2:指定主机名创建用户 

操作3:指定IP创建用户  

3、修改用户密码

方式一:通过管理员修改密码

方式二:创建用户时直接设置密码

方式三:通过修改数据库mysql.user表修改密码

4、给用户授权  

示例1、给test1授权可以操作所有库所有权限

示例2、test2可以对company库中所有的表执行select

示例三、test03可以对company库中所有的表执行select、update

示例四、test1用户只能查询mysql.user表的user,host字段

5、查看用户权限  show grants;

5.1、查看当前登录的用户其用户权限

5.2、查看其他用户的用户权限

6、撤销用户的权限

7、删除账户  drop user

方法一:命令行删除:drop user '用户名'@'主机名'

方法二:通过删除mysql库中user表数据的方式

第六篇:DDL常见操作汇总

1、库的管理

1.1、创建库   create database

1.2、删除库  drop database

2、表的管理 

2.1、创建表  create table

2.2、删除表  drop table

2.3、修改表名  alter table

2.4、复制表  create table 表名 like

2.5、表中列的管理

第七篇:DML常见操作

1、插入单行

2、数据更新

3、删除数据

3.1、使用delete删除(删除表的内容,表的结构仍在)

3.2、drop 、truncate、delete的区别

第八篇:

一、select 查询基础篇

1、查询所有列

2、查询指定列

3、列别名

二、select条件查询

1、条件查询

1.1、条件查询运算符之等于(=)

1.2、条件查询运算符之不等于(<>或者!=)

1.3、条件查询运算符之大于(>)

2、逻辑查询运算符

2.1、AND(并且)

2.1、OR (或者)

2.3、like (模糊查询)

2.4、BETWEEN AND(区间查询)

2.5、IN 查询

2.6、NOT IN 查询

2.7、NULL 存在的坑(IS NULL / IS NOT NULL:NULL值专用查询)

第九篇 : 排序(正序、倒序)

1、排序查询(order by)


第一篇:MySQL基础知识

1、常见数据库类型

目前的常用数据库有mysql、oracle、sqlserver、db2等

①、oracle性能排名第⼀,服务也是相当到位的,但是收费也是⾮常

⾼的,⾦融公司对数据库稳定性要求⽐较⾼,⼀般会选择oracle

②、mysql是免费的,其他⼏个⽬前暂时收费的,mysql在互联⽹公司使⽤率也是排名第⼀, 资料也⾮常完善,社区也⾮常活跃,所以我们主要学习mysql

2、数据库常见的概念

①、DB:数据库,存储数据的容器

②、DBMS:数据库管理系统,又称为数据库软件或数据库产品,⽤于创建或管理DB。

③、SQL:结构化查询语⾔,⽤于和数据库通信的语⾔,不是某个数据库软件持有的,⽽是⼏乎所有的主流数据库软件通⽤的语⾔

3、数据库存储数据的特点

①、数据存放在表中,然后表存放在数据库中

②、⼀个库中可以有多张表,每张表具有唯⼀的名称(表名)来标识⾃⼰

③、表中有⼀个或多个列,列又称为“字段”,相当于java中的“属性”

④、表中每⼀⾏数据,相当于java中的“对象”

第二篇:MySQL的基本使用

1、MySQL登录命令  mysql -u 用户 -p ;

语法一:mysql -u root -p123123

此方法可免交互登录,但是密码明文显示,不安全。

语法二:mysql -u root -p

自行通过交互输入密码完成登录,比较安全

2、修改MySQL的root用户密码

[root@zwb_mysql ~]# mysqladmin -uroot -p password
 

3、 显示数据库版本 --version

[root@zwb_mysql ~]# mysql --version

[root@zwb_mysql ~]# mysql --version
mysql  Ver 14.14 Distrib 5.7.20, for Linux (x86_64) using  EditLine wrapper

4、显示MySQL服务器上所有的库  show databases;

mysql> show databases;

mysql> show databases;         #### 显示当前MySQL数据库服务器所有的数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| company            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

5、切换指定使用的数据库 use 库名;

mysql> use 库名;

mysql> use mysql;           ## 切换到的数据拿起来的
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

 6、显示当前库中的所有表  show tables; 

mysql> show tables; 

mysql> show tables;              ### 显示当前数据库内的所有表
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| engine_cost               |
| event                     |
| func                      |
| general_log               |
| gtid_executed             |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| server_cost               |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
31 rows in set (0.00 sec)

7、在当前位置查看其他数据库中的所有表  show tables from 库名;

mysql> show tables from 库名;

mysql> show tables from company;
+-------------------+
| Tables_in_company |
+-------------------+
| info              |
+-------------------+
1 row in set (0.00 sec)

8、查看表的创建语句  show create table 表名;

mysql> show create table 表名;

mysql> show create table info;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                   |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| info  | CREATE TABLE "info" (
  "id" int(3) DEFAULT NULL,
  "name" varchar(40) DEFAULT NULL,
  "address" varchar(40) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

9、查看表结构  desc +表名

mysql> desc +表名

mysql> desc info;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(3)      | YES  |     | NULL    |       |
| name    | varchar(40) | YES  |     | NULL    |       |
| address | varchar(40) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

10、显示当前所在的库  select database();

mysql> select database();

mysql> select database();
+------------+
| database() |
+------------+
| company    |
+------------+
1 row in set (0.00 sec)

11、查询当前MySQL支持的存储引擎  show engines;

mysql> show engines;

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

小结:基本语法规范

①、不区分⼤⼩写,但建议关键字⼤写,表名、列名⼩写

②、每条命令最好⽤英⽂分号结尾

③、每条命令根据需要,可以进⾏缩进或换⾏

第三篇:SQL的语言分类

  • DQLData Query Language:数据查询语⾔ select 相关语句
  • DMLData Manipulate Language:数据操作语⾔ insert 、update、delete 语句
  • DDLData De>ine Languge:数据定义语⾔ create、drop、alter 语句
  • TCLTransaction Control Language:事务控制语⾔ set autocommit=0、start transaction、savepoint、commit、rollback

第四篇:MySQL的数据类型

主要分为五大类:

  • 整数类型:bit、bool、tinyint、smallint、mediumint、int、bigint
  • 浮点数类型:float、double、decimal
  • 字符串类型:char、varchar、tinyblob、blob、mediumblob、longblob、

tinytext、text、mediumtext、longtext

  • ⽇期类型:Date、DateTime、TimeStamp、Time、Year

数据类新的一些建议:

  • 选小不选大:⼀般情况下选择可以正确存储数据的最小数据类型,越小的数据类型通常更快,占⽤磁盘,内存和CPU缓存更⼩。
  • 简单就好:简单的数据类型的操作通常需要更少的CPU周期,例如:整型⽐字符操作代价要⼩得多,因为字符集和校对规则(排序规则)使字符⽐整型⽐较更加复杂。
  • 尽量避免NULL:尽量制定列为NOT NULL,除⾮真的需要NULL类型的值,有NULL的列值会使得索引、索引统计和值⽐较更加复杂。
  • 浮点类型的建议统⼀选择decimal
  • 记录时间的建议使用:int类型,将时间转换为时间戳格式,如将时间转换为秒、毫秒,进行存储,方便走索引。

第五篇:MySQL管理员常用的命令

1、MySQL权限工作原理

mysql为了安全性考虑,采⽤(主机名+⽤户名)来判断⼀个⽤户的⾝份,因为在互联⽹中很难通过⽤户名来判断⼀个⽤户的⾝份,但是我们可以通过ip或者主机名判断⼀台机器,某个用户通过这个机器过来的,我们可以识别为⼀个⽤户,所以mysql中采⽤⽤户名+主机名来识别用户的⾝份。当⼀个用户对mysql发送指令的时候,mysql就是通过用户名和来源(主机)来断定⽤户的权限。

权限生效时间

⽤户及权限信息放在库名为mysql的库中,mysql启动时,这些内容被读进内存并且从此时⽣效,所以如果通过直接操作这些表来修改⽤户及权限信息的,需要重启mysql或者执⾏flush privileges;才可以⽣效。

2、创建用户  create user

语法:

create user 用户名@[主机名] [identified by '密码'];

①、主机名可不写:默认值为%,表⽰这个⽤户可以从任何主机连接mysql服务器

②、密码项看可以省略,表示无密登录

操作1:不指定主机名

使用命令:

①mysql> create user test1;

或者②mysql> create user 'test1'@%;

查询当前系统默认的用户

mysql> show databases;

mysql> use mysql;             ## 切换到mysql数据库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed

mysql> show tables;           ## 显示当前数据库所有的表
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| engine_cost               |
| event                     |
| func                      |
| general_log               |
| gtid_executed             |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| server_cost               |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |       ## 此表为存储mysql用户信息的
+---------------------------+
31 rows in set (0.00 sec)

mysql> select user,host from user;  ## 显示当前所有的用户名和主机名
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
3 rows in set (0.00 sec)
 
或者   使用as表示一下


mysql> select user as 用户,Host as 主机名 from user;
+---------------+-----------+
| 用户          | 主机名    |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
3 rows in set (0.00 sec)

不指定主机名,创建一新用户:系统给予的主机名为“%”,表示这个用户可以从任何主机连接mysql服务器,且没有密码,不需要密码验证。

mysql> create user test1;                  ## 不指定主机名创建用户test1
Query OK, 0 rows affected (0.01 sec)

mysql> select user as 用户,Host as 主机名 from user;   ## 查看显示test1的主机名为%
+---------------+-----------+            
| 用户          | 主机名    |
+---------------+-----------+
| test1         | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)

验证:

操作2:指定主机名创建用户 

新建用户test2,指定主机为localhost,密码为abc123 :表示用户test2只能在localhost主机上登录数据库

mysql> create user 'test2'@'localhost' identified by 'abc123';  ## 新建用户,指定主机、密码
Query OK, 0 rows affected (0.00 sec)


mysql> select user,Host from user;
+---------------+-----------+
| user          | Host      |
+---------------+-----------+
| test1         | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
| test2         | localhost |        ###  test2用户,主机名为localhost
+---------------+-----------+
5 rows in set (0.00 sec)

操作3:指定IP创建用户  

新建用户test04,指定ip:表示用户test04只能在IP为192.168.159.0段的主机才能登录数据库

mysql> create user 'test03'@'192.168.159.%' identified by 'abc123'; ## 新建用户,指定IP地址
Query OK, 0 rows affected (0.00 sec)

mysql> select user,Host from user;
+---------------+---------------+
| user          | Host          |
+---------------+---------------+
| test1         | %             |
| test03        | 192.168.159.% |
| mysql.session | localhost     |
| mysql.sys     | localhost     |
| root          | localhost     |
| test2         | localhost     |
+---------------+---------------+
6 rows in set (0.00 sec)

3、修改用户密码

方式一:通过管理员修改密码

mysql> set PASSWORD FOR 'test1'@'%'=PASSWORD('123123');   ##修改用户test1密码
Query OK, 0 rows affected, 1 warning (0.00 sec)



## 登录验证:
[root@zwb_nginx_mysql3 ~]# mysql -utest1 -p123123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.20-log Source distribution

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

方式二:创建用户时直接设置密码

方式三:通过修改数据库mysql.user表修改密码

###  通过mysql.user表修改用户密码,一定要刷新
mysql> update user set authentication_string=password('123123') where user='test2';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> flush privileges;          #### 刷新后才能生效
Query OK, 0 rows affected (0.00 sec)

4、给用户授权  

创建⽤户之后,需要给⽤户授权,才有意义

语法:

grant privileges on database.table to 'username'[@'host'] [with grant option]

grant命令说明:

①privileges(权限列表),可以是all,表示所有权限。也可以是select、update等权限,多个权限之间用逗号分开

②on 用来指定权限针对哪些库和表,格式为(数据库.表名),或(*.*)表示的是所有库所有表

③TO 表示将权限赋予某个用户, 格式为username@host,@前面为用户名,@后⾯接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。

④with grant option 这个选项表示该用户可以将自己拥有的权限授权给别人。

注意:经常有人在创建操作用户的时候不指定 with grant option 选项导致后来该用户不能使用grant命令创建用户或者给其它用户授权。 备注:可以使用GRANT重复给⽤户添加权限,权限叠加,比如你先给用户添加⼀个select权限,然后又给用户添加⼀个insert权限,那么该⽤户就同时拥有了selectinsert权限。

示例1、给test1授权可以操作所有库所有权限

grant all on *.* to 'test1'@'%';表示test1用户可以在任何主机登录数据库,且对所有数据库用于所有权限

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| company            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)


mysql> select user,host from user;
+---------------+---------------+
| user          | host          |
+---------------+---------------+
| test1         | %             |
| test03        | 192.168.159.% |
| mysql.session | localhost     |
| mysql.sys     | localhost     |
| root          | localhost     |
| test2         | localhost     |
+---------------+---------------+
6 rows in set (0.00 sec)

mysql> grant all on *.* to 'test1'@'%';    
Query OK, 0 rows affected (0.00 sec)

示例2、test2可以对company库中所有的表执行select

mysql> grant select on company.* to 'test2'@'localhost';
Query OK, 0 rows affected (0.00 sec)

示例三、test03可以对company库中所有的表执行select、update

mysql> grant select,update on company.* to 'test03'@'192.168.159.%';
Query OK, 0 rows affected (0.00 sec)

示例四、test1用户只能查询mysql.user表的user,host字段

mysql> grant select(user,host) on mysql.user to 'test1'@'%';
Query OK, 0 rows affected (0.00 sec)

5、查看用户权限  show grants;

5.1、查看当前登录的用户其用户权限

show grants;

[root@zwb_nginx_mysql3 ~]# mysql -uroot -pabc123  ##当前以root身份登录的

mysql> show grants;                               ## 显示root用户拥有哪些权限
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

5.2、查看其他用户的用户权限

show grants for 'tset1'@'%';(主机名可以不写,默认下是%)

mysql> show grants for 'test1'@'%';
+------------------------------------------------------------+
| Grants for test1@%                                         |
+------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'test1'@'%'                 |
| GRANT SELECT (user, host) ON "mysql"."user" TO 'test1'@'%' |
+------------------------------------------------------------+
2 rows in set (0.00 sec

6、撤销用户的权限

revoke privileges on database.table from '⽤户名'[@'主机/IP/%'];

示例一、取消test1在mysql数据库中搜索user的授权

mysql> show grants for 'test1'@'%';    ## 显示用户的所有权限
+------------------------------------------------------------+
| Grants for test1@%                                         |
+------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'test1'@'%'                 |
| GRANT SELECT (user, host) ON "mysql"."user" TO 'test1'@'%' |
+------------------------------------------------------------+
2 rows in set (0.00 sec)


mysql> revoke select(user) on mysql.user from test1; ##取消select(user)的权限
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for test1;        ## 显示调整后的用户权限
+------------------------------------------------------+
| Grants for test1@%                                   |
+------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'test1'@'%'           |
| GRANT SELECT (host) ON "mysql"."user" TO 'test1'@'%' |
+------------------------------------------------------+
2 rows in set (0.00 sec)

示例二、

mysql> select user,host from mysql.user;
+---------------+---------------+
| user          | host          |
+---------------+---------------+
| test1         | %             |
| test03        | 192.168.159.% |
| mysql.session | localhost     |
| mysql.sys     | localhost     |
| root          | localhost     |
| test2         | localhost     |
+---------------+---------------+
6 rows in set (0.00 sec)

mysql> show grant for 'test03'@'192.168.159.%';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'grant for 'test03'@'192.168.159.%'' at line 1
mysql> show grants for 'test03'@'192.168.159.%';
+-----------------------------------------------------------------+
| Grants for test03@192.168.159.%                                 |
+-----------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test03'@'192.168.159.%'                  |
| GRANT SELECT, UPDATE ON "company".* TO 'test03'@'192.168.159.%' |
+-----------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> revoke SELECT, UPDATE on company.* from 'test03'@'192.168.159.%';
   Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'test03'@'192.168.159.%';                     
+------------------------------------------------+
| Grants for test03@192.168.159.%                |
+------------------------------------------------+
| GRANT USAGE ON *.* TO 'test03'@'192.168.159.%' |
+------------------------------------------------+
1 row in set (0.00 sec)

7、删除账户  drop user

方法一:命令行删除:drop user '用户名'@'主机名'

mysql> select user,host from user;         ### 显示当前的用户及主机名
+---------------+---------------+
| user          | host          |
+---------------+---------------+
| test1         | %             |
| test03        | 192.168.159.% |
| mysql.session | localhost     |
| mysql.sys     | localhost     |
| root          | localhost     |
| test2         | localhost     |
+---------------+---------------+
6 rows in set (0.00 sec)


mysql> drop user test1;       ## 该用户的主机为‘%’,所有主机。删除用户时可省略
Query OK, 0 rows affected (0.01 sec)

mysql> drop user 'test03'@'192.168.159.%';  ##删除用户test03
Query OK, 0 rows affected (0.00 sec)

mysql> drop user 'test2'@'localhost';       ##删除用户test2   
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from user;          ## 查看删除后其情况,重启生效
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
3 rows in set (0.00 sec)

方法二:通过删除mysql库中user表数据的方式

delete from user where user='用户名' and host='主机';

flush privileges;

通过表的方式删除的,需要调用flush privileges;刷新权限信息(权限启动的时候在内存中保存的,通过修改mysql.user表的方式修改之后需要刷新⼀下)

第六篇:DDL常见操作汇总

DDL:数据定义语句。主要用于对数据库,表进行一些管理操作

如:建库、删库、建表、修改表、删除表、对列的增删改等等

1、库的管理

1.1、创建库   create database

建、删库通用写法:

create database [if not exists] 新数据库名;

drop database [if exists] 数据库名;

create database [if not exists] 库名;

mysql> create database if not exists xuexi;   ##在xuexi的数据库不存在的情况下自 
                                              ##动创建
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| company            |
| mysql              |
| performance_schema |
| sys                |
| xuexi              |
+--------------------+
6 rows in set (0.01 sec)

1.2、删除库  drop database

drop database if exists xuexi;

mysql> drop database if exists xuexi;   ## 判断存在的情况下,删除xuexi数据库
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| company            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

2、表的管理 

2.1、创建表  create table

create table 表名(

字段1 类型[(宽度)] [约束条件] [comment '字段说明'],

字段2 类型[(宽度)] [约束条件] [comment '字段说明'],

字段3 类型[(宽度)] [约束条件] [comment '字段说明']

)[表的一些设置]

注意:

①在同⼀张表中,字段名不能相同

②宽度和约束条件为可选参数,字段名和类型是必须的

③最后⼀个字段后不能加逗号

④类型其实也是对字段的约束(约束字段下的记录必须为XX类型)

⑤类型后写的 约束条件 是在类型之外的 额外添加的约束

约束条件分类:

not null:标识该字段不能为空

mysql> create database ceshi;             ### 创建ceshi的库
Query OK, 1 row affected (0.00 sec)

mysql> use ceshi;                         ### 使用ceshi的库
Database changed
mysql> create table lianxi(a int not null comment '字段a');  ### 新建lianxi表且不能为空
Query OK, 0 rows affected (0.00 sec)

mysql> insert into lianxi values(null);               ### 插入为空值。提示输入错误
ERROR 1048 (23000): Column 'a' cannot be null
mysql> 
mysql> insert into lianxi values(2);                  ### 正确的查看内容
Query OK, 1 row affected (0.00 sec)

mysql> select * from lianxi;                          ### 查看lianxi表的内容
+---+
| a |
+---+
| 2 |
+---+
1 row in set (0.00 sec)

default values :为该字段设置默认值。默认值为values

mysql> create table mimi02(a int(20),b int not null default 0);
Query OK, 0 rows affected (0.01 sec)   ### 创建表,字段a为整型(20),b不为空值,默认为0

mysql> insert into mimi02(a) values(10);     ### 像表内a字段插入数据,b不定义他,他会取默认值0
Query OK, 1 row affected (0.00 sec)  
 
mysql> select * from mimi02;                 ## 查看结果
+------+---+
| a    | b |
+------+---+
|   10 | 0 |
+------+---+
1 row in set (0.00 sec)

primary key :标识该字段为该表的主键,可以唯⼀的标识记录,插⼊重复的会报错

方法一:跟在列后面

mysql> create table aa(id int(20) primary key,name varchar(40));
Query OK, 0 rows affected (0.00 sec)    

 
mysql> desc aa;                         ## 查看表结构,id 为主键
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(20)     | NO   | PRI | NULL    |       |
| name  | varchar(40) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

方法二:在所有定义之后定义:

mysql> create table aaaa(id int(4),name varchar(30),primary key(id)); 
Query OK, 0 rows affected (0.01 sec)

mysql> desc aaaa;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(4)      | NO   | PRI | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

foreign key : 为表中的字段设置外键

mysql> create table test5(                       ### 创建 test5表
    -> a int(10) not null primary key
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> create table test6(                       ## 创建表 test6
    -> b int(10),
    -> test_5 int not null,
    -> foreign key(test_5) references test5(a));  ##设置外键

Query OK, 0 rows affected (0.00 sec)

mysql> insert into test5 (a) values (1)     
    -> ;
Query OK, 1 row affected (0.01 sec)

mysql> insert into test6 (b,test6.test_5) values (1,1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test6;
+------+--------+
| b    | test_5 |
+------+--------+
|    1 |      1 |
+------+--------+
1 row in set (0.00 sec)

mysql> select * from test5;
+---+
| a |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

unique key: 标识该字段的值是唯⼀的

mysql> drop table if exists test8;               ## 如果有该表就删除
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create table test8(a int not null unique key);  ## 创建表
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test8(a) values(34);         ## 插入a的值为34
Query OK, 1 row affected (0.00 sec)

mysql> select *from test8                       ## 查看表的内容
    -> ;
+----+
| a  |
+----+
| 34 |
+----+
1 row in set (0.00 sec)

mysql> insert into test8(a) values(34);          ## 因为设置为唯一值,所以提示 
                                                  已存在。
ERROR 1062 (23000): Duplicate entry '34' for key 'a'

auto_increment:标识该字段的值自动增长(整数类型,而且为主键)

mysql> drop table if exists test8;             ## 库存在的情况下,进行删除
Query OK, 0 rows affected (0.00 sec)


## 建立表test8,一个字段di,约束为自增长和设置为主键
mysql> create table test8(id int(4) auto_increment primary key);
Query OK, 0 rows affected (0.00 sec)

mysql> alter table test8 add name varchar(40);  ## 增加列name 
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0


mysql> desc test8;     ## 查看表结构
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(4)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(40) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)



mysql> insert into test8(name) values('zhangsan');  ## 只对字段name进行设置
Query OK, 1 row affected (0.00 sec)

mysql> insert into test8(name) values('lisi');  ## 只对字段name进行设置
Query OK, 1 row affected (0.01 sec)

mysql> select * from test8;  ## 查看发现,虽然只设置了name字段,但是id自增长了
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  2 | lisi     |
+----+----------+
2 rows in set (0.00 sec)

注意:

自增长当前列存储与内存中,数据库每次重启之后,会查询当前表中自增长列中的最大值作为当前值,如果表数据被清空之后,数据库重启了,自增长将从初始值开始。

模拟1、删除表的内容再重新增加记录

mysql> delete from test8;            ## 删除test8的表内容
Query OK, 2 rows affected (0.00 sec)

mysql> select * from test8;          ## 查看test8表内容,提示无内容
Empty set (0.00 sec)

mysql> insert into test8(name) values('wangwu');  ## 添加记录wangwu
Query OK, 1 row affected (0.00 sec)

mysql> select * from test8;          ## 查看id发现自增长从3开始
+----+--------+
| id | name   |
+----+--------+
|  3 | wangwu |
+----+--------+
1 row in set (0.00 sec)

模拟2、重启数据库

mysql> delete from test8;              ## 删除表内容
Query OK, 1 row affected (0.00 sec)

mysql> quit                            ## 退出数据库
Bye 
[root@zwb_nginx_mysql3 ~]# systemctl restart mysqld.service  ## 重启数据库
[root@zwb_nginx_mysql3 ~]# mysql -uroot -pabc123      ## 登录数据库
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.20-log Source distribution

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use ceshi;               ## 切换到数据库ceshi
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;           ## 查看当前库下所有表
+-----------------+
| Tables_in_ceshi |
+-----------------+
| aa              |
| aaaa            |
| lianxi          |
| mimi            |
| mimi02          |
| test5           |
| test6           |
| test8           |
+-----------------+
8 rows in set (0.00 sec)

mysql> select * from test8;             ## 查看表test8提示无内容
Empty set (0.00 sec)
 
mysql> insert into test8(name) values('wangyi');  ## 增加记录
Query OK, 1 row affected (0.00 sec)

mysql> select * from test8;               ## 查询表内容,自增长从1开始
+----+--------+
| id | name   |
+----+--------+
|  1 | wangyi |
+----+--------+
1 row in set (0.00 sec)

2.2、删除表  drop table

drop table [if exists] 表名;

mysql> show tables;     
+-----------------+
| Tables_in_ceshi |
+-----------------+
| aa              |
| aaaa            |
| lianxi          |
| mimi            |
| mimi02          |
| test5           |
| test6           |
| test8           |
+-----------------+
8 rows in set (0.00 sec)
 
mysql> drop table test6;                  ## 删除表
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+-----------------+
| Tables_in_ceshi |
+-----------------+
| aa              |
| aaaa            |
| lianxi          |
| mimi            |
| mimi02          |
| test5           |
| test8           |
+-----------------+
7 rows in set (0.00 sec)

2.3、修改表名  alter table

alter table 表名 rename [to] 新表名

mysql> alter table aa rename to gaiming;  ## 修改表名
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+-----------------+
| Tables_in_ceshi |
+-----------------+
| aaaa            |
| gaiming         |
| lianxi          |
| mimi            |
| mimi02          |
| test5           |
| test8           |
+-----------------+
7 rows in set (0.00 sec)

2.4、复制表  create table 表名 like

create table 表名 like 被复制的表名(只复制表的结构)

mysql> create table fuzhi like aaaa;   ## 新建fuzhi表复制aaaa的表结构
Query OK, 0 rows affected (0.01 sec)

mysql> desc fuzhi;      ## 查看表结构
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(4)      | NO   | PRI | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> desc aaaa;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(4)      | NO   | PRI | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

create table 表名 [as] select 字段,.... from 被复制的表[where 条件];(复制表的结构和数据)

mysql> create table neirong as select * from test8;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from test8;
+----+--------+
| id | name   |
+----+--------+
|  1 | wangyi |
+----+--------+
1 row in set (0.00 sec)

mysql> select * from neirong;
+----+--------+
| id | name   |
+----+--------+
|  1 | wangyi |
+----+--------+
1 row in set (0.00 sec)

mysql> desc test8;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(4)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(40) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> desc neirong;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(4)      | NO   |     | 0       |       |
| name  | varchar(40) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

2.5、表中列的管理

①、添加列

mysql> select * from test8;         ## 显示当前的表内容
+----+--------+------+-------+
| id | name   | addr | phone |
+----+--------+------+-------+
|  1 | wangyi | NULL |  NULL |
+----+--------+------+-------+
1 row in set (0.00 sec)

mysql> alter table test8 add riqi varchar(30);   ## 添加一列
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0


## 一次添加多列
mysql> alter table test8 add riqi1 varchar(30),add other varchhar(30);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0


mysql> select * from test8;                 ## 查看表内容
+----+--------+------+-------+------+-------+-------+
| id | name   | addr | phone | riqi | riqi1 | other |
+----+--------+------+-------+------+-------+-------+
|  1 | wangyi | NULL |  NULL | NULL | NULL  | NULL  |
+----+--------+------+-------+------+-------+-------+
1 row in set (0.00 sec)

②、修改列名

alter table 表名 change 列名 新列名 新类型 [约束];

mysql> alter table test8 drop addr,drop phone;  ## 一次删除多行
Query OK, 0 rows affected (0.03 sec)  
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from test8;
+----+--------+------+-------+-------+
| id | name   | riqi | riqi1 | other |
+----+--------+------+-------+-------+
|  1 | wangyi | NULL | NULL  | NULL  |
+----+--------+------+-------+-------+
1 row in set (0.00 sec)

②、删除列

mysql> alter table test8
      -> change riqi c varchar(30);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from test8;
+----+--------+------+-------+-------+
| id | name   | c    | riqi1 | other |
+----+--------+------+-------+-------+
|  1 | wangyi | NULL | NULL  | NULL  |
+----+--------+------+-------+-------+
1 row in set (0.00 sec)

第七篇:DML常见操作

DML(Data Manipulation Language)数据操作语⾔,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除。

1、插入单行

方法一:

insert into 表名[字段1,字段2,....] values (值1,值2);

说明:

值和字段需要⼀⼀对应

如果是字符型或⽇期类型,值需要⽤单引号引起来;如果是数值类型,不需要⽤单引号

字段如果不能为空,则必须插⼊值  

mysql> select * from test8;
+----+--------+------+-------+-------+
| id | name   | c    | riqi1 | other |
+----+--------+------+-------+-------+
|  1 | wangyi | NULL | NULL  | NULL  |
+----+--------+------+-------+-------+
1 row in set (0.00 sec)

mysql> insert into test8(id,name,c,riqi1,other)      ## 插入一行及值 
values(2,'wanger',NULL,NULL,NULL);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test8;
+----+--------+------+-------+-------+
| id | name   | c    | riqi1 | other |
+----+--------+------+-------+-------+
|  1 | wangyi | NULL | NULL  | NULL  |
|  2 | wanger | NULL | NULL  | NULL  |
+----+--------+------+-------+-------+
2 rows in set (0.01 sec)




还可以写成

## 此种加行的方法,必须知道表的结构,中间不能缺省任何一个值。否则报错


mysql> insert into test8 values(4,4,4,4,4);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test8;
+----+---------+------+-------+-------+
| id | name    | c    | riqi1 | other |
+----+---------+------+-------+-------+
|  1 | wangyi  | NULL | NULL  | NULL  |
|  2 | wanger  | NULL | NULL  | NULL  |
|  3 | wangsan | NULL | NULL  | NULL  |
|  4 | 4       | 4    | 4     | 4     |
+----+---------+------+-------+-------+
4 rows in set (0.00 sec)

方法二:

insert into 表名 set 字段 = 值,字段 = 值;

mysql> select * from test8;
+----+--------+------+-------+-------+
| id | name   | c    | riqi1 | other |
+----+--------+------+-------+-------+
|  1 | wangyi | NULL | NULL  | NULL  |
|  2 | wanger | NULL | NULL  | NULL  |
+----+--------+------+-------+-------+
2 rows in set (0.01 sec)

mysql> insert into test8 set id=3,name='wangsan',c=NULL,riqi1=NULL,other=NULL;
Query OK, 1 row affected (0.00 sec)

mysql> select * from test8;                                  
+----+---------+------+-------+-------+
| id | name    | c    | riqi1 | other |
+----+---------+------+-------+-------+
|  1 | wangyi  | NULL | NULL  | NULL  |
|  2 | wanger  | NULL | NULL  | NULL  |
|  3 | wangsan | NULL | NULL  | NULL  |
+----+---------+------+-------+-------+
3 rows in set (0.00 sec)

行插入进阶版:

mysql> drop table if exists test1;               ## 查看表test1是否存在,存在则删除
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create table test1(a int,b int);      ## 创建表test1,包含两个字节,a和b
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;                          ## 查看所有表,test已经生成
+-----------------+
| Tables_in_ceshi |
+-----------------+
| aaaa            |
| fuzhi           |
| gaiming         |
| lianxi          |
| mimi            |
| mimi02          |
| neirong         |
| test1           |
| test5           |
| test8           |
+-----------------+
10 rows in set (0.00 sec)
 
mysql> drop table if exists test2;               ## 查看表test2是否存在,存在则删除
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create table test2(c1 int,c2 int,c3 int);  ## 创建表test2,包含两个字节,c1,c2和c3
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;                               ## 查看所有表,test2已建立
+-----------------+
| Tables_in_ceshi |
+-----------------+
| aaaa            |
| fuzhi           |
| gaiming         |
| lianxi          |
| mimi            |
| mimi02          |
| neirong         |
| test1           |
| test2           |
| test5           |
| test8           |
+-----------------+
11 rows in set (0.00 sec)

mysql> insert into test2 values (100,101,102),(200,201,202),(300,301,302), (400,401,402);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0     ## 往test2表中插入4行记录

mysql> insert into test1 values(1,1),(2,2),(2,2);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0     ## 往test1表中插入3行记录

mysql> select * from test1;
+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    2 |    2 |
+------+------+
3 rows in set (0.00 sec)

mysql> select * from test2;
+------+------+------+
| c1   | c2   | c3   |
+------+------+------+
|  100 |  101 |  102 |
|  200 |  201 |  202 |
|  300 |  301 |  302 |
|  400 |  401 |  402 |
+------+------+------+
4 rows in set (0.00 sec)

mysql> insert into test1(a,b) select c2,c3 from test2 where c1>=200;
Query OK, 3 rows affected (0.01 sec)         ## 往test中a,b字节插入记录,取于test2中 
                                             ## C1>=200 的记录集合
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from test1;
+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    2 |    2 |
|  201 |  202 |
|  301 |  302 |
|  401 |  402 |
+------+------+
6 rows in set (0.00 sec)


2、数据更新

语法:

update 表名 [[as] 别名] set [别名.]字段=值 [where条件];

(有些表名可能名称比较长,为了方便操作,可以给这个表名起个简单的别名,更方便操作一些)

mysql> select * from test8;                  ## 查看表中原有的数据
+----+---------+------+-------+-------+
| id | name    | c    | riqi1 | other |
+----+---------+------+-------+-------+
|  1 | wangyi  | NULL | NULL  | NULL  |
|  2 | wanger  | NULL | NULL  | NULL  |
|  3 | wangsan | NULL | NULL  | NULL  |
|  4 | 4       | 4    | 4     | 4     |
+----+---------+------+-------+-------+
4 rows in set (0.00 sec)


mysql> update test8 set c=20 where id=1;      ## 指定修改行id=1的那行,c=20,
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0


mysql> select * from test8;                  ## 查看结果
+----+---------+------+-------+-------+
| id | name    | c    | riqi1 | other |
+----+---------+------+-------+-------+
|  1 | wangyi  | 20   | NULL  | NULL  |
|  2 | wanger  | NULL | NULL  | NULL  |
|  3 | wangsan | NULL | NULL  | NULL  |
|  4 | 4       | 4    | 4     | 4     |
+----+---------+------+-------+-------+
4 rows in set (0.00 sec)

                                           ## 不指定行数,则修改的先允许
mysql> update test8 set riqi1='9月24日';
Query OK, 4 rows affected (0.01 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> select * from test8;
+----+---------+------+-----------+-------+
| id | name    | c    | riqi1     | other |
+----+---------+------+-----------+-------+
|  1 | wangyi  | 20   | 9月24日   | NULL  |
|  2 | wanger  | NULL | 9月24日   | NULL  |
|  3 | wangsan | NULL | 9月24日   | NULL  |
|  4 | 4       | 4    | 9月24日   | 4     |
+----+---------+------+-----------+-------+
4 rows in set (0.00 sec)

3、删除数据

3.1、使用delete删除(删除表的内容,表的结构仍在)

delete [别名] from [表名] [[as] 别名] [where 条件];

注意:

如果⽆别名的时候,表名就是别名

如果有别名,delete后⾯必须写别名

如果没有别名,delete后⾯的别名可以省略不写

mysql> select * from test1;                 ## 查看表test1内容
+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    2 |    2 |
|  201 |  202 |
|  301 |  302 |
|  401 |  402 |
|    1 |    1 |
|    2 |    2 |
|    2 |    2 |
+------+------+
9 rows in set (0.00 sec)

mysql> delete from test1 where a=2;      ## 加where选项表示删除test1表中a字节值等于2的部分
Query OK, 4 rows affected (0.00 sec)

mysql> select * from test1;              ## 查看选择性删除的结果
+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|  201 |  202 |
|  301 |  302 |
|  401 |  402 |
|    1 |    1 |
+------+------+
5 rows in set (0.00 sec)

mysql> delete from test1;              ## 删除所有表test1的所有内容
Query OK, 5 rows affected (0.00 sec)

mysql> select * from test1;            ## 查看内容为空
Empty set (0.00 sec)

3.2、drop 、truncate、delete的区别

①drop (删除表):删除内容和定义,释放空间,简单来说就是把整个表去掉,以后要新增数据是不可能的,除⾮新增⼀个表

②truncate (清空表中的数据):删除内容、释放空间但不删除定义(保留表的数据结构),与drop不同的是,只是清空表数据⽽已。

注意:truncate不能删除具体⾏数据,要删就要把整个表清空了。

③delete (删除表中的数据):delete 语句⽤于删除表中的⾏。delete语句执⾏删除的过程是每次从表中删除⼀⾏,并且同时将该⾏的删除操作作为事务记录在⽇志中保存, 以便进⾏进⾏回滚操作。

删除速度:drop> truncate > delete

第八篇:

一、select 查询基础篇

1、查询所有列

select * from 表名

mysql> select * from test2;             ## 查询整个表的内容
+------+------+------+
| c1   | c2   | c3   |
+------+------+------+
|  100 |  101 |  102 |
|  200 |  201 |  202 |
|  300 |  301 |  302 |
|  400 |  401 |  402 |
+------+------+------+
4 rows in set (0.00 sec)

2、查询指定列

select 查询的列 from 表名;

mysql> select c1,c2 from test2;        ## 查询表中指定列的内容
+------+------+
| c1   | c2   |
+------+------+
|  100 |  101 |
|  200 |  201 |
|  300 |  301 |
|  400 |  401 |
+------+------+
4 rows in set (0.00 sec)

3、列别名

在创建数据表时,⼀般都会使⽤英⽂单词或英⽂单词缩写来设置字段名,在查询时列名都会以英⽂的形式显⽰,这样会给⽤户查看数据带来不便,这种情况可以使⽤别名来代替英⽂列名,增强阅读性。

语法:

select 列 [as] 别名 from 表;

mysql> select c1 as '列1',c2 as '列2' from test2;
+------+------+
| 列1  | 列2  |
+------+------+
|  100 |  101 |
|  200 |  201 |
|  300 |  301 |
|  400 |  401 |
+------+------+
4 rows in set (0.00 sec)


或者
mysql> select c1 '列1',c2 '列2' from test2;
+------+------+
| 列1  | 列2  |
+------+------+
|  100 |  101 |
|  200 |  201 |
|  300 |  301 |
|  400 |  401 |
+------+------+
4 rows in set (0.00 sec)

二、select条件查询

1、条件查询

语法:

select 列名 from 表名 where 列 运算符值;

注意: 数值按照大小比较

          字符按照ASCII码对应的值进行比较,比较时按照字符对应的位置一个字符一个字符的比较.(由于字符集的原因ASCII码比较时,没有大小写其区别)

(注意:关键字where,where后⾯跟上⼀个或者多个条件,条件是对前⾯数据的过滤,只有满⾜where后⾯条件的数据才会被执行)

1.1、条件查询运算符之等于(=)

语法:

select 列名 from 表名 where 列 = 值;(值如果是字符串类型,需要⽤单引号或者双引号引起来)

mysql> select * from test8;                      ## 查询 test8的表内容
+----+---------+------+-----------+-------+
| id | name    | c    | riqi1     | other |
+----+---------+------+-----------+-------+
|  1 | wangyi  | 20   | 9月24日   | NULL  |
|  2 | wanger  | NULL | 9月24日   | NULL  |
|  3 | wangsan | NULL | 9月24日   | NULL  |
|  4 | 4       | 4    | 9月24日   | 4     |
+----+---------+------+-----------+-------+
4 rows in set (0.00 sec)
 
mysql> select * from test8 where id=1;          ## 查询test8表内id=1的内容
+----+--------+------+-----------+-------+
| id | name   | c    | riqi1     | other |
+----+--------+------+-----------+-------+
|  1 | wangyi | 20   | 9月24日   | NULL  |
+----+--------+------+-----------+-------+
1 row in set (0.00 sec)

mysql> select * from test8 where riqi1='9月24日';  ## 查询test8表内riqi1='9月24日的内容
+----+---------+------+-----------+-------+
| id | name    | c    | riqi1     | other |
+----+---------+------+-----------+-------+
|  1 | wangyi  | 20   | 9月24日   | NULL  |
|  2 | wanger  | NULL | 9月24日   | NULL  |
|  3 | wangsan | NULL | 9月24日   | NULL  |
|  4 | 4       | 4    | 9月24日   | 4     |
+----+---------+------+-----------+-------+
4 rows in set (0.00 sec)

1.2、条件查询运算符之不等于(<>或者!=)

不等于有两种写法:<>或者!=

方法一:select 列名 from 表名 where 列 <> 值; 

方法二:select 列名 from 表名 where 列 != 值;

mysql> select * from test8 
    -> ;
+----+---------+------+-----------+-------+
| id | name    | c    | riqi1     | other |
+----+---------+------+-----------+-------+
|  1 | wangyi  | 20   | 9月24日   | NULL  |
|  2 | wanger  | NULL | 9月24日   | NULL  |
|  3 | wangsan | NULL | 9月24日   | NULL  |
|  4 | 4       | 4    | 9月24日   | 4     |
+----+---------+------+-----------+-------+
4 rows in set (0.00 sec)


mysql> select * from test8 where name<>4;      ## 查询name列值不等于4的记录
+----+---------+------+-----------+-------+
| id | name    | c    | riqi1     | other |
+----+---------+------+-----------+-------+
|  1 | wangyi  | 20   | 9月24日   | NULL  |
|  2 | wanger  | NULL | 9月24日   | NULL  |
|  3 | wangsan | NULL | 9月24日   | NULL  |
+----+---------+------+-----------+-------+
3 rows in set, 3 warnings (0.00 sec)

或者:
mysql> select * from test8 where name!=4;   ## 不等于的两种表达方式
+----+---------+------+-----------+-------+
| id | name    | c    | riqi1     | other |
+----+---------+------+-----------+-------+
|  1 | wangyi  | 20   | 9月24日   | NULL  |
|  2 | wanger  | NULL | 9月24日   | NULL  |
|  3 | wangsan | NULL | 9月24日   | NULL  |
+----+---------+------+-----------+-------+
3 rows in set, 3 warnings (0.00 sec)

1.3、条件查询运算符之大于(>)

select 列名 from 表名 where 列 > 值;

mysql> select * from test8;
+----+---------+------+-----------+-------+
| id | name    | c    | riqi1     | other |
+----+---------+------+-----------+-------+
|  1 | wangyi  | 20   | 9月24日   | NULL  |
|  2 | wanger  | NULL | 9月24日   | NULL  |
|  3 | wangsan | NULL | 9月24日   | NULL  |
|  4 | 4       | 4    | 9月24日   | 4     |
|  5 | wangsi  | 21   | 25日      | NULL  |
|  6 | wangwu  | 25   | 25日      | NULL  |
+----+---------+------+-----------+-------+
6 rows in set (0.00 sec)
  
mysql> select * from test8 where c>'21';     ## 此处单引号可以不加
+----+--------+------+-----------+-------+
| id | name   | c    | riqi1     | other |
+----+--------+------+-----------+-------+
|  4 | 4      | 4    | 9月24日   | 4     |
|  6 | wangwu | 25   | 25日      | NULL  |
+----+--------+------+-----------+-------+
2 rows in set (0.00 sec)

2、逻辑查询运算符

当我们需要使⽤多个条件进⾏查询的时候,需要使用逻辑查询运算符

2.1、AND(并且)

select 列名 from 表名 where 条件1 and 条件2;

mysql> select * from test8;
+----+---------+------+-----------+-------+
| id | name    | c    | riqi1     | other |
+----+---------+------+-----------+-------+
|  1 | wangyi  | 20   | 9月24日   | NULL  |
|  2 | wanger  | NULL | 9月24日   | NULL  |
|  3 | wangsan | NULL | 9月24日   | NULL  |
|  4 | 4       | 4    | 9月24日   | 4     |
|  5 | wangsi  | 21   | 25日      | NULL  |
|  6 | wangwu  | 25   | 25日      | NULL  |
+----+---------+------+-----------+-------+
6 rows in set (0.00 sec)


mysql> select * from test8 where name='wangsi' and riqi1='25日';##须同时满足and的前后的两个条件
+----+--------+------+-------+-------+
| id | name   | c    | riqi1 | other |
+----+--------+------+-------+-------+
|  5 | wangsi | 21   | 25日  | NULL  |
+----+--------+------+-------+-------+
1 row in set (0.00 sec)

2.1、OR (或者)

select 列名 from 表名 where 条件1 or 条件2;

mysql> select * from test8;                                  
+----+---------+------+-----------+-------+
| id | name    | c    | riqi1     | other |
+----+---------+------+-----------+-------+
|  1 | wangyi  | 20   | 9月24日   | NULL  |
|  2 | wanger  | NULL | 9月24日   | NULL  |
|  3 | wangsan | NULL | 9月24日   | NULL  |
|  4 | 4       | 4    | 9月24日   | 4     |
|  5 | wangsi  | 21   | 25日      | NULL  |
|  6 | wangwu  | 25   | 25日      | NULL  |
+----+---------+------+-----------+-------+
6 rows in set (0.00 sec)

mysql> select * from test8 where name='wangyi' or name='wangwu';  
+----+--------+------+-----------+-------+
| id | name   | c    | riqi1     | other |     ## 查询出name=wangyi 或者name=wangwu的记录
+----+--------+------+-----------+-------+
|  1 | wangyi | 20   | 9月24日   | NULL  |
|  6 | wangwu | 25   | 25日      | NULL  |
+----+--------+------+-----------+-------+
2 rows in set (0.01 sec)

2.3、like (模糊查询)

select 列名 from 表名 where 列 like pattern;

注意:

pattern中可以包含通配符,有以下通配符:

                                                                     %:表⽰匹配任意⼀个或多个字符

                                                                      _:表⽰匹配任意⼀个字符

mysql> create table stu(编号 int(4) not null primary key,年龄 int(8) not null,姓名 varchar(40) not null);
Query OK, 0 rows affected (0.00 sec)

mysql> desc stu;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| 编号   | int(4)      | NO   | PRI | NULL    |       |
| 年龄   | int(8)      | NO   |     | NULL    |       |
| 姓名   | varchar(40) | NO   |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> insert into stu values (1,22,'张三'),(2,25,'李四'),(3,26,'张学友'),(4,32,'刘德华'),(5,55,'张学良');
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from stu;
+--------+--------+-----------+
| 编号   | 年龄   | 姓名      |
+--------+--------+-----------+
|      1 |     22 | 张三      |
|      2 |     25 | 李四      |
|      3 |     26 | 张学友    |
|      4 |     32 | 刘德华    |
|      5 |     55 | 张学良    |
+--------+--------+-----------+
5 rows in set (0.00 sec)

mysql> select * from stu where 姓名 like '张%';      ## 张后面有一个或多个字符
+--------+--------+-----------+
| 编号   | 年龄   | 姓名      |
+--------+--------+-----------+
|      1 |     22 | 张三      |
|      3 |     26 | 张学友    |
|      5 |     55 | 张学良    |
+--------+--------+-----------+
3 rows in set (0.00 sec)

mysql> select * from stu where 姓名 like '%学%';    ## 张前后面有一个或多个字符
+--------+--------+-----------+
| 编号   | 年龄   | 姓名      |
+--------+--------+-----------+
|      3 |     26 | 张学友    |
|      5 |     55 | 张学良    |
+--------+--------+-----------+
2 rows in set (0.00 sec)

mysql> select * from stu where 姓名 like '张_';    ## 张后面有一个字符
+--------+--------+--------+
| 编号   | 年龄   | 姓名   |
+--------+--------+--------+
|      1 |     22 | 张三   |
+--------+--------+--------+
1 row in set (0.00 sec)

2.4、BETWEEN AND(区间查询)

操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围,这些值可以是数值、⽂本或者⽇期,属于⼀个闭区间查询

selec 列名 from 表名 where 列名 between 值1 and 值2;

注意:

返回对应的列的值在[值1,值2]区间中的记录

使⽤between and可以提⾼语句的简洁度

两个临界值不要调换位置,只能是⼤于等于左边的值,并且⼩于等于右边的值

查询年龄在[25,32]之间的;

mysql> select * from stu where 年龄 between 25 and 32;
+--------+--------+-----------+
| 编号   | 年龄   | 姓名      |
+--------+--------+-----------+
|      2 |     25 | 李四      |
|      3 |     26 | 张学友    |
|      4 |     32 | 刘德华    |
+--------+--------+-----------+
3 rows in set (0.00 sec)

2.5、IN 查询

mysql> create table 年龄(id int(4),age int(10));     
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+-----------------+
| Tables_in_ceshi |
+-----------------+
| 年龄            |
| cs              |
| stu             |
+-----------------+
3 rows in set (0.00 sec)

mysql> insert into 年龄 values(1,14),(2,15),(3,18),(4,20),(5,28);
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from 年龄;
+------+------+
| id   | age  |
+------+------+
|    1 |   14 |
|    2 |   15 |
|    3 |   18 |
|    4 |   20 |
|    5 |   28 |
+------+------+
5 rows in set (0.01 sec)

mysql> select * from 年龄 where age in (15,18,28); ### 把查询内容放在括号内做为一个查询集合
+------+------+ 
| id   | age  |
+------+------+
|    2 |   15 |
|    3 |   18 |
|    5 |   28 |
+------+------+
3 rows in set (0.00 sec)

2.6、NOT IN 查询

mysql> select * from 年龄 where age not in (15,18,28);   ## 加上not表示不在集合内的
+------+------+
| id   | age  |
+------+------+
|    1 |   14 |
|    4 |   20 |
+------+------+
2 rows in set (0.00 sec)


2.7、NULL 存在的坑(IS NULL / IS NOT NULL:NULL值专用查询)

mysql> select * from test5;
+---+------+------+
| a | b    | c    |
+---+------+------+
| 1 |    2 | a    |
| 3 | NULL | b    |
| 4 |    5 | NULL |
+---+------+------+
3 rows in set (0.00 sec)

查询运算符、likebetween andinnot inNULL值查询不起效

mysql> select * from test5;
+---+------+------+
| a | b    | c    |
+---+------+------+
| 1 |    2 | a    |
| 3 | NULL | b    |
| 4 |    5 | NULL |
+---+------+------+
3 rows in set (0.00 sec)

mysql> select * from test5 where b is null;   ## 使用is null 可以查询到null项
+---+------+------+
| a | b    | c    |
+---+------+------+
| 3 | NULL | b    |
+---+------+------+
1 row in set (0.00 sec)


mysql> select * from test5 where b is not null;   ## 查询b字节不为空(is not null)的项
+---+------+------+
| a | b    | c    |
+---+------+------+
| 1 |    2 | a    |
| 4 |    5 | NULL |
+---+------+------+
2 rows in set (0.00 sec)

运算符总结:

  • like中的%可以匹配⼀个到多个任意的字符,_可以匹配任意⼀个字符
  • 空值查询需要使用IS NULL或者IS NOT NULL,其他查询运算符对NULL值无效
  • 建议创建表的时候,尽量设置表的字段不能为空,给字段设置⼀个默认值

第九篇 : 排序(正序、倒序)

1、排序查询(order by)

单字段排序

语法:select 字段名 from 表名 order by 字段1 [asc|desc];

注意:

需要排序的字段跟在order by之后;

asc|desc表⽰排序的规则,asc:升序,desc:降序,默认为asc,可以不写;

⽀持多个字段进⾏排序,多字段排序之间⽤逗号隔开

当表中设置了主键时,默认以主键升序的顺序。

mysql> create table test2(a int,b varchar(10));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test2 values (10,'jack'),(8,'tom'),(5,'ready'),(100,'javacode');
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from test2;      ## 创建test2表后查看其内容      
+------+----------+
| a    | b        |
+------+----------+
|   10 | jack     |
|    8 | tom      |
|    5 | ready    |
|  100 | javacode |
+------+----------+
4 rows in set (0.00 sec)

mysql> select * from test2 order by a;   ## 查询test2表,且按a字节正序排列
+------+----------+
| a    | b        |
+------+----------+
|    5 | ready    |
|    8 | tom      |
|   10 | jack     |
|  100 | javacode |
+------+----------+
4 rows in set (0.00 sec)
 
mysql> select * from test2 order by a desc;   ## 查询test2表,且按a字节倒序排列
+------+----------+
| a    | b        |
+------+----------+
|  100 | javacode |
|   10 | jack     |
|    8 | tom      |
|    5 | ready    |
+------+----------+
4 rows in set (0.00 sec)

2、多字段排列

mysql> select * from test2;                  ## 原边内容
+------+----------+------+------+
| a    | b        | c    | d    |
+------+----------+------+------+
|   10 | jack     |   18 |   16 |
|    8 | tom      |   19 |   21 |
|    5 | ready    |   20 |   24 |
|  100 | javacode |   29 |   28 |
|  100 | hiji     |   28 |   36 |
+------+----------+------+------+
5 rows in set (0.00 sec)


mysql> select * from test2 order by a,c desc;   ##按照a字节正序,再按照c字节倒序排列
+------+----------+------+------+
| a    | b        | c    | d    |
+------+----------+------+------+
|    5 | ready    |   20 |   24 |
|    8 | tom      |   19 |   21 |
|   10 | jack     |   18 |   16 |
|  100 | javacode |   29 |   28 |
|  100 | hiji     |   28 |   36 |
+------+----------+------+------+
5 rows in set (0.00 sec)

3、limit 介绍

limit⽤来限制select查询返回的⾏数,常⽤于分页等操作

语法:

select 列 from 表 limit [offset,] count;

3.1、获取前n行的记录

select 列 from 表 limit 0,n;

mysql> select * from test2;              ## 查看表test2的内容
+------+----------+------+------+
| a    | b        | c    | d    |
+------+----------+------+------+
|   10 | jack     |   18 |   16 |
|    8 | tom      |   19 |   21 |
|    5 | ready    |   20 |   24 |
|  100 | javacode |   29 |   28 |
|  100 | hiji     |   28 |   36 |
+------+----------+------+------+
5 rows in set (0.00 sec)

mysql> select * from test2 limit 0,3;     ## 查看表test2中从0行开始,后面的3行的记录
+------+-------+------+------+
| a    | b     | c    | d    |
+------+-------+------+------+
|   10 | jack  |   18 |   16 |
|    8 | tom   |   19 |   21 |
|    5 | ready |   20 |   24 |
+------+-------+------+------+
3 rows in set (0.00 sec)


mysql> select * from test2 limit 2,2;      ## limit 2,2表示第二行后面的两行,就是3和4 
                                              行记录
+------+----------+------+------+
| a    | b        | c    | d    |
+------+----------+------+------+
|    5 | ready    |   20 |   24 |
|  100 | javacode |   29 |   28 |
+------+----------+------+------+
2 rows in set (0.00 sec)

第十篇:子查询

出现在select语句中的select语句,通俗解释就是查询语句中嵌套着另一个查询语句,称为子查询或内查询

## 新建表classes

mysql> CREATE TABLE `classes` (
    -> `classid` int primary key AUTO_INCREMENT comment '班级i
    -> `classname` varchar(30) DEFAULT NULL comment '班级名称'
    -> ) ENGINE=InnoDB comment '班级表';
Query OK, 0 rows affected (0.00 sec)

mysql> insert  into `classes`(`classname`) values ('初三一班'),('初 三二班'),('初三三班');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0


## 新疆表students
mysql> CREATE TABLE `students` (
    -> `studentid` int primary key NOT NULL AUTO_INCREMENT comment '学生id',
    -> `studentname` varchar(20) DEFAULT NULL comment '学生姓名',
    -> `score` DECIMAL(10,2) DEFAULT NULL comment '毕业成绩', 
    -> `classid` int(4) DEFAULT NULL comment '所属班级id,来 源于classes表的classid'
    -> ) ENGINE=InnoDB comment '学生表';
Query OK, 0 rows affected (0.01 sec)

mysql> insert  into `students`(`studentname`,`score`,`classid`) values('brand',97.5,1),('helen',96.5,1),('lyn',96,1),('sol',97,1),('weng',100,1),('diny',92.7,1),('b1',81,2),('b2',82,2),('b3',83,2),('b4',84,2),('b5',85,2),('b6',86,2),('c1',71,3),('c2',72.5,3),('c3',73,3),('c4',74,3),('c5',75,3),('c6',76,3);
Query OK, 18 rows affected (0.00 sec)
Records: 18  Duplicates: 0  Warnings: 0

## 新建表scores
mysql> CREATE TABLE `scores`(
    -> `scoregrad` varchar(3) primary key  comment '等级:S、A、B、C、D',
    -> `downset`  int comment '分数评级下限',
    -> `upset` int comment '分数评级上限'
    -> ) comment '毕业考核分数排名表';
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO `scores` values ('S', 91, 100),('A', 81, 90),('B', 71, 80),('C', 61, 70),('D', 51,60);
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> show tables;                ## 查询当前库的所有的表
+--------------------------+
| Tables_in_Helenlyn_Class |
+--------------------------+
| classes                  |
| scores                   |
| students                 |
+--------------------------+
3 rows in set (0.00 sec)

以上为后面的实验环境。

1、子查询的分类

1.1、按照查询的返回结果

单行单列(标量子查询):返回的是一个具体列的内容,可以理解为一个单值数据;

单行多列(行子查询):返回一行数据中多个列的内容;

多行单列(列子查询):返回多行记录之中同一列的内容,相当于给出了一个操作范围;

多行多列(表子查询):查询返回的结果是一张临时表;

1.2、按子查询位置区分

select后的子查询:仅仅支持标量子查询,即只能返回一个单值数据。

from型子查询:把内层的查询结果当成临时表,供外层sql再次查询,所以支持的是表子查询

where或having型子查询:指把内部查询的结果作为外层查询的比较条件,支持标量子查询(单列单行)、列子查询(单列多行)、行子查询(多列多行)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值