首页 > 代码库 > 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、DDL(Data 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的笔记(上)