目录
4、显示MySQL服务器上所有的库 show databases;
7、在当前位置查看其他数据库中的所有表 show tables from 库名;
8、查看表的创建语句 show create table 表名;
10、显示当前所在的库 select database();
11、查询当前MySQL支持的存储引擎 show engines;
示例2、test2可以对company库中所有的表执行select
示例三、test03可以对company库中所有的表执行select、update
示例四、test1用户只能查询mysql.user表的user,host字段
方法一:命令行删除:drop user '用户名'@'主机名'
2.7、NULL 存在的坑(IS NULL / IS NOT NULL:NULL值专用查询)
目前的常用数据库有mysql、oracle、sqlserver、db2等
①、oracle性能排名第⼀,服务也是相当到位的,但是收费也是⾮常
⾼的,⾦融公司对数据库稳定性要求⽐较⾼,⼀般会选择oracle
②、mysql是免费的,其他⼏个⽬前暂时收费的,mysql在互联⽹公司使⽤率也是排名第⼀, 资料也⾮常完善,社区也⾮常活跃,所以我们主要学习mysql
①、DB:数据库,存储数据的容器
②、DBMS:数据库管理系统,又称为数据库软件或数据库产品,⽤于创建或管理DB。
③、SQL:结构化查询语⾔,⽤于和数据库通信的语⾔,不是某个数据库软件持有的,⽽是⼏乎所有的主流数据库软件通⽤的语⾔
①、数据存放在表中,然后表存放在数据库中
②、⼀个库中可以有多张表,每张表具有唯⼀的名称(表名)来标识⾃⼰
③、表中有⼀个或多个列,列又称为“字段”,相当于java中的“属性”
④、表中每⼀⾏数据,相当于java中的“对象”
语法一:mysql -u root -p123123
此方法可免交互登录,但是密码明文显示,不安全。

语法二:mysql -u root -p
自行通过交互输入密码完成登录,比较安全

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

[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
mysql> show databases;
- mysql> show databases; #### 显示当前MySQL数据库服务器所有的数据库
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | company |
- | mysql |
- | performance_schema |
- | sys |
- +--------------------+
- 5 rows in set (0.01 sec)
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
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)
mysql> show tables from 库名;
- mysql> show tables from company;
- +-------------------+
- | Tables_in_company |
- +-------------------+
- | info |
- +-------------------+
- 1 row in set (0.00 sec)
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)
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)
mysql> select database();
- mysql> select database();
- +------------+
- | database() |
- +------------+
- | company |
- +------------+
- 1 row in set (0.00 sec)
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)
①、不区分⼤⼩写,但建议关键字⼤写,表名、列名⼩写
②、每条命令最好⽤英⽂分号结尾
③、每条命令根据需要,可以进⾏缩进或换⾏
主要分为五大类:
tinytext、text、mediumtext、longtext
数据类新的一些建议:
mysql为了安全性考虑,采⽤(主机名+⽤户名)来判断⼀个⽤户的⾝份,因为在互联⽹中很难通过⽤户名来判断⼀个⽤户的⾝份,但是我们可以通过ip或者主机名判断⼀台机器,某个用户通过这个机器过来的,我们可以识别为⼀个⽤户,所以mysql中采⽤⽤户名+主机名来识别用户的⾝份。当⼀个用户对mysql发送指令的时候,mysql就是通过用户名和来源(主机)来断定⽤户的权限。
权限生效时间
⽤户及权限信息放在库名为mysql的库中,mysql启动时,这些内容被读进内存并且从此时⽣效,所以如果通过直接操作这些表来修改⽤户及权限信息的,需要重启mysql或者执⾏flush privileges;才可以⽣效。
语法:
create user 用户名@[主机名] [identified by '密码'];
①、主机名可不写:默认值为%,表⽰这个⽤户可以从任何主机连接mysql服务器
②、密码项看可以省略,表示无密登录
使用命令:
①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)
验证:

新建用户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)
新建用户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)
方式一:通过管理员修改密码
- 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)
创建⽤户之后,需要给⽤户授权,才有意义
语法:
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权限,那么该⽤户就同时拥有了select和insert权限。
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)
- mysql> grant select on company.* to 'test2'@'localhost';
- Query OK, 0 rows affected (0.00 sec)
- mysql> grant select,update on company.* to 'test03'@'192.168.159.%';
- Query OK, 0 rows affected (0.00 sec)
- mysql> grant select(user,host) on mysql.user to 'test1'@'%';
- Query OK, 0 rows affected (0.00 sec)
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)
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
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)
方法一:命令行删除: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:数据定义语句。主要用于对数据库,表进行一些管理操作
如:建库、删库、建表、修改表、删除表、对列的增删改等等
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.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)
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)
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)
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)
①、添加列
- 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(Data Manipulation Language)数据操作语⾔,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除。
方法一:
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)
语法:
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)
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)
①drop (删除表):删除内容和定义,释放空间,简单来说就是把整个表去掉,以后要新增数据是不可能的,除⾮新增⼀个表
②truncate (清空表中的数据):删除内容、释放空间但不删除定义(保留表的数据结构),与drop不同的是,只是清空表数据⽽已。
注意:truncate不能删除具体⾏数据,要删就要把整个表清空了。
③delete (删除表中的数据):delete 语句⽤于删除表中的⾏。delete语句执⾏删除的过程是每次从表中删除⼀⾏,并且同时将该⾏的删除操作作为事务记录在⽇志中保存, 以便进⾏进⾏回滚操作。
删除速度:drop> truncate > delete
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)
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)
在创建数据表时,⼀般都会使⽤英⽂单词或英⽂单词缩写来设置字段名,在查询时列名都会以英⽂的形式显⽰,这样会给⽤户查看数据带来不便,这种情况可以使⽤别名来代替英⽂列名,增强阅读性。
语法:
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 列名 from 表名 where 列 运算符值;
注意: 数值按照大小比较
字符按照ASCII码对应的值进行比较,比较时按照字符对应的位置一个字符一个字符的比较.(由于字符集的原因ASCII码比较时,没有大小写其区别)
(注意:关键字where,where后⾯跟上⼀个或者多个条件,条件是对前⾯数据的过滤,只有满⾜where后⾯条件的数据才会被执行)
语法:
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)
不等于有两种写法:<>或者!=
方法一: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)
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)
当我们需要使⽤多个条件进⾏查询的时候,需要使用逻辑查询运算符
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)
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)
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)
操作符 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)
- 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)
- mysql> select * from 年龄 where age not in (15,18,28); ## 加上not表示不在集合内的
- +------+------+
- | id | age |
- +------+------+
- | 1 | 14 |
- | 4 | 20 |
- +------+------+
- 2 rows in set (0.00 sec)
- mysql> select * from test5;
- +---+------+------+
- | a | b | c |
- +---+------+------+
- | 1 | 2 | a |
- | 3 | NULL | b |
- | 4 | 5 | NULL |
- +---+------+------+
- 3 rows in set (0.00 sec)
查询运算符、like、between and、in、not in对NULL值查询不起效
- 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)
运算符总结:
语法: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)
- 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)
limit⽤来限制select查询返回的⾏数,常⽤于分页等操作
语法:
select 列 from 表 limit [offset,] count;
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)
以上为后面的实验环境。
单行单列(标量子查询):返回的是一个具体列的内容,可以理解为一个单值数据;
单行多列(行子查询):返回一行数据中多个列的内容;
多行单列(列子查询):返回多行记录之中同一列的内容,相当于给出了一个操作范围;
多行多列(表子查询):查询返回的结果是一张临时表;
select后的子查询:仅仅支持标量子查询,即只能返回一个单值数据。
from型子查询:把内层的查询结果当成临时表,供外层sql再次查询,所以支持的是表子查询
where或having型子查询:指把内部查询的结果作为外层查询的比较条件,支持标量子查询(单列单行)、列子查询(单列多行)、行子查询(多列多行)