############### 数据库 ##############
主要是通过这个学习到什么? 1,库的操作 2,表的操作,包括查询,多表查询,子查询 3,视图,事务,索引,锁,
############### 数据库操作 ##############
""" 数据库操作: 1.创建数据库 #创建一个名字为 db_name 的数据库,并指定当前库的编码集为utf8 CREATE DATABASE db_name charset utf8; 2.查看数据库 #查询当前用户下所有数据库 show databases; 3.选择数据库 USE db_name; 4.删除数据库 DROP DATABASE db_name; """
############### 表操作 ##############
""" 表操作: 1,创建表: 语法: CREATE TABLE 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] )ENGINE=innodb DEFAULT CHARSET utf8; 实例: create table student( id int not null auto_increment primary key, name varchar(250) not null, age int not null, sex enum(‘男‘,‘女‘) not null default ‘男‘, salary double(10,2) not null )engine=innodb default charset=utf8; ps: not null :表示此列不能为空 auto_increment :表示自增长,默认每次增长 1 注意:自增长只能添加在主键或者唯一索引字段上 primary key :表示主键(唯一且不为空) engine =innodb :表示指定当前表的存储引擎 default charset utf8 :设置表的默认编码集 2,查询表: select name,sex from student; 或者: select * from student; #查看表结构 例: desc student; #查看创建表信息 show create table student; 3,修改表结构: #添加表字段 alter table 表名 add 字段名 类型 约束; 例如: alter table student add age int not null default 0 after name; ps: after name 表示在name字段后添加字段 age. #修改表字段 方式一: alter table student modify 字段 varchar(100) null; 方式二: alter table student change 旧字段 新字段 int not null default 0; ps:二者区别: change 可以改变字段名字和属性 modify只能改变字段的属性 #删除表字段 : alter table student drop 字段名; #更新表名称: rename table 旧表名 to 新表名; 4,删除表: #删除表 drop table 表名; #清空表 truncate table 表名; 5,复制表: #只复制表结构和表中数据 CREATE TABLE tb2 SELECT * FROM tb1; ps:主键自增/索引/触发器/外键 不会 被复制 #只复制表结构 create table tb2 like tb1; ps: 数据/触发器/外键 不会被复制 6,数据类型:大致可以分为四类:数值、字符串类型、日期/时间和其他类型。 数值型 二进制类型: bit[(M)] 整数类型: tinyint[(m)] int[(m)] bigint[(m) 作用:存储年龄,等级,id,各种号码等 小数型: decimal[(m[,d])](特别的:对于精确数值计算时需要用此类型) FLOAT[(M,D)] DOUBLE[(M,D)] (数值越大,越不准确) 字符型: char (m) varchar(m) text text数据类型用于保存变长的大字符串, 枚举类型(了解): enum 集合类型(了解): set 日期/时间类型: DATE 日期值 TIME 时间值或持续时间 YEAR 年份值 DATETIME 混合日期和时间值 TIMESTAMP 时间戳 """
############### 表操作 ##############
""" 数据操作: 1,插入数据: #语法一: 按字段进行插入 insert into 表(字段1,字段2 ...) values (值1,值2 ...); #语法二:按字段顺序插入 insert into 表 values (值1,值2 ...); #语法三: 插入多条记录 insert into 表 values (值1,值2 ...) ,(值1,值2 ...) ,(值1,值2 ...); #语法四:插入查询结果 insert into 表(字段1,字段2 ...) select 字段1,字段2 ... from 表; 2,更新数据: #语法一: 更新整表数据 update 表 set 字段1= ‘值1‘, 字段2=‘值2‘ ... ; #语法二:更新符合条件字段3的数据 update 表 set 字段1= ‘值1‘, 字段2=‘值2‘ ... where 字段3 = 值3; 3,删除数据: #语法一:整表数据删除 delete from 表 ; #语法二:删除符合 where后条件的数据 delete from 表 where 字段1=值1; """
############### 单表查询 ##############
""" 单表查询: 一.简单查询 #查询所有字段信息 select * from person; #查询指定字段信息 select id,name,age,sex,salary from person; #别名查询,使用的as关键字,as可以省略的 select name,age as‘年龄‘,salary ‘工资‘ from person; #直接对列进行运算,查询出所有人工资,并每人增加100块. select (5/2); select name, salary 100 from person; #剔除重复查询 select distinct age from person; 二 条件查询 #比较运算符: > < >= <= = <>(!=) is null 是否为null select * from person where age = 23; select * from person where age <> 23; select * from person where age is null; select * from person where age is not null; #逻辑运算符: 与 and 或 or select * from person where age = 23 and salary =29000; select * from person where age = 23 or salary =29000; 三 区间查询 # 使用 between...and 进行区间 查询 select * from person where salary between 4000 and 8000; ps: between...and 前后包含所指定的值 等价于 select * from person where salary >= 4000 and salary <= 8000; 四 集合查询 #使用 in 集合(多个字段)查询 select * from person where age in(23,32,18); 等价于: select * from person where age =23 or age = 32 or age =18; #使用 in 集合 排除指定值查询 select * from person where age not in(23,32,18); 五 模糊查询 #模糊查询 like %:任意多个字符, _:单个字符 #查询姓名以"张"字开头的 select * from person where name like ‘张%‘; #查询姓名以"张"字结尾的 select * from person where name like ‘%张‘; #查询姓名中含有"张"字的 select * from person where name like ‘%张%‘; #查询 name 名称 是四个字符的人 select * from person where name like ‘____‘; #查询 name 名称 的第二个字符是 ‘l‘的人 select * from person where name like ‘_l%‘; #排除名字带 a的学生 select * from student where name not like ‘a%‘ 六 排序查询 升序:ASC 默认为升序 降序:DESC PS:排序order by 要写在select语句末尾 #按人员工资正序排列,注意:此处可以省略 ASC关键字 select * from person order by salary ASC; select * from person order by salary; #工资大于5000的人,按工资倒序排列 select * from person where salary >5000 order by salary DESC; #按中文排序 select * from person order by name; #强制中文排序 select * from person order by CONVERT(name USING gbk); ps:UTF8 默认校对集是 utf8_general_ci , 它不是按照中文来的。你需要强制让MySQL按中文来排序 七 聚合函数 聚合函数: 对列进行操作,返回的结果是一个单一的值,除了 COUNT 以外,都会忽略空值 COUNT:统计指定列不为NULL的记录行数; SUM:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0; MAX:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算; MIN:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算; AVG:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0; #格式: select 聚合函数(字段) from 表名; #统计人员中最大年龄、最小年龄,平均年龄分别是多少 select max(age),min(age),avg(age) from person; 八 分组查询 #分组查询格式: select 被分组的字段 from 表名 group by 分组字段 [having 条件字段] ps: 分组查询可以与 聚合函数 组合使用. #查询每个部门的平均薪资 select avg(salary),dept from person GROUP BY dept; #查询每个部门的平均薪资 并且看看这个部门的员工都有谁? select avg(salary),dept,GROUP_CONCAT(name) from person GROUP BY dept; #GROUP_CONCAT(expr):按照分组,将expr字符串按逗号分隔,组合起来 #查询平均薪资大于10000的部门, 并且看看这个部门的员工都有谁? select avg(salary),dept,GROUP_CONCAT(name) from person GROUP BY dept; having avg(salary)>10000; 九 分页查询 好处:限制查询数据条数,提高查询效率 #查询前5条数据 select * from person limit 5; #查询第5条到第10条数据 select * from person limit 5,5; #查询第10条到第15条数据 select * from person limit 10,5; 十 正则表达式 MySQL中使用 REGEXP 操作符来进行正则表达式匹配。 # ^ 匹配 name 名称 以 "e" 开头的数据 select * from person where name REGEXP ‘^e‘; # $ 匹配 name 名称 以 "n" 结尾的数据 select * from person where name REGEXP ‘n$‘; # . 匹配 name 名称 第二位后包含"x"的人员 "."表示任意单个字符 select * from person where name REGEXP ‘.x‘; # [abci] 匹配 name 名称中含有指定集合内容的人员 select * from person where name REGEXP ‘[abci]‘; # [^alex] 匹配 不符合集合中条件的内容 , ^表示取反 select * from person where name REGEXP ‘[^alex]‘; #注意1:^只有在[]内才是取反的意思,在别的地方都是表示开始处匹配 #注意2 : 简单理解 name REGEXP ‘[^alex]‘ 等价于 name != ‘alex‘ # ‘a|x‘ 匹配 条件中的任意值 select * from person where name REGEXP ‘a|x‘; #查询以w开头以i结尾的数据 select * from person where name regexp ‘^w.*i$‘; #注意:^w 表示w开头, .*表示中间可以有任意多个字符, i$表示以 i结尾 十一 SQL 语句关键字的执行顺序 select name, max(salary) from person where name is not null group by name having max(salary) > 5000 order by max(salary) limit 0,5 """
############### 多表查询 ##############
""" 多表查询: 一.多表联合查询 #多表查询语法 select 字段1,字段2... from 表1,表2... [where 条件] 注意: 如果不加条件直接进行查询,则会出现以下效果,这种结果我们称之为 笛卡尔乘积 #查询人员和部门所有信息 select * from person,dept where person.did = dept.did; #注意: 多表查询时,一定要找到两个表中相互关联的字段,并且作为条件使用 二 多表连接查询 #多表连接查询语法(重点) SELECT 字段列表 FROM 表1 INNER|LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段; 1 内连接查询 (只显示符合条件的数据) #查询人员和部门所有信息 select * from person inner join dept on person.did =dept.did; 效果: 大家可能会发现, 内连接查询与多表联合查询的效果是一样的. 2 左外连接查询 (左边表中的数据优先全部显示) #查询人员和部门所有信息 select * from person left join dept on person.did =dept.did; 效果:人员表中的数据全部都显示,而 部门表中的数据符合条件的才会显示,不符合条件的会以 null 进行填充. 3 右外连接查询 (右边表中的数据优先全部显示) #查询人员和部门所有信息 select * from person right join dept on person.did =dept.did; 效果:正好与[左外连接相反] 4 全连接查询(显示左右表中全部数据) 全连接查询:是在内连接的基础上增加 左右两边没有显示的数据 注意: mysql并不支持全连接 full JOIN 关键字 注意: 但是mysql 提供了 UNION 关键字.使用 UNION 可以间接实现 full JOIN 功能 #查询人员和部门的所有数据 SELECT * FROM person LEFT JOIN dept ON person.did = dept.did UNION SELECT * FROM person RIGHT JOIN dept ON person.did = dept.did; 三 复杂条件多表查询 1. 查询出 教学部 年龄大于20岁,并且工资小于40000的员工,按工资倒序排列.(要求:分别使用多表联合查询和内连接查询) #1.多表联合查询方式: select * from person p1,dept d2 where p1.did = d2.did and d2.dname=‘python‘ and age>20 and salary <40000 ORDER BY salary DESC; #2.内连接查询方式: SELECT * FROM person p1 INNER JOIN dept d2 ON p1.did= d2.did and d2.dname=‘python‘ and age>20 and salary <40000 ORDER BY salary DESC; 2.查询每个部门中最高工资和最低工资是多少,显示部门名称 select MAX(salary),MIN(salary),dept.dname from person LEFT JOIN dept ON person.did = dept.did GROUP BY person.did; 3,三张表查询,sql如下:, select a.uid,a.uname,a.upsw,a.urealname,a.utel,a.uremark, b.rid,b.rname,b.rremark,c.deptid,c.deptname,c.deptremark from table1 a,table2 b,table3 c where a.sems_role_rid=b.rid and a.udeptid=c.deptid 或者: select a.uid,a.uname,a.upsw,a.urealname,a.utel,a.uremark, b.rid,b.rname,b.rremark,c.deptid,c.deptname,c.deptremark from table1 a left join table2 b on a.sems_role_rid=b.rid left join table3 c on a.udeptid=c.deptid LEFT JOIN 可以实现统一数据库多表联合查询符合条件的数据。 四 子语句查询 1.作为表名使用 select * from (select * from person) as 表名; 2,作为字段的值 select name,salary from person where salary=(select max(salary) from person); 五 SQL逻辑查询语句执行顺序(重点***) SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by_list> HAVING <having_condition> ORDER BY <order_by_condition> LIMIT <limit_number> """
############### 约束 ##############
""" 约束 外键约束 1,创建表时,同时创建外键约束 CREATE TABLE IF NOT EXISTS dept ( did int not null auto_increment PRIMARY KEY, dname VARCHAR(50) not null COMMENT ‘部门名称‘ )ENGINE=INNODB DEFAULT charset utf8; CREATE TABLE IF NOT EXISTS person( id int not null auto_increment PRIMARY KEY, name VARCHAR(50) not null, age TINYINT(4) null DEFAULT 0, sex enum(‘男‘,‘女‘,‘人妖‘) NOT NULL DEFAULT ‘人妖‘, salary decimal(10,2) NULL DEFAULT ‘250.00‘, hire_date date NOT NULL, dept_id int(11) DEFAULT NULL, CONSTRAINT fk_did FOREIGN KEY(dept_id) REFERENCES dept(did) -- 添加外键约束 )ENGINE = INNODB DEFAULT charset utf8; 2,已经创建表后,追加外键约束 #添加外键约束 ALTER table person add constraint fk_did FOREIGN key(dept_id) REFERENCES dept(did);, #删除外键约束 ALTER TABLE person drop FOREIGN key fk_did; 注:插入数据时,先插入主表中的数据,再插入从表中的数据。 删除数据时,先删除从表中的数据,再删除主表中的数据。 ########################################### 其他约束类型: 1.非空约束 关键字: NOT NULL ,表示 不可空. 用来约束表中的字段列 create table t1( id int(10) not null primary key, name varchar(100) null ); 2.主键约束 用于约束表中的一行,作为这一行的标识符,在一张表中通过主键就能准确定位到一行,因此主键十分重要。 create table t2( id int(10) not null primary key ); 注意: 主键这一行的数据不能重复且不能为空。 3.唯一约束 关键字: UNIQUE, 比较简单,它规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。 create table t4( id int(10) not null, name varchar(255) , unique id_name(id,name) ); //添加唯一约束 alter table t4 add unique id_name(id,name); //删除唯一约束 alter table t4 drop index id_name; 4.默认值约束 关键字: DEFAULT create table t5( id int(10) not null primary key, name varchar(255) default ‘张三‘ ); #插入数据 INSERT into t5(id) VALUES(1),(2); 注意: INSERT语句执行时.,如果被DEFAULT约束的位置没有值,那么这个位置将会被DEFAULT的值填充 """
############### 约束 ##############