首页 > 代码库 > MySQL的笔记(上)

MySQL的笔记(上)

这里是MySQL部分的笔记,一些基本语法的演示,方便以后复习嗷~~

 

***修改密码<<忘性星人的必备

                 运行cmd

                  * 安装成功了打开cmd  --> mysql -uroot -p你的密码

                  * 修改mysql root用户密码

                     1) 停止mysql服务 运行输入services.msc 停止mysql服务

                            或者 cmd -->  net stop mysql

                     2) 在cmd下 输入 mysqld--skip-grant-tables 启动服务器 光标不动 (不要关闭该窗口)

                     3) 新打开cmd 输入mysql -u root -p 不需要密码

                     use mysql;

                     update user set password=password(‘abc‘) WHERE User=‘root‘;

                     4) 关闭两个cmd窗口 在任务管理器结束mysqld 进程

                     5) 在服务管理页面 重启mysql 服务

                     密码修改完成

---------------------------------------------------------------------------------

SQL四种语言: DDL、DML、DCL、TCL

DDL**(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;      CREATE、 ALTER、DROP

DML***(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);        INSERT、 UPDATE、 DELETE

DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;

DQL*****(Data Query Language):数据查询语言,用来查询记录(数据)。 SELECT

1、DDLData Definition Language数据库定义语言

是对数据库的操作语言

关键字:CREATE   ALTER DROP TRUNCATE COMMENT RENAME

1、创建数据库

 

1 create database mydb1;
2 Create database mydb2 character set gbk;
3 Create database mydb3 character set gbk COLLATE gbk_chinese_ci;

 

2、查询数据库

 

-- 查看当前数据库服务器中的所有数据库
show databases;
-- 查看前面创建的mydb2数据库的定义信息
Show  create  database mydb2;
-- 删除前面创建的mydb3数据库
Drop database mydb3;

 

 

3、修改数据库

--  查看服务器中的数据库,并把mydb2的字符集修改为utf8;
 alter database mydb2 character set utf8;

 

4、删除数据库

drop database mydb3;

 

5、其他

-- 查看当前使用的数据库
select database();
-- 切换数据库
use mydb2;

 

 1 -- 当前数据库中的所有表
 2 SHOW TABLES;
 3 -- 查看表的字段信息
 4 DESC employee;
 5 -- 在上面员工表的基本上增加一个image列。
 6 ALTER TABLE employee ADD image blob;
 7 -- 修改job列,使其长度为60。
 8 ALTER TABLE employee MODIFY job varchar(60);
 9 -- 删除image列,一次只能删一列。
10 ALTER TABLE employee DROP image;
11 -- 表名改为user。
12 RENAME TABLE employee TO user;
13 -- 查看表格的创建细节
14 SHOW CREATE TABLE user;
15 -- 修改表的字符集为gbk
16 ALTER TABLE user CHARACTER SET gbk;
17 -- 列名name修改为username
18 ALTER TABLE user CHANGE name username varchar(100);
19 
20 -- 删除表
21 DROP TABLE user ;

2.DML(Data Manipulation Language)数据操纵语言

DML是对表中的数据进行增、删、改的操作。

关键字:SELECT INSERT UPDATE DELETE

1、查询

SELECT * FROM 表名;

 

2、插入数据

 1 create table emp(
 2 id int,
 3 name varchar(100),
 4 gender varchar(10),
 5 birthday date,
 6 salary float(10,2),
 7 entry_date date,
 8 resume text
 9 );
10
11 INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
12 VALUES(1,zhangsan,female,1990-5-10,10000,2015-5-5-,good girl);
13 
14 INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
15 VALUES(2,lisi,male,1995-5-10,10000,2015-5-5,good boy);
16 
17 INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
18 VALUES(3,wangwu,male,1995-5-10,10000,2015-5-5,good boy);
19 
20 批量插入:
21 INSERT INTO emp VALUES
22 (4,zs,m,2015-09-01,10000,2015-09-01,NULL),
23 (5,li,m,2015-09-01,10000,2015-09-01,NULL),
24 (6,ww,m,2015-09-01,10000,2015-09-01,NULL);

 

3、修改数据

-- 将所有员工薪水修改为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;    

 

4、删除数据

1 -- 删除表中名称为’zs’的记录。
2 DELETE FROM emp WHERE name=‘zs’;
3 -- 删除表中所有记录。
4 DELETE FROM emp;
5 -- 使用truncate删除表中记录。
6 TRUNCATE TABLE emp;

 

ATTENTION!

DELETE 删除表中的数据,表结构还在;删除后的数据可以找回

TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。删除的数据不能找回。执行速度比DELETE快。

3、DQL

数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。查询返回的结果集是一张虚拟表。

1、基础查询

SELECT * FROM stu;
SELECT sid, sname, age FROM stu;

 

2、条件查询

 =、!=、<>、<、<=、>、>=; BETWEEN…AND; IN(set); IS NULL;  IS NOT NULLAND; OR; NOT;

 

-- 查询性别为女,并且年龄50的记录
SELECT * FROM stu 
WHERE gender=female AND ge<50;

-- 查询学号为S_1001,或者姓名为liSi的记录
SELECT * FROM stu 
WHERE sid =S_1001 OR sname=liSi;

-- 查询学号为S_1001,S_1002,S_1003的记录
SELECT * FROM stu 
WHERE sid IN (S_1001,S_1002,S_1003);

-- 查询学号不是S_1001,S_1002,S_1003的记录
SELECT * FROM tab_student 
WHERE s_number NOT IN (S_1001,S_1002,S_1003);

-- 查询年龄为null的记录
SELECT * FROM stu
WHERE age IS NULL;

-- 查询年龄在20到40之间的学生记录
SELECT * 
FROM stu
WHERE age>=20 AND age<=40;
-- 或者
SELECT * 
FROM stu 
WHERE age BETWEEN 20 AND 40;

--  查询性别非男的学生记录
SELECT * 
FROM stu
WHERE gender!=male;
-- 或者
SELECT * 
FROM stu
WHERE gender<>male;
-- 或者
SELECT * 
FROM stu
WHERE NOT gender=male;

-- 查询姓名不为null的学生记录
SELECT * 
FROM stu
WHERE sname IS NOT NULL;
-- 或者
SELECT * 
FROM stu
WHERE NOT sname IS NULL;

 

3、模糊查询

关键字 LIKE 

通配符:

_ 任意一个字符

 %:任意0~n个字符

-- 查询姓名由5个字母构成的学生记录
SELECT * 
FROM stu
WHERE sname LIKE _____;

-- 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
SELECT * 
FROM stu
WHERE sname LIKE ____i;

-- 查询姓名以“z”开头的学生记录
SELECT * 
FROM stu
WHERE sname LIKE z%;

-- 查询姓名中第2个字母为“i”的学生记录
SELECT * 
FROM stu
WHERE sname LIKE _i%;

-- 查询姓名中包含“a”字母的学生记录
SELECT * 
FROM stu
WHERE sname LIKE %a%;

 

4、字段控制查询

-- ---------1、去除重复数据 DISTINCT
SELECT DISTINCT sal FROM emp;

-- --------- 2、计算之和 //注意类型必须都是INT否则报错
SELECT *,sal+comm FROM emp;

-- --------- 3、如果是null与数值相加还是null 将null值设为0
SELECT *,sal+IFNULL(comm,0) FROM emp;

-- --------- 4、给列添加别名
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
-- 给列起别名时,是可以省略AS关键字的:
SELECT *,sal+IFNULL(comm,0)  total FROM emp;

 

5、排序

语法: order by 列名 asc(默认) desc

-- 查询所有学生记录,按年龄降序排序
SELECT *
FROM stu
ORDER BY age DESC;
-- 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
SELECT * FROM emp
ORDER BY sal DESC,empno ASC;

 

6、聚合函数

聚合函数是用来做纵向运算的函数:

  COUNT():统计指定列不为NULL的记录行数;

  MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

  MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

  SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;

  AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

-- ----------当需要纵向统计时可以使用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;

--  ------------------ SUM和AVG
当需要纵向求和时使用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;

-- -------------------- MAX和MIN
--     查询最高工资和最低工资:
SELECT MAX(sal), MIN(sal) FROM emp;

 

7、 分组查询

--     查询每个部门的部门编号和每个部门的工资和:
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;

--  -------------------------- HAVING子句
--     查询工资总和大于9000的部门编号以及工资和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;

 Attention:

having与where的区别:

1.having是在分组后对数据进行过滤.  where是在分组前对数据进行过滤

2.having后面可以使用聚合函数(统计函数) where后面不可以使用聚合函数。

3.WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。

 8、LIMIT

LIMIT用来限定查询结果的起始行,以及总行数。

-- 查询5行记录,起始行从0开始
SELECT * FROM emp LIMIT 0, 5;

-- 注意,起始行从0开始,即第一行开始!

 

MySQL的笔记(上)