MySQL中的基本SQL语句
Posted 夜间独行的浪子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中的基本SQL语句相关的知识,希望对你有一定的参考价值。
标准SQL包含了4种基本的语句类别:
- DDL语句,数据定义语句,主要用来定义数据库,表名,字段,例如create,drop,alter.
- DML语句,数据操作语句,用来对数据记录的增删改查,还用来保证数据的一致性。主要有select,delete,insert,update语句。
- DCL语句,数据控制语句,用于控制不同数据对象访问级别的语句。定义了数据库、表、表、用户的访问权限和完全级别。常用的语句包括grant、revoke等
- TCL语句,事务控制语句,用来确保事务的特性。
CREATE TABLE建表语句
在介绍建表语句之前,先简单说明一下创建数据库的语句。
mysql> create database mytest; #创建数据库 Query OK, 1 row affected (0.00 sec) mysql> use mytest; #改变当前的数据库 Database changed mysql> select database(); #查看当前选中的数据库 +------------+ | database() | +------------+ | mytest | +------------+ 1 row in set (0.00 sec) mysql> select user(); #查看当前登录的用户 +----------------+ | user() | +----------------+ | root@localhost | +----------------+ 1 row in set (0.00 sec) mysql> show create database mytest; #查看创建数据库的语句,默认添加了字符集,会在字符集中介绍 +----------+-------------------------------------------------------------------+ | Database | Create Database | +----------+-------------------------------------------------------------------+ | mytest | CREATE DATABASE `mytest` /*!40100 DEFAULT CHARACTER SET latin1 */ | +----------+-------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select version(); #查看当前数据库的版本 +------------+ | version() | +------------+ | 5.7.22-log | +------------+ 1 row in set (0.00 sec) mysql>
数据库创建之后,然后就是建表:
建表语句的作用就是在数据库创建一张二维表,因此在建表语句要指定每一个字段名(二维表中的列名),还有要指定对填入这些字段的数据的限制(约束条件),同时建表语句还可以指定这张表的字符集,以及之前规划好的索引等。 create table tb1( c1 int auto_increment primary key, c2 varchar(20) ); 创建了tb1表,表中有两列(两个字段), auto_increment: 指定字段c1为自增字段,mysql中一个表中只能有一个自增字段,且须为主键。 mysql> show create table tb1\\G *************************** 1. row *************************** Table: tb1 Create Table: CREATE TABLE `tb1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, `c2` varchar(20) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) #查看建表语句,mysql会默认选择表的存储引擎和字符集 mysql> system ls /data/mysql/mytest/tb1.* /data/mysql/mytest/tb1.frm /data/mysql/mytest/tb1.ibd #在datadir对应的目录下面会生成对应的表结构文件tb1.frm,和数据文件tb1.ibd。
MySQL支持在建表时指定temporary参数,这样创建的表是临时表,临时表是基于会话级别的表。
#创建临时表,临时表使用show tables查不到其存在,但是可以查看表结构,也可以向临时表插入数据
mysql> create temporary table tb2(id int, info varchar(20)); Query OK, 0 rows affected (0.00 sec) mysql> show tables; +------------------+ | Tables_in_mytest | +------------------+ | tb1 | +------------------+ 1 row in set (0.00 sec) mysql> show create table tb2; +-------+--------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------------------------------------------------------------------------------+ | tb2 | CREATE TEMPORARY TABLE `tb2` ( `id` int(11) DEFAULT NULL, `info` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +-------+--------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> insert into tb2 values(1,"a"); Query OK, 1 row affected (0.00 sec)
#临时表的表结构存在于/tmp/目录下面
mysql> show variables like "tmpdir";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir | /tmp |
+---------------+-------+
1 row in set (0.01 sec)
[root@test3 tmp]# pwd
/tmp
[root@test3 tmp]# ls
#sql2966_99_0.frm
#临时表的数据文件在MySQL5.7之后由专门的文件存储
mysql> show variables like "innodb%temp%";
+----------------------------+-----------------------+
| Variable_name | Value |
+----------------------------+-----------------------+
| innodb_temp_data_file_path | ibtmp1:12M:autoextend |
+----------------------------+-----------------------+
1 row in set (0.00 sec)
#临时表有专门的存储引擎
mysql> show variables like "default%tmp%";
+----------------------------+--------+
| Variable_name | Value |
+----------------------------+--------+
| default_tmp_storage_engine | InnoDB |
+----------------------------+--------+
1 row in set (0.00 sec)
#临时表只对当前会话有效,当前会话断开,临时表会自动删除,在其余的会话也看不到临时表。
mysql> insert into tb2 values(1,"a");
ERROR 1146 (42S02): Table \'mytest.tb2\' doesn\'t exist
mysql>
crate table语句还有很多参数可以使用,这些只是基本的用法,可以查看官方文档,也可以查看work bench中的介绍。
删除数据库和表
#删除数据库 mysql> drop database mytesti; Query OK, 0 rows affected (0.00 sec) #删除表,和表结构一起删除 mysql> drop table tb1; Query OK, 0 rows affected (0.02 sec) #删除表中的所有记录,但是不删除表结构 mysql> truncate tb4; Query OK, 0 rows affected (0.04 sec) #delete用来删除表中的数据 mysql> delete table tb2; 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 \'table tb2\' at line 1 mysql> delete from tb2 where c = 1; Query OK, 0 rows affected (0.00 sec)
修改表结构
#创建如下表 CREATE TABLE IF NOT EXISTS tb2 ( id INT, NAME VARCHAR (20), email VARCHAR (50) ); #查看表的结构如下: mysql> desc tb2; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | NAME | varchar(20) | YES | | NULL | | | email | varchar(50) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) #修改表名 // ALTER TABLE OLD_TB_NAME RENAME [TO] NEW_TB_NAME; mysql> alter table tb2 rename to tb3; Query OK, 0 rows affected (0.00 sec) // TO可以省略 mysql> alter table tb3 rename tb2; Query OK, 0 rows affected (0.00 sec)
#修改字段数据类型(把id字段的int类型修改为varchar类型)
// ALTER TABLE TBNAME MODIFY 字段名 新属性
ALTER TABLE tb2 MODIFY id VARCHAR(10);
mysql> desc tb2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | varchar(10) | YES | | NULL | |
| NAME | varchar(20) | YES | | NULL | |
| email | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
#修改字段名 (把上面的id字段名修改为user_id)
ALTER TABLE TBNAME CHANGE 旧字段名 新字段名 约束条件;
#需要注意的是这种方法不仅可以修改字段名,还可以修改字段的数据类型。
ALTER TABLE tb2 change id user_id varchar(10);
#增加字段
//ALTER TABLE 表名 ADD 新字段名 date FIRST|AFTER 字段A名。 first表示新加的字段在A的前面,after表示在A的后面。
ALTER TABLE tb2 ADD birth date; #默认的新增字段是在最后插入的。
mysql> desc tb2;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| user_id | varchar(10) | YES | | NULL | |
| NAME | varchar(20) | YES | | NULL | |
| email | varchar(50) | YES | | NULL | |
| birth | date | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
#删除字段
//ALTER TABLE 表名 DROP 字段名;
ALTER TABLE tb2 DROP user_id;
#字段排序:
ALTER TABLE TBNAME MODIFY 字段1 数据类型 FIRST|AFTER 字段2.
#更改表的存储引擎:
ALTER TABLE 表名 engine = "存储引擎名"
#删除外键
ALTER TABLE 表名 FOREIGN KEY 外键别名。
insert插入数据
insert用于向表中插入数据。
#默认插入所有的字段 insert into tb2 values(1,"a"); #插入指定的字段 insert into tb2(id) values("3"); #一次插入多个数值 insert into tb2 values(4,"c"),(5,"d"),(6,"e"); mysql> select * from tb2; +------+------+ | id | NAME | +------+------+ | 1 | a | | 3 | NULL | | 4 | c | | 5 | d | | 6 | e | +------+------+ 5 rows in set (0.00 sec) mysql>
update更新数据
update更新语句一般于where条件句联合使用。
mysql> update tb2 set name = "b" where id =3; Query OK, 1 row affected (0.02 sec) Rows matched: 1 Changed: 1 Warnings: 0 #如果不使用where条件语句限制,则更新表中所有的行
select查询
在查询之前先导入MySQL官方提供的employeeso库数据。
下载地址:https://github.com/datacharmer/test_db/archive/master.zip
方法:直接下载zip压缩包,然后直接导入employees.sql文件即可
导入的表,各个表之间的关系如下:
单表查询
mysql> select * from employees limit 1; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | +--------+------------+------------+-----------+--------+------------+ 1 row in set (0.00 sec) mysql> select emp_no, concat(first_name, " ", last_name) as full_name, gender from employees limit 1; +--------+----------------+--------+ | emp_no | full_name | gender | +--------+----------------+--------+ | 10001 | Georgi Facello | M | +--------+----------------+--------+ 1 row in set (0.01 sec) #查询可以使用*号代替表中所有的字段,也可以使用对应字段的字符,只查询出对应的要查询的字段。 #concat函数,就是连接字符串,在这里和as结合,连接了两个字段,并且重命名为full_name。
MySQL中有许多内嵌的函数可以调用,详细的函数列表参照:https://dev.mysql.com/doc/refman/5.7/en/string-functions.html 可以使用Google浏览器打开,可以翻译为中文!
单表查询和一些条件语句结合:
查看表中记录的数量
mysql> select count(*) from employees; +----------+ | count(*) | +----------+ | 300024 | +----------+ 1 row in set (0.53 sec)
使用order by语句按照某字段排序:
#默认是按照正序排列 mysql> select * from employees order by emp_no limit 3; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | +--------+------------+------------+-----------+--------+------------+ 3 rows in set (0.00 sec) #加入关键字按照倒序排列 mysql> select * from employees order by emp_no desc limit 3; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 499999 | 1958-05-01 | Sachin | Tsukuda | M | 1997-11-30 | | 499998 | 1956-09-05 | Patricia | Breugel | M | 1993-10-13 | | 499997 | 1961-08-03 | Berhard | Lenart | M | 1986-04-21 | +--------+------------+------------+-----------+--------+------------+ 3 rows in set (0.00 sec)
使用where条件语句:
#查找部门经理表中,员工号为d006的记录 mysql> select * from dept_manager where dept_no = "d006"; +--------+---------+------------+------------+ | emp_no | dept_no | from_date | to_date | +--------+---------+------------+------------+ | 110725 | d006 | 1985-01-01 | 1989-05-06 | | 110765 | d006 | 1989-05-06 | 1991-09-12 | | 110800 | d006 | 1991-09-12 | 1994-06-28 | | 110854 | d006 | 1994-06-28 | 9999-01-01 | +--------+---------+------------+------------+ 4 rows in set (0.06 sec) #where可以使用大于,小于,不等于 SELECT * FROM dept_manager where dept_no > "d006"; SELECT * FROM dept_manager where dept_no < "d004"; SELECT * FROM dept_manager where dept_no <> "d006"; #where语句也可以使用in关键字 mysql> select * from dept_manager where dept_no in ("d006", "d001"); +--------+---------+------------+------------+ | emp_no | dept_no | from_date | to_date |以上是关于MySQL中的基本SQL语句的主要内容,如果未能解决你的问题,请参考以下文章