数据库基本操作

一、sql概述  

SQL Structure Query Language 。(结构化查询语言)
SQL 被美国国家标准局( ANSI )确定为关系型数据库语言的美国标准,后来被国际化标准组织( ISO )采纳为关系数据库语言的国际标准。
各数据库厂商都支持 ISO SQL 标准。 普通话
各数据库厂商在标准的基础上做了自己的扩展。 方言

二、Sql的分类

      DDL(*) Data Definition Language ):数据定义语言,用来定义数据库对象:库、表、列等;
     DML(**) Data Manipulation Language ):数据操作语言,用来定义数据库记录(数据);
     DCL Data Control Language ):数据控制语言,用来定义访问权限和安全级别;
     DQL(*****) Data Query Language ):数据查询语言,用来查询记录(数据)。
注意: sql 语句以 ; 结尾

2.1 DDL:操作数据库、表、列等

使用的关键字: CREATE ALTER DROP

 2.1.1操作数据库

                  创建
                                  Create database mydb1;
Create database mydb2 character set gbk;
Create database mydb3 character set gbk COLLATE gbk_chinese_ci;
                         
                  查询
查看当前数据库服务器中的所有数据库
Show databases;
查看前面创建的 mydb2 数据库的定义信息
Show  create  database mydb2;
删除前面创建的 mydb3 数据库
Drop database mydb3;
                         
                  修改
                                   查看服务器中的数据库,并把 mydb2 的字符集修改为 utf8;
 alter database mydb2 character set utf8;
                  删除        
Drop database mydb3;
                                                  
                 * 其他:
查看当前使用的数据库
Select database();
                                   切换数据库
Use mydb2;

 2.1.2操作数据表

         * 语法:
                         create table 表名 (
                                   字段 1 字段类型 ,
                                   字段 2 字段类型 ,
                                  ...
                                   字段 n 字段类型
                         );
                                  
        * 常用数据类型:
                     int :整型
                   double :浮点型,例如 double(5,2) 表示最多 5 位,其中必须有 2 位小数,即最大值为 999.99
                     char :固定长度字符串类型;     char(10)     'aaa       '  10
                     varchar :可变长度字符串类型; varchar(10)  'aaa'  3
                     text :字符串类型;
                     blob :字节类型;
                     date :日期类型,格式为: yyyy-MM-dd
                     time :时间类型,格式为: hh:mm:ss
                     timestamp :时间戳类型 yyyy-MM-dd hh:mm:ss  会自动赋值
                     datetime: 日期时间类型 yyyy-MM-dd hh:mm:ss
当前数据库中的所有表
SHOW TABLES;
查看表的字段信息
DESC employee;
在上面员工表的基本上增加一个 image 列。
ALTER TABLE employee ADD image blob;
修改 job 列,使其长度为 60
ALTER TABLE employee MODIFY job varchar(60);
删除 image , 一次只能删一列。
ALTER TABLE employee DROP image;
表名改为 user
RENAME TABLE employee TO user;
查看表格的创建细节
SHOW CREATE TABLE user;
修改表的字符集为 gbk
ALTER TABLE user CHARACTER SET gbk;
列名 name 修改为 username
ALTER TABLE user CHANGE name username varchar(100);
删除表
DROP TABLE user ;

2.2 DML操作(重要)

查询表中的所有数据
SELECT * FROM 表名 ;
DML 是对 表中的数据 进行增、删、改的操作。不要与 DDL 混淆了。
INSERT UPDATE DELETE
小知识:
mysql 中,字符串类型和日期类型都要用单引号括起来。
空值: null

2.2.1插入操作:INSERT:

语法: INSERT INTO 表名(列名 1 ,列名 2 ... VALUES( 列值 1 ,列值 2...);
注意:列名与列值的类型、个数、顺序要一一对应。
可以把列名当做 java 中的形参,把列值当做实参。
参不要超出列定义的长度。
如果插入空值,请使用 null
插入的日期和字符一样,都使用引号括起来。
练习
create table emp(
id int,
name varchar(100),
gender varchar(10),
birthday date,
salary float(10,2),
entry_date date,
resume text
);
INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');
INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(2,'lisi','male','1995-5-10',10000,'2015-5-5','good boy');
INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(3,' 你好 ','male','1995-5-10',10000,'2015-5-5','good boy');
小知识:
查看数据库编码的具体信息
Show variables like ‘character%’;
数据库基本操作_第1张图片
临时更改客户端和服务器结果集的编码
Set character_set_client=gbk;
Set character_set_results=gbk;

2.2.2 修改操作 UPDATE:

           语法:UPDATE 表名 SET 列名1=列值1,列名2=列值2 。。。 WHERE 列名=

练习:
将所有员工薪水修改为 5000 元。
UPDATE emp SET salary=5000
将姓名为’ zs ’的员工薪水修改为 3000 元。
UPDATE emp SET salary=3000 WHERE name=’ zhangsan’;
将姓名为’ aaa ’的员工薪水修改为 4000 ,job 改为 ccc
 UPDATE emp SET salary=4000,gender='female' WHERE name='lisi';
wu 的薪水在原有基础上增加 1000 元。
 UPDATE emp SET salary=salary+1000 WHERE gender='male';         

2.2.3 删除操作 DELETE:

语法 DELETE 表名 WHERE 列名 = 值】
练习
删除表中名称为’ zs ’的记录。
DELETE FROM emp WHERE name= zs ;
删除表中所有记录。
DELETE FROM emp;
使用 truncate 删除表中记录。
TRUNCATE TABLE emp;
DELETE 删除表中的数据,表结构还在 ; 删除后的数据可以找回
TRUNCATE 删除是把表直接 DROP 掉,然后再创建一个同样的新表。
删除的数据不能找回。执行速度比 DELETE 快。

2.3 DQL操作

DQL 数据查询语言 (重要)
数据库执行 DQL 语句不会对数据进行改变,而是让数据库发送结果集给客户端。
查询返回的结果集是一张虚拟表。
查询关键字: SELECT
语法: SELECT 列名 FROM 表名
WHERE --> BROUP BY -->HAVING--> ORDER BY
语法:
SELECT selection_list /* 要查询的列名称 */
  FROM table_list /* 要查询的表名称 */
  WHERE condition /* 行条件 */
  GROUP BY grouping_columns /* 对结果分组 */
  HAVING condition /* 分组后的行条件 */
  ORDER BY sorting_columns /* 对结果分组 */
  LIMIT offset_start, row_count /* 结果限定 */
创建名:
  • 学生表: stu
字段名称
字段类型
说明
sid
char(6)
学生学号
sname
varchar(50)
学生姓名
age
int
学生年龄
gender
varchar(50)
学生性别
CREATE TABLE stu (
        sid    CHAR(6),
        sname               VARCHAR(50),
        age           INT,
        gender      VARCHAR(50)
);
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
  • 雇员表: emp
字段名称
字段类型
说明
empno
int
员工编号
ename
varchar(50)
员工姓名
job
varchar(50)
员工工作
mgr
int
领导编号
hiredate
date
入职日期
sal
decimal(7,2)
月薪
comm
decimal(7,2)
奖金
deptno
int
部分编号
CREATE TABLE emp(
        empno              INT,
        ename               VARCHAR(50),
        job           VARCHAR(50),
        mgr          INT,
        hiredate    DATE,
        sal            DECIMAL(7,2),
        comm               decimal(7,2),
        deptno              INT
) ;
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
  • 部分表: dept
字段名称
字段类型
说明
deptno
int
部分编码
dname
varchar(50)
部分名称
loc
varchar(50)
部分所在地点
CREATE TABLE dept(
        deptno              INT,
        dname              varchar(14),
        loc            varchar(13)
);
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');
1 基础查询
1.1 查询所有列
SELECT * FROM stu;
1.2 查询指定列
SELECT sid, sname, age FROM stu;
2 条件查询
2.1 条件查询介绍
条件查询就是在查询时给出 WHERE 子句,在 WHERE 子句中可以使用如下运算符及关键字:
  • = != <> < <= > >=
  • BETWEEN…AND
  • IN(set)
  • IS NULL  
  • AND
  • OR
  • NOT
2.2 查询性别为女,并且年龄50的记录
   SELECT * FROM stu
WHERE gender='female' AND ge<50;
2.3 查询学号为S_1001,或者姓名为liSi的记录
SELECT * FROM stu
WHERE sid ='S_1001' OR sname='liSi';
2.4 查询学号为S_1001S_1002S_1003的记录
SELECT * FROM stu
WHERE sid IN ('S_1001','S_1002','S_1003');
2.5 查询学号不是S_1001S_1002S_1003的记录
SELECT * FROM tab_student
WHERE s_number NOT IN ('S_1001','S_1002','S_1003');
2.6 查询年龄为null的记录
SELECT * FROM stu
WHERE age IS NULL;
2.7 查询年龄在2040之间的学生记录
SELECT *
FROM stu
WHERE age>=20 AND age<=40;
或者
SELECT *
FROM stu
WHERE age BETWEEN 20 AND 40;
2.8 查询性别非男的学生记录
SELECT *
FROM stu
WHERE gender!='male';
或者
SELECT *
FROM stu
WHERE gender<>'male';
或者
SELECT *
FROM stu
WHERE NOT gender='male';
2.9 查询姓名不为null的学生记录
SELECT *
FROM stu
WHERE NOT sname IS NULL;
或者
SELECT *
FROM stu
WHERE sname IS NOT NULL;
3 模糊查询
当想查询姓名中包含 a 字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字 LIKE
通配符 :
_ 任意一个字母
       % :任意 0~n 个字母
 ' %'
3.1 查询姓名由5个字母构成的学生记录
SELECT *
FROM stu
WHERE sname LIKE '_____';
模糊查询必须使用 LIKE 关键字。其中 _ ”匹配任意一个字母, 5 个“ _ ”表示 5 个任意字母。
3.2 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
SELECT *
FROM stu
WHERE sname LIKE '____i';
3.3 查询姓名以“z”开头的学生记录
SELECT *
FROM stu
WHERE sname LIKE 'z%';
其中“ % ”匹配 0~n 个任何字母。
3.4 查询姓名中第2个字母为“i”的学生记录
SELECT *
FROM stu
WHERE sname LIKE '_i%';
3.5 查询姓名中包含“a”字母的学生记录
SELECT *
FROM stu
WHERE sname LIKE '%a%';
4 字段控制查询
4.1 去除重复记录
去除重复记录(两行或两行以上记录中系列的上的数据都相同),例如 emp 表中 sal 字段就存在相同的记录。当只查询 emp 表的 sal 字段时,那么会出现重复记录,那么想去除重复记录,需要使用 DISTINCT
SELECT DISTINCT sal FROM emp;
4.2 查看雇员的月薪与佣金之和
  因为 sal comm 两列的类型都是数值类型,所以可以做加运算。如果 sal comm 中有一个字段不是数值类型,那么会出错。
SELECT *,sal+comm FROM emp;
comm 列有很多记录的值为 NULL ,因为任何东西与 NULL 相加结果还是 NULL ,所以结算结果可能会出现 NULL 。下面使用了把 NULL 转换成数值 0 的函数 IFNULL
SELECT *,sal+IFNULL(comm,0) FROM emp;
4.3 给列名添加别名
在上面查询中出现列名为 sal+IFNULL(comm,0) ,这很不美观,现在我们给这一列给出一个别名,为 total
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
给列起别名时,是可以省略 AS 关键字的:
SELECT *,sal+IFNULL(comm,0)  total FROM emp;
5 排序
5.1 查询所有学生记录,按年龄升序排序
SELECT *
FROM stu
ORDER BY sage ASC;
或者
SELECT *
FROM stu
ORDER BY sage;
5.2 查询所有学生记录,按年龄降序排序
SELECT *
FROM stu
ORDER BY age DESC;
5.3 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
SELECT * FROM emp
ORDER BY sal DESC,empno ASC;
6 聚合函数  sum avg max min count
聚合函数是用来做纵向运算的函数:
  1. COUNT() :统计指定列不为 NULL 的记录行数;
  2. MAX() :计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
  3. MIN() :计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
  4. SUM() :计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为 0
  5. AVG() :计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为 0
6.1 COUNT
当需要纵向统计时可以使用 COUNT()
  • 查询 emp 表中记录数:
SELECT COUNT(*) AS cnt FROM emp;
  • 查询 emp 表中有佣金的人数:
SELECT COUNT(comm) cnt FROM emp;
注意,因为 count() 函数中给出的是 comm 列,那么只统计 comm 列非 NULL 的行数。
  • 查询 emp 表中月薪大于 2500 的人数:
SELECT COUNT(*) FROM emp
WHERE sal > 2500;
  • 统计月薪与佣金之和大于 2500 元的人数:
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;
  • 查询有佣金的人数,以及有领导的人数:
SELECT COUNT(comm), COUNT(mgr) FROM emp;
6.2 SUMAVG
当需要纵向求和时使用 sum() 函数。
  • 查询所有雇员月薪和:
SELECT SUM(sal) FROM emp;
  • 查询所有雇员月薪和,以及所有雇员佣金和:
SELECT SUM(sal), SUM(comm) FROM emp;
  • 查询所有雇员月薪 + 佣金和:
SELECT SUM(sal+IFNULL(comm,0)) FROM emp;
  • 统计所有员工平均工资:
SELECT AVG(sal) FROM emp;
6.3 MAXMIN
  • 查询最高工资和最低工资:
SELECT MAX(sal), MIN(sal) FROM emp;
7 分组查询
当需要分组查询时需要使用 GROUP BY 子句,例如查询每个部门的工资和,这说明要使用部分来分组。
注:凡和聚合函数同时出现的列名,则一定要写在 group by 之后
7.1 分组查询
  • 查询每个部门的部门编号和每个部门的工资和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno;
  • 查询每个部门的部门编号以及每个部门的人数:
SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno;
  • 查询每个部门的部门编号以及每个部门工资大于 1500 的人数:
SELECT deptno,COUNT(*)
FROM emp
WHERE sal>1500
GROUP BY deptno;
7.2 HAVING子句
  • 查询工资总和大于 9000 的部门编号以及工资和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;
  
         注: having where 的区别 :
                 1.having 是在分组后对数据进行过滤 .
                   where 是在分组前对数据进行过滤
                 
2.  SQL 中, HAVING 子句通常与 GROUP BY 子句一起使用,用于对分组后的数据进行过滤。而 WHERE 子句则用于对单个记录进行过滤。
因此,当你在HAVING子句中使用聚合函数(如COUNTSUMAVG等)时,这是合法的。但是,如果你在WHERE子句中使用这些函数,那么这是不合法的,因为WHERE子句只能用于过滤单个记录,而不能用于过滤整个分组。
8 LIMIT
LIMIT 用来限定查询结果的起始行,以及总行数。
8.1 查询5行记录,起始行从0开始
SELECT * FROM emp LIMIT 0, 5;
注意,起始行从 0 开始,即第一行开始!
8.2 查询10行记录,起始行从3开始
SELECT * FROM emp LIMIT 3, 10;
8.3 分页查询
如果一页记录为 10 条,希望查看第 3 页记录应该怎么查呢?
  • 第一页记录起始行为 0 ,一共查询 10 行;
  • 第二页记录起始行为 10 ,一共查询 10 行;
  • 第三页记录起始行为 20 ,一共查询 10 行;
8.3 分页查询
         查询语句书写顺序: select – from- where- group by- having- order by-limit
         查询语句执行顺序: from - where -group by - having - select - order by-limit    

五、MySQL中的函数

六、MySQL数据库的备份与恢复

1 生成SQL脚本  导出数据

在控制台使用 mysqldump 命令可以用来生成指定数据库的脚本文本,但要注意,脚本文本中只包含数据库的内容,而不会存在创建数据库的语句!所以在恢复数据时,还需要自已手动创建一个数据库之后再去恢复数据。
   mysqldump –u 用户名 –p 密码 数据库名 > 生成的脚本文件路径
现在可以在 C 盘下找到 mydb1.sql 文件了!
注意, mysqldump 命令是在 Windows 控制台下执行,无需登录 mysql !!!

2 执行SQL脚本 恢复数据

前提:必须先创建数据库名
执行 SQL 脚本需要登录 mysql ,然后进入指定数据库,才可以执行 SQL 脚本!!!
执行 SQL 脚本不只是用来恢复数据库,也可以在平时编写 SQL 脚本,然后使用执行 SQL 脚本来操作数据库!大家都知道,在黑屏下编写 SQL 语句时,就算发现了错误,可能也不能修改了。所以我建议大家使用脚本文件来编写 SQL 代码,然后执行之!
SOURCE C:\mydb1.sql
  注意,在执行脚本时需要先行核查当前数据库中的表是否与脚本文件中的语句有冲突!例如在脚本文件中存在 create table a 的语句,而当前数据库中已经存在了 a 表,那么就会出错!
还可以通过下面的方式来执行脚本文件:
mysql -uroot -p123 mydb1
mysql –u 用户名 –p 密码 数据库 < 要执行脚本文件路径
这种方式无需登录 mysql
注意:在 CMD 命令不能加 ;

你可能感兴趣的:(数据库,数据库,mysql)