''' 增 create database name; create database name charset='gbk'; 删 show databases; show create database name; 改 alter database name charset='gbk'; 查 drop database name; '''
''' 严格模式就是规范你的输入数据,如果大于限制条件,报错,而不是写入最大值 show variables like "%mode"; 模糊查询:like % 表示匹配任意多个字符 _ 表示匹配任意单个字符 # 修改严格模式 set session 只在当前窗口有效 set global 全局有效 set global sql_mode = 'STRICT_TRANS_TABLES'; 改完之后需要重启MySQL '''
8. 基本数据类型
8.1 整型
1 2 3 4 5 6 7 8
''' 最常用就是 int int 后面跟的数字表示 比如 int(7) 数字超过八位,有几位存几位; 没超过八位,空格补全; 所以一般不用去限制int后面的数字,默认为11 '''
''' 要先创一个中间表,和两个普通表,中间表作为两个表格的中介 比如书名可以对应两个作者,作者可以对应两本书 create table book( id int primary key auto_increment, title char, price int ); create table author( id int primary key auto_increment, name char, age int ); create table book_author( id int primary key auto_increment, author_id int, book_id int, foreign key(author_id) references author(id) on update cascade on delete cascade, foreign key(book_id) references book(id) on update cascade on delete cascade ); '''
''' where: 进行筛选操作 1. 范围内筛选 select id,name,age from t1 where id>=3 and id<=6; select id,name,age from t1 where id between 3 and 6; 等于上面的 select id,name,age from t1 where id not between 3 and 6; 2. 值等于筛选 select * from t1 where salary=20000 or salary=18000 or salary=17000; select * from t1 where salary in (20000,18000,17000); 等于上面的 select * from t1 where salary not in (20000,18000,17000); 3. 模糊筛选,名字里有字母a的 select name from t1 where name like '%a%'; 4. 查询名字是否由四个字符组成 select name from t1 where name like '____'; # 四个下划线_ select name from t1 where char_length(name) = 4; 5. 查是否为空 select name from t1 where description is NULL; or is not NULL; '''
''' group by 分组 select type from t1 group by type; 显示所有的type名字 select type,max(salary) from t1 group by type; 显示每个类型里的薪水最高的那一项 select type as '类型',max(salary) as '最高薪水' from t1 group by post; 结果显示出来把type用类型代替,就是方便查看 max(salary) 最大值 min(salary) 最小值 avg(salary) 平均值 sum(salary) 求和 count(id) 数量 ?查询分组后的部门名称和每个部门下所有人员的姓名? 强大的 group_concat select type,group_concat(name) from t1 group by type; select type,group_concat(name, '_BIG') from t1 group by type; 拼接字符串 select type,group_concat(name,':',salary) from t1 group by type; concat 没有group by的时候也想实现字符串拼接就用concat select concat('姓名: ',name),concat('薪水:',salary) from t1; 结果运算 select name,salary*12 from t1; '''
如果同时有where和group by,group by需出现在where后面
12.3 having
1 2 3 4 5 6 7 8
''' having 分组之后的筛选条件 跟where功能一样,一个在分组之前筛选,一个在分组之后筛选 ?各班年龄大于15的学生的平均分,且平均分大于80 select class,avg(score) from school where age>15 group by class having avg(score) > 80; '''
12.4 distinct
1 2 3 4 5 6 7
''' distinct 去重 必须完全一样才能去重 意思就是主键存在,不可能去重,先把主键筛选掉 select distinct age from t1; '''
12.5 order by
1 2 3 4 5 6 7 8 9 10
''' order by 排序 默认升序 asc 降序:desc select * from t1 order by salary; select * from t1 order by salary desc; 多个排序 select * from t1 order by age desc,salary asc; '''
12.6 limit
1 2 3 4 5 6
''' limit 数据过多时,进行分页操作,不然会卡死 select * from t1 limit 3; 只显示三条数据 select * from t1 limit 10,5; 从第十个数据开始,显示五条数据 两个数字时:第一个参数表示起始位置,第二个参数是展示条数 '''
12.7 regexp
1 2 3 4 5 6
''' regex 正则 select * from t1 where regexp '^j.*(n|y)$'; 拿到以j开头,n or y结尾的数据,中间商随意 '''
13 连表操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14
''' 当我想通过一张表的数据对应到另外一张表数据时 select * from t1,t2 where t1.id = t2.dep_id; 上面的表达不清楚,MySQL有更细的对应方法 inner join 拼接两张表中共有的数据部分 left join 左边数据都显示没有对应部分时用NULL代替 right join 右边数据都显示没有对应部分时用NULL代替 union 不了解了 select * from t1 inner join t2 on t1.id = t2.dep_id; '''
14 子查询
1 2 3 4 5 6 7 8 9 10 11 12
''' 将一个查询结果作为另一个查询条件去用 ?查询部门是技术人员或者人力资源的员工信息 分开来: select id from dep where name='技术' or name='人力资源'; select name from emp where dep_id in (200,201); 用子查询: select * from emp where dep_id in (select id from dep where name='技术' or name='人力资源'); '''
sql = 'select * from author;'# sql语句 rsp = cursor.execute(sql) # 响应此sql语句 print(rsp) # 这个sql结果有几行 print(cursor.fetchone()) # take the first one print(cursor.fetchall()) # take all print(cursor.fetchmany(5)) # take 5 # 读取类似文件光标的移动 cursor.scroll(1, 'relative') # 想对于当前位置,往后移动一位 cursor.scroll(1, 'absolute') # 相对于起始位置,往后移动一位