INSERT STUDENT(ID, NAME, AGE, SEX)VALUES(1,'孙悟空',20,'男');INSERT STUDENT(ID, NAME, AGE, SEX)VALUES(2,'孙悟天',16,'男');SELECT*FROM STUDENT;UPDATE STUDENT SET SEX ='女';UPDATE student SET SEX='NAN'WHERE AGE =16;UPDATE STUDENT SET AGE =26WHERE ID =1;UPDATE STUDENT SET address ='三里屯';DELETEFROM STUDENT WHERE ID =1;DELETEFROM STUDENT;SELECT NAME AS 姓名, age AS 年龄 FROM student AS st;SELECT*FROM st;SHOWTABLES;SELECT address FROM student;SELECTDISTINCT address FROM student;DROPTABLE Student;SHOWTABLES;
DQL:查询表中的记录
语法
*select*from 表名;1. 语法:
select
字段列表
from
表名列表
where
条件列表
groupby
分组字段
having
分组之后的条件
orderby
排序
limit
分页限定
3. 条件查询
1.where子句后跟条件
2. 运算符
*> 、< 、<= 、>= 、= 、<>*BETWEEN...AND*IN( 集合)*LIKE:模糊查询
* 占位符:
* _:单个任意字符
*%:多个任意字符
*ISNULL*and 或 &&*or 或 ||*not 或 !-- 查询年龄大于20岁SELECT*FROM student WHERE age >20;SELECT*FROM student WHERE age >=20;-- 查询年龄等于20岁SELECT*FROM student WHERE age =20;-- 查询年龄不等于20岁SELECT*FROM student WHERE age !=20;SELECT*FROM student WHERE age <>20;-- 查询年龄大于等于20 小于等于30SELECT*FROM student WHERE age >=20&& age <=30;SELECT*FROM student WHERE age >=20AND age <=30;SELECT*FROM student WHERE age BETWEEN20AND30;-- 查询年龄22岁,18岁,25岁的信息SELECT*FROM student WHERE age =22OR age =18OR age =25SELECT*FROM student WHERE age IN(22,18,25);-- 查询英语成绩为nullSELECT*FROM student WHERE english =NULL;-- 不对的。null值不能使用 = (!=) 判断SELECT*FROM student WHERE english ISNULL;-- 查询英语成绩不为nullSELECT*FROM student WHERE english ISNOTNULL;-- 查询姓马的有哪些? likeSELECT*FROM student WHERE NAME LIKE'马%';-- 查询姓名第二个字是化的人SELECT*FROM student WHERE NAME LIKE"_化%";-- 查询姓名是3个字的人SELECT*FROM student WHERE NAME LIKE'___';-- 查询姓名中包含德的人SELECT*FROM student WHERE NAME LIKE'%德%';
CREATETABLE student(
id INT,
NAME VARCHAR(30),
math INT,
english INT);DESC student;INSERT student(id, NAME, math, english)VALUES(1,'111',90,100);INSERT student(id, NAME, math, english)VALUES(2,'222',95,93);INSERT student(id, NAME, math, english)VALUES(3,'333',94,98);INSERT student(id, NAME, math, english)VALUES(4,'444',100,100);SELECT*FROM student;SELECT math+5FROM student;SELECT*FROM student;SELECT*,(math+english)AS 总成绩 FROM student;CREATETABLE student3 ( id INT,-- 编号
NAME VARCHAR(20),-- 姓名
age INT,-- 年龄
sex VARCHAR(5),-- 性别
address VARCHAR(100),-- 地址
math INT,-- 数学
english INT-- 英语 );INSERTINTO student3(id,NAME,age,sex,address,math,english)VALUES(1,'马云',55,'男','杭州',66,78),(2,'马化腾',45,'女','深圳',98,87),(3,'马景涛',55,'男','香港',56,77),(4,'柳岩',20,'女','湖南',76,65),(5,'柳青',20,'男','湖南',86,NULL),(6,'刘德华',57,'男','香港',99,99),(7,'马德',22,'女','香港',99,99),(8,'德玛西亚',18,'男','南京',56,65);SELECT*FROM student3;SELECT*FROM student3 WHERE math>80;SELECT*FROM student3 WHERE age <>20;SELECT*FROM student3 WHERE age !=20;SELECT*FROM student3 WHERE age>35AND sex='男';SELECT*FROM student3 WHERE age>35OR sex='男';SELECT*FROM student3 WHERE id=1OR id=3OR id=5;SELECT*FROM student3 WHERE id IN(1,3,5);SELECT*FROM student3 WHERE id NOTIN(1,3,5);SELECT*FROM student3 WHERE english BETWEEN75AND90;SELECT*FROM student3 WHERE NAME LIKE'马%';SELECT*FROM student3 WHERE NAME LIKE'马';SELECT*FROM student3 WHERE NAME LIKE'%德%';SELECT*FROM student3 WHERE NAME LIKE'马_';
3. 分组查询:
1. 语法:groupby 分组字段;
2. 注意:
1. 分组之后查询的字段:分组字段、聚合函数
2.where 和 having 的区别?
1.where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
2.where 后不可以跟聚合函数,having可以进行聚合函数的判断。
-- 按照性别分组。分别查询男、女同学的平均分SELECT sex ,AVG(math)FROM student GROUPBY sex;-- 按照性别分组。分别查询男、女同学的平均分,人数SELECT sex ,AVG(math),COUNT(id)FROM student GROUPBY sex;-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组SELECT sex ,AVG(math),COUNT(id)FROM student WHERE math >70GROUPBY sex;-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组,分组之后。人数要大于2个人SELECT sex ,AVG(math),COUNT(id)FROM student WHERE math >70GROUPBY sex HAVINGCOUNT(id)>2;SELECT sex ,AVG(math),COUNT(id) 人数 FROM student WHERE math >70GROUPBY sex HAVING 人数 >2;
* 非空约束:notnull,某一列的值不能为null1. 创建表时添加约束
CREATETABLE stu(
id INT,
NAME VARCHAR(20)NOTNULL-- name为非空);2. 创建表完后,添加非空约束
ALTERTABLE stu MODIFY NAME VARCHAR(20)NOTNULL;3. 删除name的非空约束
ALTERTABLE stu MODIFY NAME VARCHAR(20);
唯一约束
* 唯一约束:unique,某一列的值不能重复
1. 注意:
* 唯一约束可以有NULL值,但是只能有一条记录为null2. 在创建表时,添加唯一约束
CREATETABLE stu(
id INT,
phone_number VARCHAR(20)UNIQUE-- 手机号);3. 删除唯一约束
ALTERTABLE stu DROPINDEX phone_number;4. 在表创建完后,添加唯一约束
ALTERTABLE stu MODIFY phone_number VARCHAR(20)UNIQUE;
主键约束
* 主键约束:primarykey。
1. 注意:
1. 含义:非空且唯一
2. 一张表只能有一个字段为主键
3. 主键就是表中记录的唯一标识
2. 在创建表时,添加主键约束
createtable stu(
id intprimarykey,-- 给id添加主键约束
name varchar(20));3. 删除主键
-- 错误 alter table stu modify id int ;ALTERTABLE stu DROPPRIMARYKEY;4. 创建完表后,添加主键
ALTERTABLE stu MODIFY id INTPRIMARYKEY;5. 自动增长:
1. 概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长
2. 在创建表时,添加主键约束,并且完成主键自增长
createtable stu(
id intprimarykeyauto_increment,-- 给id添加主键约束
name varchar(20));3. 删除自动增长
ALTERTABLE stu MODIFY id INT;4. 添加自动增长
ALTERTABLE stu MODIFY id INTAUTO_INCREMENT;
3. 子查询:
* 概念:查询中嵌套查询,称嵌套查询为子查询。
-- 查询工资最高的员工信息-- 1 查询最高的工资是多少 9000SELECTMAX(salary)FROM emp;-- 2 查询员工信息,并且工资等于9000的SELECT*FROM emp WHERE emp.`salary`=9000;-- 一条sql就完成这个操作。子查询SELECT*FROM emp WHERE emp.`salary`=(SELECTMAX(salary)FROM emp);* 子查询不同情况
1. 子查询的结果是单行单列的:
* 子查询可以作为条件,使用运算符去判断。 运算符: >>=<<==*-- 查询员工工资小于平均工资的人SELECT*FROM emp WHERE emp.salary <(SELECTAVG(salary)FROM emp);2. 子查询的结果是多行单列的:
* 子查询可以作为条件,使用运算符in来判断
-- 查询'财务部'和'市场部'所有的员工信息SELECT id FROM dept WHERE NAME ='财务部'OR NAME ='市场部';SELECT*FROM emp WHERE dept_id =3OR dept_id =2;-- 子查询SELECT*FROM emp WHERE dept_id IN(SELECT id FROM dept WHERE NAME ='财务部'OR NAME ='市场部');3. 子查询的结果是多行多列的:
* 子查询可以作为一张虚拟表参与查询
-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息-- 子查询SELECT*FROM dept t1 ,(SELECT*FROM emp WHERE emp.`join_date`>'2011-11-11') t2
WHERE t1.id = t2.dept_id;-- 普通内连接SELECT*FROM emp t1,dept t2 WHERE t1.`dept_id`= t2.`id`AND t1.`join_date`>'2011-11-11'
*SQL分类:
1. DDL:操作数据库和表
2. DML:增删改表中数据
3. DQL:查询表中数据
4. DCL:管理用户,授权
* DBA:数据库管理员
* DCL:管理用户,授权
1. 管理用户
1. 添加用户:
* 语法:CREATEUSER'用户名'@'主机名' IDENTIFIED BY '密码';
2. 删除用户:
* 语法:DROP USER '用户名'@'主机名';
3. 修改用户密码:
UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';
UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi';
SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');
* mysql中忘记了root用户的密码?
1. cmd -- > net stop mysql 停止mysql服务
* 需要管理员运行该cmd
2. 使用无验证方式启动mysql服务: mysqld --skip-grant-tables
3. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
4. use mysql;
5. update user set password = password('你的新密码') where user = 'root';
6. 关闭两个窗口
7. 打开任务管理器,手动结束mysqld.exe 的进程
8. 启动mysql服务
9. 使用新密码登录。
4. 查询用户:
-- 1. 切换到mysql数据库
USE myql;
-- 2. 查询user表
SELECT * FROM USER;
* 通配符: % 表示可以在任意主机使用用户登录数据库
2. 权限管理:
1. 查询权限:
-- 查询权限
SHOW GRANTS FOR '用户名'@'主机名';
SHOW GRANTS FOR 'lisi'@'%';
2. 授予权限:
-- 授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
-- 给张三用户授予所有权限,在任意数据库任意表上
GRANT ALL ON *.* TO 'zhangsan'@'localhost';
3. 撤销权限:
-- 撤销权限:
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';