一、sql简介
SQL 全名是结构化查询语言(Structured Query Language),是用于数据库中的标准数据查 询语言,
IBM 公司最早使用在其开发的数据库系统中。1986 年10 月,美国 ANSI 对 SQL 进行规范后,以此
作为关系式数据库管理系统的标准语言 (ANSI X3. 135- 1986),1987 年 得到国际标准组织的支持下
成为国际标准。不过各种通行的数据库系统在其实践过程中都 对 SQL 规范作了某些编改和扩充。
所以,实际上不同数据库系统之间的SQL 语言不能完 全相互通用。
DML 语句(数据操作语言)Insert、Update 、 Delete 、
DDL 语句(数据定义语言)Create、Alter 、 Drop、Truncate
DCL 语句(数据控制语言)Grant、Revoke 事务控制语句Commit 、Rollback、Savepoint
二、数据库管理
1.登录数据库
mysql -u root -p
2.查看所有的数据库
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema | -- mysql元数据,基础数据
| mysql | -- mysql配置数据库,其中包含用户信息。(用户名和密码,权限管理)
| performance_schema | -- mysql数据库软件的运行数据,日志信息,性能数据
| test | -- 测试数据库。空的
+--------------------+
4 rows in set (0.00 sec)
以上四个库是mysql的基础数据库,存储着mysql的基础数据,如变量等等。
3.显示数据库语句:
SHOW DATABASES 只是显示数据库的名字
4.显示数据库创建语句:
SHOW CREATE DATABASE db_name
5.数据库删除语句:
DROP DATABASE [IF EXISTS] db_name
6.创建数据库
create database day15; -- 指定默认字符集创建数据库
-> default character set utf8
-> ;
Query OK, 1 row affected (0.00 sec)
7.删除数据库
drop database day15;
8.查看数据库默认的字符集
show create database day15;
9.修改数据库默认的字符集
alter database day15 default character set gbk;
7.进入数据库
use day15;
三、表的管理
3.1 MySQL常用数据类型
3.2 sql语句
+++ 查看数据库中所有的表
show tables;
+++ 查看一张表的表结构
desc student;
+++ 创建表
create table student(
sid int,
sname varchar(20),
sage int
);
+++ 删除表
drop table day15;
+++ 修改表
1)添加字段
alter table student add column sgender varchar(2);
2)删除字段
alter table student drop column sgender;
3)修改字段类型
alter table student modify column remark varchar(100);
4)修改字段名称
alter table student change column sgender gender varchar(2);
5)修改表名称
alter table student rename to teacher;
四、数据管理
4.1 增删改数据
++++ 增加数据
1)插入所有字段
INSERT INTO student VALUES(1,'张三','男',20);
必须依次插入所有字段对应的数据,一个都不能少,一个都不能乱
2)插入部分字段
INSERT INTO student(id,NAME) VALUES(2,'李四');
++++ 修改数据
1)修改所有数据(建议少用)
UPDATE student SET gender='女';
2)带条件的修改(推荐使用)
UPDATE student SET gender='男' WHERE id=1; -- 修改id为1的学生,修改性别为男
3)修改多个字段,注意: SET 字段名=值,字段名=值,....
UPDATE student SET gender='男',age=30,name='小三' WHERE id=2;
++++ 删除数据
1)删除所有数据
方式一:
delete from student;
方式二:
truncate table student;
2)带条件的删除(推荐使用)
DELETE FROM student WHERE id=2;
delete from stu 和 truncate table stu 的区别?
删除表中所有数据有两种方式,
一种是 delete from stu ;
另一种是 truncate table stu;
delete from stu 和 truncate table stu 的区别?
-- delete from: 可以全表删除
1.可以带条件删除
delete from table where id=1;
2.只能删除表的数据,不能删除表的约束
例子:如果表中的数据id为自增的,此时id为11。
这时使用 delete from stu 删除全表。
再次新增数据时,id为12;(删除全表,没有影响自增长约束)
3.使用delete from删除的数据可以回滚(事务)
-- truncate table: 可以全表删除
1.不能带条件删除
truncate table emp where id=1; (这种写法错误)
2.即可以删除表的数据,也可以删除表的约束
例子:如果表中的数据id为自增的,此时id为11。
这时使用 truncate table stu 删除全表。
再次新增数据时,自增长约束重置,id则重新计数,id=1;(删除全表,影响自增长约束)
3.使用truncate table删除的数据不能回滚
delete from stu | truncate table stu | |
---|---|---|
全表删除 | 可以 | 可以 |
带条件删除 | 可以 | 不可以 |
删除约束 | 不可以 | 可以 |
可以回滚 | 可以 | 不可以 |
4.2 查询数据
1.查询所有列
SELECT * FROM student;
2.查询指定列
SELECT id,NAME,gender FROM student;
3.查询时添加常量列
-- 需求: 在查询student表时添加一个班级列,内容为“java就业班”
SELECT id,NAME,gender,age,'java就业班' AS '年级' FROM student;
4.查询时合并列
-- 需求: 查询每个学生的servlet和jsp的总成绩
SELECT id,NAME,(servlet+jsp) AS '总成绩' FROM student;
-- 需求: 查询每个学生的servlet和jsp的总成绩大于100的人
SELECT * FROM student where (servlet+jsp) >100 ;
注意:1)合并列通常用于合并两个数值的总和。
2)合并列只能合并数值类型的字段,不能合并非数值类型的字段。
5.查询时去除重复记录(DISTINCT)
-- 需求: 查询学生的性别 男 女
方式一:
SELECT DISTINCT gender FROM student;
方式二:
SELECT DISTINCT(gender) FROM student;
注意:
SELECT DISTINCT sex ,age FROM student;
只有当sex,age两列都重复时,才被视为重复列。
6.条件查询(where)
1)逻辑条件:and(与) or(或) not
a.需求: 查询id为2,且姓名为李四的学生
SELECT * FROM student WHERE id=2 AND NAME='李四'; -- 交集
b. 需求: 查询id为2,或姓名为张三的学生
SELECT * FROM student WHERE id=2 OR NAME='张三'; -- 并集
c:需求 :查询成绩不大于200的学生
SELECT * FROM student where not(score>200);
2)比较条件: > < >= <= = <>(不等于) between and (等价于>= 且 <=)
a.需求: 查询servlet成绩大于70分的学生
SELECT * FROM student WHERE servlet>70;
b.需求: 查询jsp成绩大于等于75,且小于等于90分的学生
方式一:
SELECT * FROM student WHERE jsp>=75 AND jsp<=90;
方式二:
SELECT * FROM student WHERE jsp BETWEEN 75 AND 90; -- (包前包后)
c.
SELECT * FROM student WHERE gender<>'男';
注意: BETWEEN 75 AND 90; 包前包后。 75<= x <=90
3) 判空条件(null 空字符串): is null / is not null / ='' / <>''
a.需求: 查询地址为空的学生(包括null和空字符串)
-- 判断null
SELECT * FROM student WHERE address IS NULL ;
-- 判断空字符串
SELECT * FROM student WHERE address='';
SELECT * FROM student WHERE address IS NULL OR address=''; -- (包括null和空字符串)
b.需求: 查询有地址的学生(不包括null和空字符串)
SELECT * FROM student WHERE address IS NOT NULL AND address<>'';
4)模糊条件: like
a.通常使用以下替换标记:
-- % : 表示任意个字符
-- _ : 表示一个字符
-- 需求: 查询姓‘张’的学生
SELECT * FROM student WHERE NAME LIKE '李%';
-- 需求: 查询姓‘李’,且姓名只有两个字的学生
SELECT * FROM student WHERE NAME LIKE '李_';
5) IN
显示在in列表中的值,例:in(100,200)
例子:
CREATE TABLE student(id INT ,NAME VARCHAR(20),chinese FLOAT,english FLOAT,math FLOAT);
INSERT INTO student VALUES(1,'李红',98,34.2,84);
INSERT INTO student VALUES(2,'白红',91,36.2,67);
INSERT INTO student VALUES(3,'王帅',96,34.2,34);
INSERT INTO student VALUES(4,'白鹭',94,56,34);
INSERT INTO student VALUES(5,'螽斯',92,90.2,5);
--查询所有的学生
SELECT * FROM student ;
--查询表中所有学生的姓名和英语成绩
SELECT id ,NAME ,english FROM student;
--查询英语成绩大于等于90分的同学
SELECT id ,NAME ,(chinese+math+english ) AS '总分' FROM student;
--查询总分大于200分的学生
SELECT * FROM student WHERE (chinese+math+english )>200
--查询所有姓白的学生
SELECT * FROM student WHERE NAME LIKE '白%';
--查询英语>50 或者总分 >200 的学生
SELECT * FROM student WHERE english >50 OR (chinese+math+english )>200;
-- 统计每个学生的总分
SELECT id,NAME ,(chinese+math+english ) AS '总分' FROM student
-- 在每个学生的总分上再加上10分的特长分。
SELECT id,NAME ,(chinese+math+english +10) AS '总分' FROM student
7.聚合查询
常用的聚合函数: sum() avg() max() min() count()
-- 需求:查询学生的servlet的总成绩 (sum() :求和函数)
SELECT SUM(servlet) AS 'servlet的总成绩' FROM student;
-- 需求: 查询学生的servlet的平均分
SELECT AVG(servlet) AS 'servlet的平均分' FROM student;
-- 需求: 查询当前servlet最高分
SELECT MAX(servlet) AS '最高分' FROM student;
-- 需求: 查询最低分
SELECT MIN(servlet) AS '最低分' FROM student;
-- 需求: 统计当前有多少学生(count(字段))
SELECT COUNT(*) FROM student;
SELECT COUNT(id) FROM student;
注意:1.count()函数统计的数量不包含null的数据
count(*) 统计表中每一列的数据有多少个,然后取最大值
count(age) 统计age列的数据有多少个。
所以从理论上来说,count(age)的效率要高于count(*)
使用count(列)统计表的记录数,要使用不包含null值的字段
8 分页查询(limit 起始行,查询几行)
SELECT * FROM student limit 起始行,查询几行;
起始行从0开始
分页查询当前页的数据的sql
SELECT * FROM student LIMIT (当前页-1)*每页显示多少条,每页显示多少条;
-- 需求: 查询第1,2条记录(第1页的数据)
SELECT * FROM student LIMIT 0,2;
-- 查询第3,4条记录(第2页的数据)
SELECT * FROM student LIMIT 2,2;
-- 查询第5,6条记录(第3页的数据)
SELECT * FROM student LIMIT 4,2;
-- 查询第7,8条记录 (没有记录不显示)
SELECT * FROM student LIMIT 6,2;
9.查询排序
语法 :order by 字段 asc/desc
asc: 顺序,正序。数值:递增,字母:自然顺序(a-z)
desc: 倒序,反序。数值:递减,字母:自然反序(z-a)
1)单个字段排序
-- 默认情况下,按照插入记录顺序排序
SELECT * FROM student;
-- 需求: 按照id顺序排序
SELECT * FROM student ORDER BY id ASC;
SELECT * FROM student ORDER BY id; -- 默认正序
SELECT * FROM student ORDER BY id DESC;-- 反序
2)多个字段排序
-- 需求: 按照servlet正序,按照jsp的倒序
SELECT * FROM student ORDER BY servlet ASC,jsp DESC;
10 分组查询(group by)
-- 需求: 查询男女的人数
-- 预期结果:
-- 男 3
--- 女 2
-- 1) 把学生按照性别分组(GROUP BY gender)
-- 2) 统计每组的人数(COUNT(*))
SELECT gender,COUNT(*) FROM student GROUP BY gender;
11 分组查询后筛选
-- 需求: 查询总人数大于2的性别
-- 1) 查询男女的人数
-- 2)筛选出人数大于2的记录(having)
--- 注意: 分组之前条件使用where关键字,分组之前条件使用having关键字
SELECT gender,COUNT(*) FROM student WHERE GROUP BY gender HAVING COUNT(*)>2;
4.3 数据做基础运算
基础运算:
查询时做基础运算
SELECT chinese + english FROM student
SELECT chinese / english FROM student
SELECT chinese * english FROM student
修改时做基础运算
UPDATE student SET chinese=chinese+english
UPDATE student SET chinese=chinese/english
UPDATE student SET chinese=chinese*10
注意:
1.基础运算时,两列数据类型必须都为数字类型。
2.基础运算时,如果有一列数据为null,则结果为null
eg:chinese english chinese+english
10 null null
20 30 50
null 30 null
30 0 30
五、MySql乱码管理
mysql有六处使用了字符集,分别为:client 、connection、database、results、server 、
system。
client是客户端使用的字符集。
connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型
就按照服务器端默认的字符集设置。
database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安
装时指定的字符集设置。
results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符
集。
server是服务器安装时指定的默认字符集设定。
system是数据库系统使用的字符集设定。
MySql乱码管理,查看和修改数据库字符集:
show variables like 'character%';
set character_set_results=gbk;
set character_set_client=gbk;