MySQL数据库基础语句(进阶版)
目录
第一篇: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的语言分类
- DQL**(DataQuery Language**):数据查询语⾔ select 相关语句
- DML**(DataManipulateLanguage)**:数据操作语⾔ insert 、update、delete 语句
- DDL**(DataDe>ineLanguge)**:数据定义语⾔ create、drop、alter 语句
- TCL**(TransactionControlLanguage)**:事务控制语⾔ 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权限,那么该⽤户就同时拥有了select和insert权限。
示例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)
查询运算符、**like、betweenand、in、notin对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)
运算符总结:
- like**中的%可以匹配⼀个到多个任意的字符,_可以匹配任意⼀个字符**
- 空值查询需要使用**ISNULL或者IS NOTNULL,其他查询运算符对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型子查询:指把内部查询的结果作为外层查询的比较条件,支持标量子查询(单列单行)、列子查询(单列多行)、行子查询(多列多行)
还没有评论,来说两句吧...