Database changed
mysql> select desc
from
t;
ERROR
1064
(
42000
): You have an
error
in
your SQL syntax; check
the
manual
that
corresponds
to
your MySQL server
version
for
the
right syntax
to
use near 'desc
from
t'
at
line
1
果然出错了,其实出现这个错误的原因是desc这个单词是MySQL数据库的关键字,所以sql语句执行到这里的时候觉得语句有问题。
处理方式,在列名字前后加上如下所示的符号
| 23234 |
| klsadjflkasj |
3 rows in set (0.00 sec)
MySQL中的关键字列表
面试被问到一个问题,假如MySQL中的关键字在查询语句中作为列明或者表名出现,应该怎么处理。例如select desc from t;一脸懵逼。尴尬。于是乎,自己私下做了一个实验,发现了其中原因,特此分享。创建t表,包含两个字段,id和desc插入了三条数据mysql> use test;Database changedmysql> select desc from t;ERROR 1064
MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言–结构化查询语言(SQL)进行数据库管理。
使用Select语句返回的数据,可能会发现显示的数据会与其他的地方顺序不同。出现这种情况很正常。如果没有明确排序查询结果。则返回的数据没有特殊意义。返回数据的顺序可能是是数据被添加到表中的顺序,也可能不是。只要返回相同数目的行,就是正常。
注意:SQL语句和大小写 请注意,SQL语句不区分大小写,因此select和SELECT是相同的。同样,写成Select也没有关系。许多SQL开发人员喜欢对所有SQL关键字使用大写,而对所有列名和表名使用
内连接 inner join:在两张表进行连接查询时,只保留两张表中完全匹配的结果集
外连接常用的有左连接、右连接。
左连接 left join :在两张表进行连接查询时,会返回左表所有的行,以及右表中匹配的行,右表中没有匹配到的返回null
右连接 right join:在两张表进行连接查询时,会返回右表所有的行,以及左表中匹配的行,左表中没有匹配到的返回null。先建两张表:t_user和t_class
2、创建表 create table 表名(列及类型)
creat table student(id int auto_increment primary key,name varchar(20) not null,age int not null,gender bit default 1,address varchar(20), isDelete bit default 0)
3、删除表 drop table 表名;
4、查看表结构desc 表名;
5、查看建表语句show create table 表名;
5、重命名表名:
rename table 原表名 to 新表名;
6、修改表结构 alter table 表名 add|change|drop 列名 数据类型
7、数据修改:
1、增加数据:
a: 全列插入:insert into 表名 values(0,”lin”,”yellow”,200,0)
说明:主键是不用输入的,但是全列插入时要用0占位,实际以自动生成的为准
b:缺省插入:有默认值而却不需要添加时使用
Insert into 表名(列名1,列名2......) values(值1,值2.......)
C:多条插入:insert into 表名 values(值1,值2,。。),(值1,值2,。。。)
多条插入也支持缺省输入
2、删除数据
delete from 表名 where 条件;
delete from stu where id = 9;
没有条件是全部删除,慎用
a、from关键字后面是表名,表示数据来源于这个表
b、Select后面写表中的列名,如果是*表示在结果集中显示表中的所有列。
c、在select后面的列名部分,可以使用as为列名起别名,这个别名显示在结果集中,但是再用别名找找不到该列。
d、如果想查询多个列,之间用逗号分隔
2、消除重复行
在select后面列的前面使用distinct可以不显示重复的行
3、条件查寻
a、语法:
Select * from 表名 where 条件
B、比较运算符:
等于 = 大于> 小于 < 大于等于>= 小于等于<= 不等于!=或<>
b、逻辑运算符
And or not
C、模糊查寻
%表示任意多个字符
_表示一个任意字符
D、范围查询
In 表示在一个非连续的范围内
Between.......and.............表示在一个连续的范围内
需求:查询编号是8,10,12的数据
实例:select * from stu where id in (8,10,12);
需求:查询id在6-8的学生
E、空判断
注意null 与””不同
判断空:is null
判断非空:is not null
查询没有地址的同学;
Select * from stu where address is null;
e、优先级
小括号,not ,比较运算符 ,逻辑运算符,and比or优先级高,如果同时使用,建议使用();
为了快速得到统计的数据,提供了5个聚合函数
Select 函数() from 表名;
1、count(*) 表示计算总行数,()中可以写*或列名
2、max(列名) 表示求此列的最大值
3、min(列名) 表示求此列的最小值
4、sum(列名) 表示求此列的和
5、avg(列名) 表示求平均数值
需求:查询女生id的最大值:
需求:查看“l”开头的学生年龄和
分组是为了将分组后的数据通过聚合函数显示使用,按照字段进行分组,表示此字段相同的数据会被放到一个集合中
分组后,只能查询出相同的数据列,对于有差异的数据列,无法显示在结果集中,可以对分组后的数据进行聚合运算
语法 select 列1,列2,聚合.............From 表名 group by 列1,列2,........
需求,查询男生,女生分别有多少人
分组后的数据筛选语法 select 列1,列2,聚合.............From 表名 group by 列1,列2,........ having 列1,列2
语法:select * from 表名 order by 列1 asc|desc, 列2 asc|desc.....
A、将数据按照列1 进行排序,如果列1数据相同,则按照列2进行排序,.......
B、默认升序
C、Asc表示升序
D、Desc表示降序
如果需要筛选,where 条件要放在表名后面
Select * from stu limit srart count
八、关联:
建表语句:
1/create table class(id int auto_increment primary key,name varchar(20) not null ,stuNum int not null);
2/create table students(id int auto_increment primary key,name varchar(20) not null ,gender bit default 1,classid int not null,foreign key (classid) references class(id));
关联查询 select students.name,class.name from class inner join students on class.id = students.classid;
1、关联查询 select students.name,class.name from class inner join students on class.id = students.classid;
2、left join
会将A中有的填充到左边,没有用null填充
3,rightjoin
会将b中有填充到右边,没有用null填充
使用python写代码前,要退出mysql,要用pip install PyMySql添加库
建立外键的前提:本表的列必须与外键类型相同(外键必须是外表主键)。 外键作用: 使两张表形成关联,外键只能引用外表中的列的值! 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名>(外键列名) 事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action 例如: outTable表 主键 id 类型 int 创建含有外键的表: create table temp( id i
<表名>:用于指定要更新的表名称。
SET 子句:用于指定表中要修改的列名及其列值。其中,每个指定的列值可以是表达式,也可以是该列对应的默认值。如果指定的是默认值,可用关键字 DEFAULT 表示列值。
WHERE 子句:可选项。用于限定表中要修改的行。若不指定,则修改表中所有的行。
ORDER BY 子句:可选项。用于限定表中的行被修改的次序。
LIMIT 子句:可选项。用于限定被修改的行数。
注意:修改一行数据的多个列值时,SET 子句的每个值用逗号分开即可。
修改表中的数据
【实例 1】在 tb_courses_new 表中,更新所有行的 course_grade 字段值为 4,输入的 SQL 语句和执行结果如下所
表名1 INNER JOIN 表名2 USING (列名) [WHERE 条件表达式]
外连接语法格式如下:
表名1 LEFT| RIGHT JOIN 表名2 USING (列名) [WHERE 条件表达式]
; 【例】 查找Members表中所有订购过图书的会员的姓名。
SELECT Distinct 姓名
FROM Members
JOIN Sell USING (用户号);
与下列语句等价:
SELECT Distinct 姓名
FROM Members JOIN Sell
ON Members.用户号=Sell.用户号;; Join.......Using子句也可以实现多个表的连接。
【例】查找购买了“网页程序设计”且订购数量大于5本的图书的会员姓名和订购册数。
SELECT Book.图书编号, 姓名, 订购册数
FROM Sell JOIN Book using(图书编号)
JOIN Members using(用户号)
WHERE 书名 = '网页程序设计' AND 订购册数>5; ;USING子句的作用
USING子句的
所有数据库对象名称必须使用小写字母并用下划线分割
所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)
数据库对象的命名要能做到见名识意,并且最后不要超过32个字符
临时库表必须以tmp_为前缀并以日期为后缀,备份表必须以bak_为前缀并以日期(时间戳)为后缀
所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低)
数据库基本设计规范
1. 所有表必须使用Innodb存储引擎
没有特殊要求(即Innodb无法满足