python 作业第十一天(mysql 基础)

1. 查询数据库

(1)查看有哪些数据库

mysql> show databases;

 

(2)查看数据库创建过程

mysql> show create database s19;

 

2.创建数据库:

(1)创建数据库并设置字符集

mysql> create database s19 CHARACTER SET utf8;

 

(2)查看数据库表结构:

mysql> desc s19;

3.#更改数据库字符集:

永久更改:

mysql> alter database s18 CHARACTER SET utf8;

 

临时更改:

set names utf8;

 

4.sql 语句注释:

单行注释:--

多行注释:/*....*/

 

5.创建一个数据库表:

mysql> create table c1 (

    -> name  varchar(30),

    -> age int(20));

 

6.查询表:

(1)查询表结构;

mysql> desc c1;

 

 

(2)查看一个库里面有哪些表;

mysql> show tables;

 

(3)查看创建表的字段信息;

mysql> show create table c1;

+-------+--------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                             |

+-------+--------------------------------------------------------------------------------------------------------------------------+

| c1    | CREATE TABLE `c1` (

  `name` varchar(30) DEFAULT NULL,

  `age` int(20) DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

+-------+--------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

 

7. 添加字段:

mysql> alter table c1 add ids int(20) first;

 

修改一列类型(并设置自增id):

mysql> alter table c1 modify age int(20) primary key auto_increment;

 

更改字段名:

mysql> alter table c1 change name names  varchar(30);

 

删除字段的一个列:

mysql> alter table c1 drop age;

 

8. 查看数据库但时间

mysql>  select now();

+---------------------+

| now()               |

+---------------------+

| 2017-09-11 23:04:04 |

+---------------------+

 

 

 

9.修改表数据:

(1)insert

语法:insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......);

例子:INSERT employee (name,gender,birthday,salary,department) VALUES("alex",1,"1985-12-12",8000,"保洁部"),("egon",1,"1987-08-08",5000,"保安部"),("yuan",1,"1990-06-06",20000,"教学部");

 

(2)update

语法:update tab_name set field1=value1,field2=value2,......[where 语句]

例子:update employee_new set birthday="1989-10-24" WHERE id=1;

 

 

10.删除表数据:

方式1:

delete from tab_name [where ....]

 

方式2:

truncate table emp_new;

            /*   

            如果不跟where语句则删除整张表中的数据

            delete只能用来删除一行记录

            delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop

            TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在

            事务中恢复。

            */

 

 

11.查询优先级& 查询使用的方法:

WHERE 条件

GROUP BY field

HAVING 筛选

ORDER BY field

LIMIT 限制条数

 

 

 

12.多种查询操作

truncate table emp_new;

            /*   

            如果不跟where语句则删除整张表中的数据

            delete只能用来删除一行记录

            delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop

            TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在

            事务中恢复。

            */

 

 

(1)       order:排序

语法:select *|field1,field2... from tab_name order by field [Asc|Desc]

例子:

-- 按年龄从高到低进行排序

SELECT * FROM emp ORDER BY age DESC ;

 

-- 按工资从低到高进行排序

SELECT * FROM emp ORDER BY salary;

 

 

(2)       group by:分组查询

-- 语法:

SELECT column_name, function(column_name)

        FROM table_name

        WHERE column_name operator value

        GROUP BY column_name;

 

 

 

 

(3)       limit记录条数限制

SELECT * from ExamResult limit 1;

SELECT * from ExamResult limit 2,5;        --  跳过前两条显示接下来的五条纪录

SELECT * from ExamResult limit 2,2;

 

 

 

 

13.多表查询

(1)创建表:(此创建表只是为了讲解语法查询创造的环境)

CREATE TABLE emp(

    id INT PRIMARY KEY AUTO_INCREMENT,

    name VARCHAR(20),

    salary DOUBLE(7,2),

    dep_id INT

);

 
INSERT INTO emp (name,salary,dep_id) VALUES ("张三",8000,2),

                                            ("李四",12000,1),

                                            ("王五",5000,2),

                                            ("赵六",8000,3),

                                            ("猪七",9000,1),

                                            ("周八",7000,4),

                                            ("蔡九",7000,2);

 
CREATE TABLE dep(

      id INT PRIMARY KEY AUTO_INCREMENT,

      name VARCHAR(20)

);


INSERT INTO dep (name) VALUES ("教学部"),

                              ("销售部"),

                              ("人事部");

 

 

(2)查询表:

mysql> select * from emp;

+----+------+--------+--------+

| id | name | salary | dep_id |

+----+------+--------+--------+

|  1 | 张三 |   8000 |      2 |

|  2 | 李四 |  12000 |      1 |

|  3 | 王五 |   5000 |      2 |

|  4 | 赵六 |   8000 |      3 |

|  5 | 猪七 |   9000 |      1 |

|  6 | 周八 |   7000 |      4 |

|  7 | 蔡九 |   7000 |      2 |

|  8 | 张三 |   8000 |      2 |

|  9 | 李四 |  12000 |      1 |

| 10 | 王五 |   5000 |      2 |

| 11 | 赵六 |   8000 |      3 |

| 12 | 猪七 |   9000 |      1 |

| 13 | 周八 |   7000 |      4 |

| 14 | 蔡九 |   7000 |      2 |

+----+------+--------+--------+

 

mysql> select * from dep;

+----+--------+

| id | name   |

+----+--------+

|  1 | 教学部 |

|  2 | 销售部 |

|  3 | 人事部 |

|  4 | 教学部 |

|  5 | 销售部 |

|  6 | 人事部 |

+----+--------+

 

 

 

内连接

 

查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。

1.SELECT * FROM emp,dep WHERE emp.dep_id=dep.id;

或者

  1. SELECT * FROM emp INNER JOIN dep ON emp.dep_id=dep.id;

查询结果:

mysql> SELECT * FROM emp INNER JOIN dep ON emp.dep_id=dep.id;

+----+--------+----------+--------+----+-----------+

| id | name   | salary   | dep_id | id | name      |

+----+--------+----------+--------+----+-----------+

|  1 | 张三   |  8000.00 |      2 |  2 | 销售部     |

|  2 | 李四   | 12000.00 |      1 |  1 | 教学部     |

|  3 | 王五   |  5000.00 |      2 |  2 | 销售部     |

|  4 | 赵六   |  8000.00 |      3 |  3 | 人事部     |

|  5 | 猪七   |  9000.00 |      1 |  1 | 教学部     |

|  7 | 蔡九   |  7000.00 |      2 |  2 | 销售部     |

+----+--------+----------+--------+----+-----------+

rows in set (0.00 sec)           

 

-- 查询李四所在的部门名称

SELECT emp.name,dep.name FROM  emp INNER JOIN dep ON emp.dep_id=dep.id WHERE emp.name="李四";

 

-- 查询销售部所有员工姓名以及部门名称

SELECT name FROM  emp WHERE dep_id in (SELECT id FROM dep WHERE name="销售部");

SELECT emp.name,dep.name FROM  emp INNER JOIN dep ON emp.dep_id=dep.id WHERE dep.name="销售部";

 

外连接

(1)       左外连接:

左外连接:在内连接的基础上增加左边有右边没有的结果

SELECT * FROM emp LEFT JOIN dep ON dep.id=emp.dep_id;

(2)       右外连接:

SELECT * FROM emp RIGHT JOIN dep ON dep.id=emp.dep_id;

 

14.      完整性约束

概念:完整性约束是对字段进行限制,从而符合该字段达到我们期望的效果比如字段含有默认值,不能是NULL等 。直观点说:如果插入的数据不满足限制要求,数据库管理系统就拒绝执行操作。

1.       唯一性约束:

唯一约束可以有多个但索引列的值必须唯一,索引列的值允许有空值。

如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE。

 

例子代码:

CREATE TABLE t5(

  id   INT AUTO_INCREMENT,

  name VARCHAR(20) DEFAULT NULL,

  PRIMARY KEY (id),

  UNIQUE KEY UK_t5_name (name)

);

 

-- 建表后添加约束:

alter table t5 add constraint UK_t5_name unique (name);

 

-- 如果不需要唯一约束,则可以这样删除

ALTER TABLE t5 DROP INDEX UK_t5_name;

 

 

 

2. 添加约束和删除约束

-- 创建唯一约束:

create unique index UK_t5_name on t5 (name);

 

-- 建表后添加约束:

alter table t5 add constraint UK_t5_name unique (name);

 

-- 如果不需要唯一约束,则可以这样删除

ALTER TABLE t5 DROP INDEX UK_t5_name;

 

 1.       自增约束

MySQL 每张表只能有1个自动增长字段,这个自动增长字段通常作为主键,也可以用作非主键使用,但是请注意将自动增长字段当做非主键使用时必须必须为其添加唯一索引,否则系统将会报错。

例子:

mysql> CREATE TABLE t4(

    ->   id INT NOT NULL,

    ->   name VARCHAR(20),

    ->   age INT UNIQUE AUTO_INCREMENT

    -> );

Query OK, 0 rows affected (0.13 sec)

 

 2.       主键约束

主键是用于唯一标识一条记录的约束,如同身份证。

主键有两个约束:非空且唯一!

代码例子:

CREATE TABLE t1(

  id INT PRIMARY KEY AUTO_INCREMENT,

  name VARCHAR(20)

);

-- 方式2

CREATE TABLE t2(

  id INT NOT NULL,

  name VARCHAR(20)

);

注意:

1、一张表中最多只能有一个主键

 

2、表中如果没有设置主键,默认设置NOT NULL的字段为主键;此外,表中如果有多个NOT NULL的字段,则按顺序将第一个设置NOT NULL的字段设为主键。

结论:主键一定是非空且唯一,但非空且唯一的字段不一定是主键。

 

3、主键类型不一定必须是整型

 

  1. 3.       添加主键和删除主键

例子代码:

CREATE TABLE test(num INT PRIMARY KEY AUTO_INCREMENT);<br>

 -- 思考,如何删除主键?

    ALTER TABLE test modify id int;   -- auto_increment没了,但这样写主键依然存在,所以还要加上下面这句

ALTER TABLE test drop primary key;-- 仅仅用这句也无法直接删除主键

 

  1. 4.       复合主键

所谓的复合主键 就是指你表的主键含有一个以上的字段。

如果一列不能唯一区分一个表里的记录时,可以考虑多个列组合起来达到区分表记录的唯一性,形式

例子代码:

创建时:

create table sc (

    studentid int,

    courseid int,

    score int,

primary key (studentno,courseid)

); 

 


 

修改时:

alter table tb_name add primary key (字段1,字段2,字段3);

 

posted @ 2017-09-13 15:26  MR_dy  阅读(260)  评论(0)    收藏  举报