SQL概述
- 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言
- 其主要用来进行数据库查询和程序设计
- SQL可以用来存取数据 查询数据 更新和管理数据库系统
SQL语句结构
数据查询语言(DQL)
- 其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。
- 保留字SELECT 是 DQL(也是所有 SQL)用得最多的动词,其他 DQL 常用的保留字有 WHERE, ORDER BY, GROUP BY 和 HAVING。这些 DQL 保留字常与其他类型的 SQL 语句一起使用。
数据操作语言(DML)
- 其语句包括动词 INSERT, UPDATE 和 DELETE。 它们分别用于添加,修改和删除表中的行。也称为动作查询语言
事务处理语言(TPL)
- 它的语句能确保被 DML 语句影响的表的所有行及时得以更新。
- TPL 语句包括 BEGINTRANSACTION, COMMIT 和 ROLLBACK。
数据控制语言(DCL)
- 它的语句通过 GRANT 或 REVOKE 获得许可,确定单个用户和用户组对数据库对象的访问
- 某些RDBMS 可用 GRANT 或 REVOKE 控制对表单个列的访问
数据定义语言(DDL)
- 其语句包括动词 CREATE 和 DROP。 在数据库中创建新表或删除表( CREAT TABLE 或 DROP TABLE)
- 其可为表加入索引 同时也是动作查询的一部分
指针控制语言(CCL)
- 它的语句,像 DECLARE CURSOR, FETCH INTO 和 UPDATE WHERE CURRENT 用于对一个或多个表单独行的操作。
SQL语句书写
查看数据库
mysql> show databases; # 查看当前存在的数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> show databasesG
*************************** 1. row ***************************
Database: information_schema
*************************** 2. row ***************************
Database: mysql
*************************** 3. row ***************************
Database: performance_schema
*************************** 4. row ***************************
Database: sys
[root@SR ~]# mysql -e "show databases" -uroot -proot123 # -e可以不再mysql的视图下执行sql语句
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
包括数据库名称 数据库表 表栏数据类型等
mysql
- 其MySQL的系统库
- 里面保存账户的权限信息 账户信息等
- 其是MySQL的系统库
- 其包含了MySQL用户信息 权限信息等
sys
- MySQL5.7新增的数据库 主要包含数据库的元信息等
- 数据库元信息包含数据库名或表名 数据类型 权限等
创建数据库
mysql> create database test; # 数据库创建
mysql> show create database test; # 查看数据库的创建过程
+----------+-----------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-----------------------------------------------------------------+
# 这样带有连字符或者关键字的名称 需要使用反引号
mysql> create database `test-1`;
mysql> create database `create`
数据库操作方法
use + 数据库名称
# 使用某个数据库
mysql> use test; # 切换到test这个数据库
Database changed
select database()
# 查看当前所属的位置
mysql> select database();
+------------+
| database() |
+------------+
| test |
+------------+
# 如果没有选择数据库则显示null
mysql> select database();
+------------+
| database() |
+------------+
| NULL |
+------------+
select user()
# 查看当前登录的用户
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
select now();
# 查看当前系统时间
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2020-07-16 10:31:22 |
+---------------------+
删除数据库
# 删库无任何提示 做好跑路的准备
mysql> drop database `test-1`;
# 数据库本质还是存放在磁盘中 对于linux中一切都是文件 直接删除文件
[root@SR ~]# cd /var/lib/mysql
[root@SR mysql]# rm -fr test/
# 条件判断删除
mysql> create database test if not exists; # 如果不存在创建
mysql> drop database if exists test; # 存在删除
创建数据表
mysql> create tables student(id int(11) ,name varchar(254),age int(11));
查看表执行命令
mysql> show create table student;
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
`id` int(11) DEFAULT NULL,
`name` varchar(254) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
修改表信息
修改存储引擎与编码
# 上述可以看到存储引擎默认为InnoDB 编码为latin1
mysql> alter table student ENGINE=MYISAM CHARSET=utf8; # 修改默认的存储因为与编码
mysql> show create table student;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
`id` int(11) DEFAULT NULL,
`name` varchar(254) CHARACTER SET latin1 DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
修改表名
mysql> alter table student rename students;
mysql> show tables;
+----------------+
| Tables_in_user |
+----------------+
| students |
+----------------+
修改表中字段
# modify只能修改表中数据类型
mysql> alter table students modify id int(10);
mysql> desc students;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(10) | YES | | NULL | |
| name | varchar(254) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
修改字段与数据类型
# change不但能改变字段名称同时能修改字段类型
mysql> alter table students change age ages int(10);
表添加操作
添加字段
mysql> alter table students add addr varchar(254);
mysql> desc students;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(10) | YES | | NULL | |
| name | varchar(254) | YES | | NULL | |
| ages | int(10) | YES | | NULL | |
| addr | varchar(254) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
mysql> alter table students add uuid varchar(254) first; # 首行添加一个字段
mysql> desc students;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| uuid | varchar(254) | YES | | NULL | |
| id | int(10) | YES | | NULL | |
| name | varchar(254) | YES | | NULL | |
| ages | int(10) | YES | | NULL | |
| addr | varchar(254) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
mysql> alter table students add school varchar(40) after ages; # 在ages后面添加一个school字段
mysql> desc students;
+--------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| uuid | varchar(254) | YES | | NULL | |
| id | int(10) | YES | | NULL | |
| name | varchar(254) | YES | | NULL | |
| ages | int(10) | YES | | NULL | |
| school | varchar(40) | YES | | NULL | |
| addr | varchar(254) | YES | | NULL | |
+--------+--------------+------+-----+---------+-------+
表删除操作
删除字段
mysql> create table test( id int(10),name varchar(254));
mysql> alter table tests drop column id;
mysql> desc tests;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name | varchar(254) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
删除表格
mysql> drop table test;
记录操作
插入数据
mysql> insert into students values(1,'SR',18,'China'); # 插入一行
mysql> insert into students values(2,'MZ',18,'Chinae'),(3,'HM',20,'China'); # 插入多行
mysql> insert into students(id,name) values(3,'HH'); # 指定字段插入值
表记录查询
mysql> select * from students; # 查询所有
+------+------+------+--------+
| id | name | ages | addr |
+------+------+------+--------+
| 1 | SR | 18 | China |
| 2 | MZ | 18 | Chinae |
| 3 | HM | 20 | China |
| 3 | HH | NULL | NULL |
+------+------+------+--------+
mysql> select id,name from students; # 查询指定字段
+------+------+
| id | name |
+------+------+
| 1 | SR |
| 2 | MZ |
| 3 | HM |
| 3 | HH |
+------+------+
删除记录
mysql> delete from user.students where id=1; # user.students 当不在students所在的库中 就使用.语法
mysql> delete from students where ages is null; # 删除年纪为null的学生
修改记录
mysql> update students set ages=16 where id=2; # 更改id为2的年龄
mysql> update students set addr="china"; # addr字段都被更改为china
条件查询
distinct:去重
mysql> insert into students values(1,'zhangs',21),(2,'lis',24),(3,'jk',24),(4,'lo',25),(5,'io',25),(6,'jk',22),(7,'lo',25);
mysql> select distinct name,age from students; # 去掉重复的数据
+--------+------+
| name | age |
+--------+------+
| zhangs | 21 |
| lis | 24 |
| jk | 24 |
| lo | 25 |
| io | 25 |
| jk | 22 |
+--------+------+
and or逻辑条件查询
mysql> select name from students where id >3 and id <6; # 查询 3<id>6的用户名称
+------+
| name |
+------+
| lo |
| io |
+------+
mysql> select name from students where id >3 or id <6; # 只要满足一个条件即可
+--------+
| name |
+--------+
| zhangs |
| lis |
| jk |
| lo |
| io |
| jk |
| lo |
+--------+
mysql> select name from students where name='lo' and(age=25 or age=24);
+------+
| name |
+------+
| lo |
| lo |
+------+
2 rows in set (0.00 sec)
in
mysql> select name from students where id in(3,4,5,6); # 查询id在括号内的
+------+
| name |
+------+
| jk |
| lo |
| io |
| jk |
+------+
between and
mysql> select name from students where id between 2 and 5; # 查询2-5之间的
+------+
| name |
+------+
| lis |
| jk |
| lo |
| io |
+------+
order by
asc
mysql> select id from students order by id asc; # 升序查询
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+------+
desc
mysql> select id from students order by id desc; # 降序查询
+------+
| id |
+------+
| 7 |
| 6 |
| 5 |
| 4 |
| 3 |
| 2 |
| 1 |
+------+
binary
# 区分大小写
mysql> select * from students where binary name='JK'; # 没有大写名称为JK的用户
Empty set (0.00 sec)
mysql> select * from students where binary name='jk'; # 区分大小写
+------+------+------+
| id | name | age |
+------+------+------+
| 3 | jk | 24 |
| 6 | jk | 22 |
+------+------+------+
truncat
- 清除表中的数据
- 将auto_increment字段中的数据清零 再次插入数据从1开始
mysql> delete from test3; # 清空上述test3表
mysql> select * from test3;
Empty set (0.00 sec)
mysql> insert into test3(test)values(12); # 插入数据
# 使用delete发现此时id字段接着保留上次最大值 在自增1
mysql> select * from test3;
+----+------+
| id | test |
+----+------+
| 11 | 12 |
+----+------+
mysql> truncate test3; # 清空表
mysql> select * from test3;
Empty set (0.01 sec)
mysql> insert into test3(test)values(12);
mysql> select * from test3; # 此时id字段初始值为1
+----+------+
| id | test |
+----+------+
| 1 | 12 |
+----+------+