sql的概念
结构化查询语言,简称SQL,是一种特殊目的的编程语言,是一种特殊母的的编程语言,是一种数据库查询和程序设计语言,用于存取数据及查询,更新和管理关系数据库系统
本例是5.7.26版本的mysql数据库,不同版本mysql的在sql语句的使用基本没有区别,
而是在其他方面会有区别
数据库操作
1)查看数据库
1.进入mysql中查看
mysql> show databases;
默认有四个库,
information_schema:这个数据库保存了mysql服务器所以数据库的信息, 如果数据库名,数据库的表,访问权限等,是mysql的元数据库
performance_schema:是mysql5.5新增的一个性能优化的引擎
mysql:这个是系统库,有账号信息,权限等
sys:mysql5.7增加了sys系统数据库,也是mysql的元数据库
2.在shell中查看
上图的Warning不是报错,而是提示你的mysql用户密码,暴露在了终端当中
[root@localhost ~]# mysql -e 'show databases'
-uroot -p123
(-e是要执行的命令,-u是用户名,-p是密码)
3.已行的方式显示数据库
mysql> show databases\G;
2)创建数据库
语法如下
create database 数据库名;
1.创建数据库注意事项
1)实际上在mysql中,数据库都是以目录的形式存放在系统中的,但是linux系统中,目录不许有\,/,:,*,?,”,<,>,|
,这些符号,进而mysql数据库的命名,也不许有这些字符
2)数据库的名字不能超过64个字符,包含特殊字符的名字或者是全部由数字或保留组成的名字必须使用反引号``包起来
3)数据库不可以重名
2.创建两个数据库
mysql> create database Name;
下图名字这种有特殊符号,必须使用反撇号括起来,否则会报错
查看刚刚创建的数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Name |
| Name-test |
3.查看数据库目录
这个目录,可能会和我不一样,决定于编译时候选择的存放数据目录
[root@localhost ~]# cd /data/mysql/data/
那个Name-test数据库目录,数据名有特殊字符,系统会有编码
3) 选择要操作的数据
使用use ,加数据库名,就可以进入了,后续的操作都是在此数据库中
mysql> use Name;
Database changed
4) 查看自己所处的数据库,与系统默认的函数
( 如下,表示现在在Name数据库中)
mysql> select database();
+------------+
| database() |
+------------+
| Name |
+------------+
1 row in set (0.00 sec)
(调用user()函数,显示当前登陆用户)
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
(下面这个,可以显示系统时间)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2019-12-23 23:46:11 |
+---------------------+
1 row in set (0.00 sec)
5) 删除数据库
1.删除指定数据库
drop database 数据库名
(有特殊字符,删除的时候也要加反撇号)
2. 移动数据库目录
类似删除,但是需要的时候,移动目录回来数据库就会恢复
mysql> create database an;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Name |
| an
...
[root@localhost ~]# cd /data/mysql/data/
[root@localhost data]# mv an/ /db_up/
这时回到数据库中,'an'
数据库已经不存在了,如果需要恢复数据库,只要运行如下命令,把目录移动回来就行了
[root@localhost ~]# mv /db_up/an/ /data/mysql/data/
3.使用 IF EXISTS子句以避免删除不存在的数据库时出现的mysql错误信息
(其实 'www'数据库并不存在,但是这样删除不会报错,但是如果这个库存在会被删除,也不会报错)
mysql> drop database if exists www;
Query OK, 0 rows affected, 1 warning (0.00 sec)
(这种方式在写脚本,也在主从复制中应用,因为这种方式不会报错,如果脚本中出现报错,可能会中断,主从复制的时候如果出错也可能会断掉)
也可以在创建数据库时使用
mysql> create database if not exists mysql;
Query OK, 1 row affected, 1 warning (0.00 sec)
(这里,mysql数据库原来就有,这里没有创建成功,没有报错,如果数据库不存在则会创建)
关于表的操作
1) 创建表
语法如下
create table 表名 (字段名 类型, 字段名 类型, 字段名 类型)
mysql> create table chuqing(id int(50),name char(40),age int(20));
Query OK, 0 rows affected (0.06 sec)
(后面的类型不是本例重点,int是整数型,char是字符串型,必须填对应的数据类型,否则会报错,那些数字是最大字符数)
2) 查看表的相关信息
查看当前库中的所有表
mysql> show tables;
+----------------+
| Tables_in_Name |
+----------------+
| chuqing |
+----------------+
1 row in set (0.00 sec)
3)查看表的结构
可以使用 desc 命令来实现 后面跟上表名
这里解释一下,里面的意思
Field:是列的名称
Type:类型,整数型等
Null:此字段是否为空
Key:此字段是否是主键
Default:列的默认值
Extra:描述信息
4) 查看创建表的时候执行了那些命令
mysql> show create table chuqing\G;
结果如下图
5)指定默认存储引擎和字符集
在新建表的时候,也可以指定存储引擎为InnoDB,和字符编码utf8
mysql> create table chuqing2(id int(10),name char(30),age int(10)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> show create table chuqing2\G;
6)删除表
语法如下
drop table 表名;
mysql> drop tables chuqing2;
Query OK, 0 rows affected (0.00 sec)
7)修改表名称
语法如下
alter table 表名 rename 新表名
修改 ‘chuqing’ 表的表名为 'goto’
mysql> alter table chuqing rename goto;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
+----------------+
| Tables_in_Name |
+----------------+
| goto |
+----------------+
1 row in set (0.00 sec)
8)修改表中的字段类型
语法
alter table 表名 modify 要修改的字段名 要修改的类型
这种方式只可以更字段类型,不可以改字段名
mysql> alter table goto modify id int(100);
Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
(将id字段的int类型 最大字符数改为100字符)
查看
mysql> desc goto;
9)修改表中的字段类型和字段名称
语法
alter table 表名 change 原字段名 新字段名 新字段类型
(更改id字段名为uid,int字符最大字符为60)
mysql> alter table goto change id uid int(60);
Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0
查看结果如下
mysql> desc goto;
CHANGE对列表重命名和更改列的类型,需要给定旧的名称和新的名称,还有新的字段类型;MODIFY可以改变列的类型,可以不进行重命名操作,不用给定新的列表名
10) 在表中添加字段
语法如下
alter table 表名 add 字段名 字段类型;
如下
mysql> alter table goto add address char(10);
Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0
(默认添加到最后)
mysql> desc goto;
11) 在表中指定位置添加字段
1.在第一列添加一个字段
如下添加pid字段
mysql> alter table goto add pid int(10) first;
Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
(依靠 后面的first 参数)
mysql> desc goto;
+---------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| pid | int(10) | YES | | NULL | |
| uid | int(60) | YES | | NULL | |
…
2.在指定字段后面添加
在name后面添加一个www字段
mysql> alter table goto add www char(10) after name;
Query OK, 0 rows affected (0.08 sec) Records: 0 Duplicates: 0 Warnings: 0
查看如下
12)删除表中的字段
语法如下
alter table 表名 drop 字段名;
mysql> alter table goto drop www;
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc goto;
(www那行字段,包括信息都没了)
表中记录的操作
1)插入字段<记录>insert
语法如下
insert into 表名 values(字段值1,字段值2,字段值3);
先删除原来的表
mysql> drop table goto;
Query OK, 0 rows affected (0.00 sec)
创建一个name表
mysql> create table name(id int(20),name char(40),age int);
Query OK, 0 rows affected (0.04 sec)
注意值的类型整数型,字符串要,要对应
mysql> insert into name values(1,'zhangsan',10);
Query OK, 1 row affected (0.00 sec)
mysql> select * from name;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
+------+----------+------+
1.同时插入多条记录
mysql> insert into name values(2,'lisi',20),(3,'wangwu',30);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from name;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
| 2 | lisi | 20 |
| 3 | wangwu | 30 |
+------+----------+------+
3 rows in set (0.00 sec)
但是上面两种插入方式,必须一次插入所有字段的值,如如下就不可以,会报错
mysql> insert into name values(2,'zhangsan');
ERROR 1136 (21S01): Column count doesn't match value count at row
如果要选择字段,插入值,使用下面的方式
3.分开插入表记录
例如,只想要添加‘id’,与‘name’字段,需要使用如下这种方式
age字段 为 NULL
mysql> insert into name(id,name)values(4,'zhaoliu');
Query OK, 1 row affected (0.00 sec)
mysql> select * from name;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
| 2 | lisi | 20 |
| 3 | wangwu | 30 |
| 4 | zhaoliu | NULL |
+------+----------+------+
4 rows in set (0.00 sec)
2)查询表中记录select
语法如下
select * from 表名称;
1.查询name表中所有记录
mysql> select * from name;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
| 2 | lisi | 20 |
| 3 | wangwu | 30 |
| 4 | zhaoliu | NULL |
+------+----------+------+
4 rows in set (0.00 sec)
2.当表中字段较多时,可以使用\G查看
mysql> select * from name\G;
*************************** 1. row ***************************
id: 1
name: zhangsan
age: 10
*************************** 2. row ***************************
id: 2
name: lisi
age: 20
*************************** 3. row ***************************
id: 3
name: wangwu
age: 30
*************************** 4. row ***************************
id: 4
name: zhaoliu
age: NULL
4 rows in set (0.00 sec)
3.只查询表中某个字段的内容
例如只查询name表中的 ‘id’与 ‘name’字段
mysql> select id,name from name;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
| 4 | zhaoliu |
+------+----------+
4 rows in set (0.00 sec)
4.查看别的数据库或者不在本数据库上进行查看
语法如下
select 字段 from 数据名.表名;
先退出mysql,然后再进入,不在任何数据库中
mysql> exit
Bye
再进入,默认不在任何数据库中
mysql> select database();
+------------+
| database() |
+------------+
| NULL |
+------------+
1 row in set (0.00 sec)
查看Name库中的,name表
mysql> select * from Name.name;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
| 2 | lisi | 20 |
| 3 | wangwu | 30 |
| 4 | zhaoliu | NULL |
+------+----------+------+
4 rows in set (0.00 sec)
3) 删除表中的记录
1.删除name表中 id为 3的行
mysql> use Name;
mysql> delete from name where id=3;
Query OK, 1 row affected (0.04 sec)
mysql> select * from name;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
| 2 | lisi | 20 |
| 4 | zhaoliu | NULL |
+------+----------+------+
3 rows in set (0.00 sec)
2.删除age为空的行
mysql> delete from name where age is null;
Query OK, 1 row affected (0.09 sec)
mysql> select * from name;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
| 2 | lisi | 20 |
+------+----------+------+
2 rows in set (0.00 sec)
注意这里要用 is 而不是上一个的 =号
4) 更新记录
1.把表中id为2的记录age更新为77
mysql> update name set age=77 where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from name;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
| 2 | lisi | 77 |
+------+----------+------+
2 rows in set (0.00 sec)
2.把表中的所有id都更新为100
mysql> update name set id=100;
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> select * from name;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 100 | zhangsan | 10 |
| 100 | lisi | 77 |
+------+----------+------+
2 rows in set (0.00 sec)
3.同时更新多条记录,请使用逗号隔开
例如把age字段为10的行,把这行的id字段值改为1,name字段值改为’mazi’
mysql> update name set id=1,name='mazi' where age=10;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from name;
+------+------+------+
| id | name | age |
+------+------+------+
| 1 | mazi | 10 |
| 100 | lisi | 77 |
+------+------+------+
2 rows in set (0.00 sec)
SQL基础条件查询语句
删除原来的语句
mysql> delete from name where age=10;
Query OK, 1 row affected (0.01 sec)
mysql> delete from name where age=77;
Query OK, 1 row affected (0.00 sec)
在往表中插入一些新数据
mysql> insert into name values(1,'yige',10),(2,'erge',20),(3,'sange',30),(3,'sange',30);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
1)查询表中的name,age字段
mysql> select name,age from name;
+-------+------+
| name | age |
+-------+------+
| yige | 10 |
| erge | 20 |
| sange | 30 |
| sange | 30 |
+-------+------+
4 rows in set (0.00 sec)
可以看到表中有重复的数据
2)去重复查询distinct
可看到如下已经没有重复的数据了
distinct 参数
mysql> select distinct name,age from name;
+-------+------+
| name | age |
+-------+------+
| yige | 10 |
| erge | 20 |
| sange | 30 |
+-------+------+
3 rows in set (0.00 sec)
3)使用and和or进行多条件查询
查询表中 id<3和 age<=20的记录
and必须左右都满足才行
mysql> select * from name name where id<3 and age<=20;
+------+------+------+
| id | name | age |
+------+------+------+
| 1 | yige | 10 |
| 2 | erge | 20 |
+------+------+------+
2 rows in set (0.00 sec)
查询表中id>2或者age<20的记录
or,左右满足一个就行
mysql> select * from name where id>2 or age<20;
+------+-------+------+
| id | name | age |
+------+-------+------+
| 1 | yige | 10 |
| 3 | sange | 30 |
| 3 | sange | 30 |
+------+-------+------+
3 rows in set (0.00 sec)
4)mysql区分大小写查询 binary
mysql默认不区分大小写,如下
mysql> insert into name values(4,'kali',40),(5,'KALI',50);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from name where name='kali';
+------+------+------+
| id | name | age |
+------+------+------+
| 4 | kali | 40 |
| 5 | KALI | 50 |
+------+------+------+
2 rows in set (0.00 sec)
如下区分大小写查询
使用binary参数
mysql> select * from name where binary name='kali';
+------+------+------+
| id | name | age |
+------+------+------+
| 4 | kali | 40 |
+------+------+------+
1 row in set (0.00 sec)
mysql> select * from name where binary name='KALI';
+------+------+------+
| id | name | age |
+------+------+------+
| 5 | KALI | 50 |
+------+------+------+
1 row in set (0.00 sec)
5)mysql查询排序
语法如下
select distinct 字段1,字段2 from 表名 order by 字段名;
这个默认会有去重的功能,如下
1.默认为升序asc
mysql> select * from name;
+------+-------+------+
| id | name | age |
+------+-------+------+
| 1 | yige | 10 |
| 2 | erge | 20 |
| 3 | sange | 30 |
| 3 | sange | 30 |
| 4 | kali | 40 |
| 5 | KALI | 50 |
+------+-------+------+
6 rows in set (0.00 sec)
mysql> select distinct * from name order by id asc;
+------+-------+------+
| id | name | age |
+------+-------+------+
| 1 | yige | 10 |
| 2 | erge | 20 |
| 3 | sange | 30 |
| 4 | kali | 40 |
| 5 | KALI | 50 |
+------+-------+------+
5 rows in set (0.00 sec)
2.降序 desc
mysql> select distinct * from name order by id desc;
+------+-------+------+
| id | name | age |
+------+-------+------+
| 5 | KALI | 50 |
| 4 | kali | 40 |
| 3 | sange | 30 |
| 2 | erge | 20 |
| 1 | yige | 10 |
+------+-------+------+
5 rows in set (0.00 sec)
关于mysql的命令帮助
因为有帮助信息很多,我这里省略了很多
mysql> help show;
Name: 'SHOW'
Description:
SHOW has many forms that provide information about databases, tables,
columns, or status information about the server. This section describes
those following:
SHOW {BINARY | MASTER} LOGS
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
SHOW CHARACTER SET [like_or_where]
SHOW COLLATION [like_or_where]
...
如下关于select命令的帮助
mysql> help select;
Name: 'SELECT'
Description:
Syntax:
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
...