创建数据库


utf8_bin区分大小写(也就是查询的话Tom和tom不相同),而utf8_general_ci不区分大小写。 
调用语句的方法:选中语句,点击左上角的“选中查询”。注意创建完成后还需要刷新一下左边才能看到,可以一次选中多条语句。
创建数据库时设置参数:FILENAME是数据库路径,SIZE是初始大小,MAXSIZE是最大大小,FILEGROWTH是每次增长大小。
查看、删除数据库


注:删除数据库前一定要三思!
# 演示数据库的操作# 使用指令创建数据库CREATE DATABASE shang_01;CREATE DATABASE shang_02;#查看当前数据库服务器中的所有数据库SHOW DATABASES#查看前面创建数据库的定义信息SHOW CREATE DATABASE shang_01#在创建数据库表时,为了规避关键字,我们需要加上反引号(即使不是关键字也可以加)CREATE DATABASE `CREATE`#删除库DROP DATABASE shang_03
备份、恢复数据库
备份数据库
备份表
恢复数据库
第一种方法:source 文件名.sql (source不区分大小写),必须在sql管理终端中运行。参考第八条。 

第二种方法:直接把beifen.sql文件复制到SQLyog,然后整体执行。
表的各种操作
创建表

注:在SQLyog中创建表非常容易,这里仅展示DOS的(可以在SQLyog的代码区使用)。只有在右括号后面结束后加分号,其它用逗号隔开,即使是最后的数据也不加分号。
CREATE TABLE `user`(id INT,`name` VARCHAR(255),`password` VARCHAR(255),`birthday` DATE)CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB;
删除表
操作很简单:DROP TABLE 表名
DROP TABLE tableName
修改表(Alter语句等)
插入列
ALTER TABLE accADD image VARCHAR(32) NOT NULL DEFAULT '' AFTER RESUME#插入一个image列,varchar类型,不为空,初始值为'',在resume后面
显示表结构
DESC acc #显示表结构,可以查看表的所有列
修改列的属性
注意有两种方法,MODIFY不能修改名字,但CHANGE可以
ALTER TABLE accMODIFY image VARCHAR(60) NOT NULL DEFAULT '' #修改image列,使其长度为60ALTER TABLE accCHANGE `resume` `rrr` VARCHAR(64) NOT NULL DEFAULT ''#修改列的属性:名字 长度 是否为空 初始值
删除列
ALTER TABLE acc DROP image #删除acc表的image列
修改表名
RENAME TABLE acc TO qqq#修改表名为class DESC qqq#表名修改后,对应的操作也需要修改
修改表的字符集
ALTER TABLE acc CHARACTER SET utf8 #修改表的字符集为utf8
表复制
#把emp表复制到my_tab01中INSERT INTO my_tab01(id,`name`,sal,job,deptno)SELECT empno,ename,sal,job,deptnoFROM emp
#自我复制INSERT INTO my_tab01SELECT * FROM mytab_01
表去重
#创建一个临时表和要去重的表结构相同CREATE TABLE my_tmp LIKE my_tab02#把tab02的记录通过distinct处理后 复制到tmpINSERT INTO my_tmpSELECT DISTINCT * FROM my_tab02#清除掉tab02的记录DELETE FROM my_tab02#把tmp表的记录复制到tab02INSERT INTO my_tab02SELECT * FROM my_tmp#drop掉临时表tmpDROP TABLE my_tmp;
Insert语句

INSERT INTO `goods` (id, goods_name, price) #对应列VALUES(1,'华为手机',2000); #对应值
注意!一定不要带括号。
细节说明:
1. 插入的数据应与字段的数据类型相同。 但是如果能相互转化那就是可以的。比如: ‘abc’ 放到int里是不行的(’a’也不行),但是’30’放到int里就是可以的。
2. 数据的长度应在列的规定范围内。比如:不能把一个长度为80的字符串加入到长度为40的列中
3. 字符和日期型数据应包含在单引号中。
4. 列可以插入null,前提是该字段允许为空(不写 NOT NULL,参见插入列)
5. insert into 列名 values (),(),()… 这样的形式可以添加多条记录。
INSERT INTO goods (id,goods_name,price)VALUES(60,'三星手机',2300),(60,'小米手机',3000)
6. 如果是给表中的所有字段添加数据,可以不写()里的字段名称。
INSERT INTO goodsVALUES(60,'三星手机',2300),(60,'小米手机',3000)
7. 当不给某个字段值时,如果有默认值就会添加(也就是 default 关键字对应的值),否则会报错。
Update语句


#把所有员工薪水修改为5000UPDATE employee SET salary = 5000#将姓名为 小天才 的员工薪水修改为3000元UPDATE employeeSET salary = 3000WHERE user_name = '小天才'#在原有基础上增加薪水UPDATE employeeSET salary = salary + 1000WHERE user_name = '小天才'#修改多个列UPDATE employeeSET salary = salary + 1000 , job = '策划'WHERE user_name = '小天才'
Delete语句


#删除表中所有名称为 '一方通行' 的记录DELETE FROM employeeWHERE user_name = '一方通行'#删除表中所有记录DELETE FROM employee
Select语句

#查询表中学生的所有信息SELECT * FROM student;#查询表中所有学生的姓名和对应的英语成绩SELECT `name`,english FROM student;#过滤表中重复数据 distinct 注:要查询的记录,每个字段都相同,才会去重SELECT DISTINCT english FROM student;SELECT DISTINCT `name`,english FROM student;#比如 english相同,但name不同,这样的就不会去重


#统计每个学生的总分SELECT `name`,(chinese + english + math) FROM student;#假设要显示总分+10的内容SELECT `name`,(chinese + english + math + 10) FROM student;#使用别名表示学生分数SELECT `name`,(chinese + english + math) AS total_score FROM student;
where语句

#查询姓赵的同学的成绩SELECT * FROM studentWHERE `name` LIKE '赵%'; #这里 %表示名字以赵开头的都行('赵'也行)#查询总分大于200的所有同学SELECT * FROM studentWHERE (chinese + english + math) > 200;#查询math大于60,并且id大于4的学生成绩SELECT * FROM studentWHERE math>60 AND id>4;#查询英语分数在 80-90 之间的同学SELECT * FROM studentWHERE english BETWEEN 80 AND 90; #注意都是闭区间#查询数学分数为89,90,91的同学SELECT * FROM studentWHERE math IN (89,90,91);--查询当前学生的年龄SELECT Sname,2020-year(Birthday) AS AgeFROM Students; --Birthday是Date类型,year就是获取对应年的函数
注:where不能和计量函数一起使用,如果一起使用的话要用 having(having和where可以替换)
order by语句

#对数学成绩排序后输出(升序) 啥也不用写,默认的SELECT * FROM studentORDER BY math;#对总分按从高到低的顺序输出 (降序)SELECT `name`,(chinese + math + english) AS total_score FROM studentORDER BY total_score DESC;#对姓赵的学生成绩(总分)排序输出SELECT `name`,(chinese + english + math) AS total_score FROM studentWHERE `name` LIKE '赵%'ORDER BY total_score;#当然也可以这样写,但是这样写不显示总分SELECT * FROM studentWHERE `name` LIKE '赵%'ORDER BY (chinese + english + math);
select增强
#使用where语句 :查找 1992.1.1后入职的员工SELECT * FROM empWHERE hiredate>'1992-01-01';
#使用 like操作符# %: 表示0到多个任意字符# _: 表示单个任意字符#显示首字母为S的员工姓名和工资SELECT ename,sal FROM empWHERE ename LIKE 'S%';#显示第三个字符为大写H的员工的姓名和工资SELECT ename,sal FROM empWHERE ename LIKE '__H%'; #前面两个_ 代表两个任意字符-- 查询以 "C_" 开头的课程-- ESCAPE标识哪个符号为转义符号,此时 '_' 就为本身的意义,因为它位于转义符号之后-- 但是 % 仍然不表示本意,因为 \ 的作用效果只有它后面的一个字符SELECT * FROM Courses WHERE Cname LIKE 'C\_%' ESCAPE '\';
#显示没有上级的雇员SELECT * FROM empWHERE mgr IS NULL;
#使用order by 子句#按照工资从低到高的顺序,显示雇员信息SELECT * FROM empORDER BY sal;#按照部门号升序,但雇员的工资降序排列,显示雇员信息SELECT * FROM empORDER BY deptno ASC,sal DESC;
分组与过滤(group by)

#deptno为部门号#显示每个部门的平均工资和最高工资SELECT AVG(sal),MAX(sal), deptnoFROM emp GROUP BY deptno;
#显示每个部门的每种岗位的平均工资和最低工资 (多种分组方式)SELECT AVG(sal),MAX(sal),deptno,jobFROM empGROUP BY deptno,job;
#显示平均工资低于2000的部门号和它的平均工资 (过滤)#分析: 1. 显示各个部门的平均工资和部门号# 2. 在1结果的基础上进行过滤SELECT AVG(sal),deptnoFROM emp GROUP BY deptoHAVING AVG(sal) < 2000; #用having过滤,因为where无法和合计函数一起使用#也可以使用别名SELECT AVG(sal) AS sal_avg,deptnoFROM emp GROUP BY deptoHAVING sal_avg < 2000;
group by增强
# 1. 显示每种岗位的雇员总数,平均工资SELECT COUNT(*),AVG(sal),jobFROM empGROUP BY job;# 2.显示没有获得补助的雇员数SELECT COUNT(*),COUNT(IF(comm IS NULL,1,NULL))FROM emp;#获得补助的员工 comm不是null,而没有获得补助的员工为null,因此用if语句#如果comm是null就返回1#第二种写法SELECT COUNT(*),COUNT(*)-COUNT(comm)FROM emp;#显示管理者的总人数(去重)SELECT COUNT(DISTINCT mgr)FROM emp;#显示雇员工资的最大差额SELECT MAX(sal) - MIN(sal)FROM emp;
分页查询

#每页显示三行记录#第一页SELECT * FROM empORDER BY empnoLIMIT 0,3; //表示从 第一行开始取,取出3行#第二页SELECT * FROM empORDER BY empnoLIMIT 3,3; //从第四行开始取,取出3行
查询加强





