C#语言和数据库基础

 

 

                       

 

第一章 第一个C#程序

 

Vs2012密钥

RBCXF-CVBGR-382MK-DFHJ4-C69G8

01..net和C#的区别

大概在2000年,微软推出了一种革命性的产品--.NET(战略)

目标:任何人,在任何地方,使用任何终端设备,都可以访问微软提供的服务。

.net Framework:要想让我们自己写的C#应用可以运行在Good Friend的Computer上,必须有.net Framework

IDE(Itergrated Developer Environment)集成开发环境

 

Linux:装X

Window:傻X

解析:,net是一种平台,这种平台上可以跑多种语言,例如,vb,j#,C#

c#只是一种语言

02.解决方案和项目的关系

解析:一个解决方案下可以有多个项目。

03.Main方法四种形式,返回值只能是void或者int

Static void Main(){}

Static void Main(string[] args){}

Static int Main(){}

Static int Main(string[] args){}

04.什么是常量

  变量:可以变化的量。

Int num=5;

Num=7;

  常量;一旦定义,其值不能再后续代码中再次修改。

解析:PI

Int num=5;

05.海量代码折叠

快捷键是Ctrl+K+S:#region

05.C#中类,对象和方法

 什么是类?

解析:具有相同属性和行为的一系列事物的统称。

Car

Student

Teacher

Person

什么是对象?

解析:对象是能在现实生活中找到的某个能区别于其他事物的一个独特个体。

张靓颖家的红色的小汽车

 

在清华大学大一音乐系的小王。

在哈弗大学教金融学刘老师。

在北大青鸟五道口校区四机房上课的“小蔡”

 

类和对象的关系

解析:类是对象的抽象(模板),对象是类的实例

 

 

06.Bank项目

 

光大银行

 

开户功能

存款

取款

转账

查询余额

修改密码

 

作业;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第2章 c#语法快速热身

  01.预习检查

   1.c#与java的switch语句用法有什么不同?

     01.java中switch后的表达式取值只能为(int/char/常量),

     但是c#中取值可以是(int/char/string)

     02.java中case后如果有语句,可以没有break语句,但是在c#中不行

     case:

       syso();

 

     case:

      cw();

      break;

   2.java中如何定义数组?

      int[] nums=new int[]{1,2,3};

  02.本章目标

     1.掌握C#中的条件语句

     2.掌握c#中的循环语句

     3.掌握C#中数组用法

     4.掌握冒泡排序算法并且能够编码实现

  03.c#中if条件结构

      C#与java中的条件判断语句对比

      条件判断语句       java        c#

      if               if(){...}二者完全相同

      if...else...     二者完全相同

   注意:java和c#中switch用法有以下两点不同:

      01.java中switch后的表达式取值只能为(int/char),

     但是c#中取值可以是(int/char/string)

     02.java中case后可以没有break语句,但是在c#则不行

     多个可以case 可以共用一个break语句

    

  04.c#中switch小结

        条件判断的表达式类型:整型、字符型或字符串

        break语句的要求:

          01,每个case都要有break

          02,default也要有break

          03,特殊情况:case中没有其他语句时,不需要break语句

                case "星期一":

                case "星期二":

                break;

 

  05.c#中的一维数组

      为什么需要数组?

         解析;我们可以将类型相同的多个数据放到一个箱子中,便于后续的维护。

         考题:

         //在C#中和java中如下语句都可以定义一个长度为3的int类型数组

         方式一:

         int[] arr=new int[]{1,2,3};

         方式二:

          int[] arr;

         arr=new int[]{1,2,3};

         //int[] arr=new int[3]{1,2,3;//C#中正确,java中不可以

        

 

该规则在C#中同样适用。

foreach局限性:当需要改变数组中值的时候会报错

 

      01.C#中数组定义语法:

      数据类型[] 数组名;

      string[] arr1;

      02.如何设置数组大小?

      使用new设置大小:创建长度为5的整型数组

      int[] array=new int[5];

      03.数组初始化:

      int[ ] arr = new int[5]{0,1,2,3,4};

      int[ ] arr = new int[ ]{0,1,2,3,4};   // 省略长度

      int[ ] arr = {0,1,2,3,4};                  // 省略new

int [] ds=new int[]{1,2,3}

int [] ds={1,2,3}

      [5]——方括号中的数字决定数组的长度

      {0,1,2,3,4}——大括号中的元素个数决定数组的长度

      04.如何获取数组的长度(数组中元素的个数)

       答:数组名.Length

      05.如何循环输出数组中元素?

      // 循环输出数组元素

        int[ ] array = new int[5] { 0, 1 ,2, 3, 4};  // 声明并初始化一维数组

              for (int i = 0; i < array.Length;i++ )       // 输出数组中的所有元素

              {

                   Console.WriteLine(array[i]);

              }

        06.使用foreach循环遍历数组元素

          foreach循环一般用于遍历整个集合或数组

     语法:foreach (元素类型 变量名 in 集合或者数组名)

                            {

                                  // 语句

                            }

      07.continue和break语句的使用

       continue:结束本次循环,继续下一次循环

       break:结束当前循环

       08.二重循环复习

       int i, j;            // 循环变量

 

    // 外层循环控制打印的行数

       for (i = 1; i <= 5; i++)

       {

               // 内层循环控制每行打印数字的个数

               for (j = 1; j <= i; j++)

               {

                      Console.Write(j);

               }

               Console.WriteLine();

       }

  06.冒泡排序

       规则:每次比较相邻两数,小的交换到前面,每轮节航速后最大的数交换到最后

       用二重循环实现冒泡排序

          例如:5(n)个数字存放在一维数组中,如何进行排序

          分析:外层循环控制比较多少轮,循环变量i

                    内层循环控制每轮比较多少次,循环变量j

                    观察规律,分析i和j的关系,最终得出结论

                    i=n-1,j=n-1-i

                    代码框架如下:

                    for(i=0;i<n-1;i++)

                    {

                         for(j=0;j<n-1-i;j++)

                         {

                            //比较j和j+1位置的元素

                            //如果前大后小就交换

                         }

                    }

                                   冒泡排序速记口诀(升序):

                                      N个数字来排队

                                      两两相比小靠前

                                      外层循环N-1

                                      内层循环N-1-i

 

艰难的抉择:

卡莉·菲奥丽娜  hp的CEO

 Hp成功的合并了康柏

 HP 和康柏

 第三章  使用属性升级MyBank

第3章 使用属性升级MyBank系统

Bank系统

在Bank类中定义一个Card类型数组,存储三张卡的信息,然后书写了一个

Initial方法来初始化第一张卡。

Foreach(Card item in cards)

{

    Item本身不能修改,但是可以修改item对象的各个属性值,对其进行重新赋值

}

取款

转账

查询余额

修改密码

1.访问修饰符

public:在任何位置都可以访问

private:只能在当前类中访问

2.属性

属性作用:修改和获取私有字段的值(间接对私有字段赋值,起到保护私有字段的作用)

属性语法

public class Person

{

  private int age;

  public int Age

  {

     //get

     get

     {

       return age;

     }

     //set

     set

     {

       age=value;

     }

  }

}

4.面向对象三大特性:

01.封装

  //可以将私有字段封装成属性,看成是一种封装(属性封装了字段)

       //可以将一个方法写到类中这种方式成为封装(类封装了方法)

02.继承

03.多态

 

5.01.对方法的返回值不敏感,怎么定义方法的返回值。

   02.返回值过程中出现的问题

   第三章  使用属性升级MyBank

    一、预习检查

    01.创建属性通过哪两个访问器?

    02,本章介绍了哪些传递参数的方式?

   

    二、本章任务

     01.使用属性封装年龄字段

     02.使用属性封装身份证字段

     03.使用属性封装MyBank字段

     04.实现计算一组数的奇偶个数

    

     三、本章目标

     01.掌握C#中的访问修饰符

     02.掌握c#中的属性

     03,掌握c#中的值传递和引用传递

    

     四、C#中的访问修饰符

         当类的某些敏感字段只希望类内部使用时,可以使用private访问修饰符

         一个类的字段一旦定义成private,其他类访问不到

         c#中的访问修饰符:

             public    不受任何限制,访问级别最高

             private   只有类的内部可以使用,访问级别最低

    五、this关键字的作用

         c#中this关键字有什么用?

         this代表的是当前类的实例,通过this可以访问当前类的对象的所有

         成员变量和方法

    六、数据安全

    static void Main(string[] args)

       {

             Student stu = new Student();

             stu._age = -2;//非法数据

             stu. _idCard = "123456"; //身份证号不能被修改

       }

       有时候将类中的字段公开是不安全的,但是如果设为私有成员:

       无法正常赋值,无法获得数据。

       使用方法解决数据安全问题

       1,使用者不可直接操作_age

       2,用方法返回_age供读取

       3,用方法限制使用者的非法赋值

       private int _age;

       public int 方法1()

       {

           return this._age;

       }

       public void 方法2(int 参数)

       {

         if(参数<0||参数>100)

         {

            this._age=18;

         }

         else

         {

           this._age=参数;

         }

       }

       这种写法太麻烦,于是诞生了属性

       class Student

{

        private string name;

        public string Name

        {

            get { return name; }

            set { name = value; }

        }       

}

       value相当于方法的参数,字段和属性的数据类型必须一致。

       get用于获取相应字段的值,

       set用于设置字段的值。

       get和set都存在,读写属性。只有get时,只读属性。只有set时,只写属性。

       属性的作用:控制私有字段的可访问性,保护内部数据的安全。

       建议:类内部敏感字段使用属性来控制访问

       快速书写属性的方法:用ctrl+R+E

       类的成员:字段、属性和方法

       属性是不能用来存储对数据的,真正的数据是存储在字段中的。

    七、参数的传递方式

    参数传递有两种方式:值传递和引用类型传递

    注意:值传递不能保留参数的修改,要按引用传递,使用ref

    通过引用传递参数:

      1.定义和调用时,在参数前都要使用ref

      2.在方法调用前:作为参数的变量要声明并赋值

      3.使用场景:希望保留参数的更改。

      

       课堂内容:

       01.如果想让一个字段只能在当前类中方式问,那么可以将访问修饰符设置成private。

       02.如果类中的一个字段没有访问修饰符,那么默认访问修饰符是private,但是不建议省略。

       03.什么是封装?

       解析:我们可以将私有字段封装成公有的属性看成是封装的一种体现。

          封装的另一种体现是将多个字段封装到一个类中。

        04.面向对象的三大特性?

        解析:封装,继承和多态

        05.属性的本质也是方法。这也就是为什么我在第一节通过GetName()和SetName()来引出属性。

        白话理解:其实微软在你进行属性书写的时候,自动帮助我们构建了一个getName()方法和换一个

        setName()方法。

        06.真正存储数据的是字段 ,属性是不能保存数据的。

3.值类型传递和引用类型传递

          值类型传递(不加ref):

             01.传递的参数是值类型:不用保留变量值的更改

                02.传递的参数是引用类型:会保留变量值的更改

          引用类型传递(加ref)

             01.传递的参数是值类型:会保留变量值的更改

                02.传递的参数是引用类型:会保留变量值更改

 

第4章 深入C#的String类

01.java中常用字符串处理方法

  substring(3,5):

  "我爱你中国,我爱你天安门!"

  length()

  indexof("中");

  lastIndexOf()

  split()

  concat()

  equals()

  trim()

02.C# 中的类型转换有哪几种方式?

解析:

  int.Parse("字符串")

  Convert.ToInt32("任意类型")

  (int)1.23 :类型相容

03.字符串的常用方法

IndexOf():查找某个字符在字符串中的位置

Substring():从字符串中截取子字符串

解析:第二个参数代表从第一个参数索引位置往后,截取几个长度的字符

"明天是个好天气"

words.Substring(4,3)

ToLower():将字符串转换成小写形式

Equals() :比较两个字符串的值是否相等

Join():连接字符串

Split():分割字符串

Trim():去掉字符串两边的空格

Compare(string strA,string strB):比较字符串strA和strB的字典顺序,方法返回值是int类型,

如果返回的是0,两个字符串相等。

如果返回的是正数,第一个字符串大。

负数,第二个字符串大。

04.什么MSDN?

解析:微软推出的官方最权威的一个.NET平台的技术的一个帮助文档。

什么Java API

就是sun公司推出的学习java技术最权威的帮助文档。

05.什么是URL?

解析:URL(Uniform Resoure Locator:统一资源定位器)

相当于老爷爷口中的网址。

三部分组成:http://wwww.baidu.com

  01.协议类型:http协议 ftp  https:加密协议

  02.域名(是IP地址经过映射后的字符串,为了便于网站用户更方便的访问该网站的资源)

  03.资源

06.Format()方法

  {索引,对齐:格式}
07.类型转换

   无论隐式类型,还是强制类型转换,前提是类型相容,也就是要是数字都是数字。

   double num=1;//隐式类型转换

   int number=(int)1.23;//强制类型转换

   01.Parse:应用场景

   只有将字符串转成数字这一种情况下可以使用XXX.Parse(字符串)

   02.Convert.ToXXX(任意类型)

   以后大家在编程时,本人强烈建议大家使用Convert进行类型转换

  

  

 

 

第5章 库存管理

 效果图:

 

 

第6章 程序数据的集散地:数据库

 01.讲解SQLServer Management Studio ()

 02.数据库(DataBase) 为了保证数据的持久化,推出了数据库

 03.DBS(范围广:操作员:数据库管理系统,硬件平台)  DBMS

 04.系统数据库

Master

Tempdb

Model

Msdb:调度!任务计划

Resource:

05.登陆数据两种验证方式

   Windows:操作系统登陆后,就可以直接登陆数据库软件

   SQL Server

     权限最高的用户:sa  机房默认密码:

06.开启服务的方案

   

01.保存在内存中的数据有什么缺点?

解析:比如拿咱们书写的Bank系统为例,如果您通过开户功能

在数组中新增了一张银行卡,那么下次进入系统的时候, 数据不会

保留。

02.数据库可以看成是一个永久保存数据的仓库。

 

预习检查

1.数据完整性指的是什么?

解析:数据的准确性就是数据的完整性

SQL Server有哪两种身份验证方式?

解析:Windows身份验证和SQL Server身份验证

创建数据库需要指定哪两种文件?

解析:数据文件(.mdf) 和 日志文件(.ldf)

03.为什么要使用数据库?

解析:可以存储大量数据

      可以保证数据的一致性和完整性

      可以满足应用的共享和安全要求

      方便和智能化的分析,产生新的有用信息

02.行:记录

   列:字段

03.数据冗余:数据的重复性

04.数据库完整性:准确性

05.注意点:

    当我们在连接(登陆)数据库的时候,一定要保证

数据库服务开启:Sql Server(MSSQLServer)

04.登陆SQL Server两种方式:

 Windows身份验证

 SQL Server身份验证:sa   机房密码默认为空

 

核心内容

01.什么是服务器?

解析:提供服务的一个容器。一台计算机上安装了某个服务,例如数据库这款软件,那么这台

电脑就称之为数据库服务器。

02.常见的数据库

oracle

DB2

sql server

mysql

sqllite

visual foxpro

access

02.增删查改

发表评论:质量很好,就是发货速度有点慢

购物车:删除

浏览商品 :查询

修改密码:改

上网自己下(我就不告诉你)

05.DBMS和DBS的区别

DBMS:DataBase ManageMent System:数据库管理系统

DBS:DataBase System 数据库系统

关系:DBS包含DBMS

因为数据库系统组成部分:

数据库的操作者

数据库软件  (数据库管理系统)

承载该软件的电脑

06.数据库服务启动方法

方法一:对“我的电脑”→右键“服务”→SQL Server(MSSQLServer)

方法二:打开开始菜单→运行→services.msc回车 就可以打开服务窗口,后续操作同上

方法三:按住键盘上的“Win+R”打开命令提示符窗口,输入→services.msc回车 就可以打开服务窗口,后续操作同上

07.系统数据库

Resource数据库:作用:用户新建 了一个数据库School,

那么有些信息会自动从Resource中映射到School中

master数据库:保存所有数据库的信息,一旦损坏,整个数据库软件都无法运行。

model:模板数据库

tempdb:临时数据库,保存临时数据

msdb:代理,业务调度,警报作业等。

DBA:OK的

初级DBA

自动备份

10年

美工

软件开发

 

1.如何将硬盘的数据库文件拷贝到U盘?

解析:通过关闭服务的方式

2.如何将U盘中的数据库文件还原成电脑上数据库软件中的一个数据库存在?

解析:先将U盘上的数据文件拷贝到电脑的非系统盘,使用附加工具,找到对应位置的数据库文件,进行附加操作

3.停止服务备份数据文件的缺陷?

解析:热备份!

4.童鞋们:收缩数据库干什么呀?

解析:节省硬盘空间

三种开启服务方式:(晓鹏)

08.分离和附(方言)

09.备份和还原 (龙龙)

10.收缩数据库  

11.删除数据库

我站在这里用血的教训告诉大家,当你需要删除数据库的时候,

一定要备份,严重推荐,特别非常十分及其需要注意:在自己心里先问3遍,你确定

这个数据要删除吗?让你同桌看一下,是否代码写的正确,是否需要删除?

前途:

备份:::::::::::::::

作业:1.bank系统终结版

      2.手写三遍:转账

      3.第6章和第7章预习

      4.blogs两篇(MyBank  商品管理)

      5.Java  Logic

第7章 数据表

01.四种完整性约束

   001.实体完整性:针对数据行设置的完整性

   002.域完整性:针对数据列设置的完整性。

   003.引用完整性:外键约束

   004.自定义完整性:为了满足我们的业务需求,我们自己量身定制的完整性约束,一般

   通过存储过程。

02.SQL Server中数据类型

 int:存储整型数字

 numeric(18, 2):存储小数

 decimal(18, 2):存储小数

 nvarchar():存储文字

  以后严重建议大家只要是保存字符串就用nvarchar()类型,n代表的unicode编码,该编码是国际通用编码,可以避免乱码的出现。var代表长度可变。表中该列真正存储的内容就占它本身的空间,而不会占用该列通过(20)设置的长度所占用的空间。

 varchar():存储可变长度的文本

 char(4):存储固定长度的文本

 text();SQL Sever2000的使用使用的大文本类型,现在2005.2008  2012已经无情的毫无怜悯之心的抛弃了它,

 nvarchar(Max)

 DateTime:保存日期和时间

 照片:image(二进制存储)

--以后我们存储姓名:nvarchar(20)

--存储年龄:int

--存储性别:bit

--存储一篇文章:nvarchar(max)

尽量不要使用ntext或者是text,因为text和ntext读取效率非常低。

 

作业:1.第六章和第七章数据类型形成blog文章

      2.创建MySchool,并且形成Student,Result,Grade,Subject,数据类型,以及测试数据。

      3.第六章选择和简答题

03.为表建立约束

  01.主键约束

  一张表一定要设置主键,否则别人会骂死你。

  如果一张表不设置主键,到后续学习框架的时候,框架就欺负你,给你报错。

  不能给自增列手动给值,这个值是由系统自动给的。

  02.非空约束

  03.默认值约束

  04.check约束

  05.外键约束

  注意:外键约束只能设置在外键表中

 

  年级名称和学生名称同时获取

  年级名称    学员姓名     学生成绩

    S1290       不知道        100

04.常见问题:

 01.外键把控的不好

 02.在SQL Server中,字符串和日期类型数据要加单引号,数值类型不用

 03.每张表中必须都有一个主键,没有主键的表是不行的。

 04.主键列不允许为空

 05.不推荐使用复合主键,主键列选择依据:尽量简单。

 06.如果找不到有意义的列作为表的主键,那么就加多一列ID作为

该表的主键列。

05.标识列:

 为了唯一确定一行数据在该表中唯一而设定的一列。

--应用前提:

  01.必须是int(smallint)类型

  02.在标识规范处设置:标识种子,标识增量

(种子值:)标识种子:从哪个数据开始增长

(步长:)标识增量:每次增长几个数

 

06.外键:

在一张表表A中某列是主键,但是在另外一张表表B中该列不是主键。那么

表A称为主键表,表B称为外键表。

 

--只能在外键表中设置外键

%:代表任意长度的任意字符:特别声明:包含0个

 

07.表内容图

 

查询机制

 

外键

 

那些年,第七章我们讲了什么?

解析:1主键:唯一的,一个

      2.约束:

        非空约束:

        主键约束

        默认值约束

        Check约束

        外键约束

      3.实体完整性约束(行数据)

        引用完整性约束(外键!)

      4.自定义完整性约束(规则,存储过程,触发器)

      5.域完整性约束(列  ,check约束)

      6. 设置外键:

      7.标识列

        特征:自增,有种子和增量,前提(必须是int类型)

     8.建立数据库关系图,更直观的看出表之间的关系!

     9.数据类型

         文本:char   nchar

               Varchar   nvarchar()

               Text   nvarchar(max)

     10.check

          男或者女 or

     11.建立主键

         多列共同确定一个主键,复合主键。

         主键不一定是标识列。

     12.通配符

      _:有且只有一个字符

      %任意个任意字符

       Like ‘’

     13.设置了标识列和约束,不符合约束,可能产生标识列断裂的情况!

     14.数据类型中的日期和时间  DateTime

     15.删除数据库表,要想删除有外键关系的表,必须先删除子表(外键表)

     16.货币数据类型money decimal(18,0)

     17.int bit true false

     18.字符编码unicode

     19.二进制数据 image

第8章 用SQL语句操作数据

DML:

DDL:

DQL:

DCL

 

01.SQL语句书写规范

  1,.在SQL Sever中,SQL语句不区分大小写(数据库名,表名,列名,关键字) ,SQL编译器都识别

  2,对表进行操作的时候,一定要使先用use关键字切换到对应的数据库

  3.自增列不可以赋值

02.新增数据注意事项

  01.如果新增全部列,那么表名后可以不跟列名,但是要提供所有列的值,除非当前

  列有默认值,那么也要给出default关键字。

  02.如果只想给一张表中添加部分列,那么在表名后要跟上列名,并且需要保证除了你给出

  的列的值之外,其他列都允许为空或者有默认值。

  insert into goodPerson(stuName,stuAge) values('张晓玲',20)

03. 一次性向一张表中插入多条数据的解决方案

方案一:insert into 目标表

 select  * from 原表

 注意事项:如果目标中有自增列,那么不能使用*号。

 

 

 方案二:select *  into 目标表(不存在)

  from 原表

  该方式只保留了数据和子自增列,但是主键等约束就都没有了。

 

  方案三:insert into 目标表(存在)

  select '高一二班'

  union

  select '高一五班'

04.几个注意点

 1.以后大家见到update语句,一定要跟where条件,打死也要跟。

 2.在SQL Server中null代表不知道,所以如果where后的限定条件不能用=和null做对比,必须使用is null

05.delete和truncate区别?

   解析:01.delete 后可以跟where条件,而truncate不行

         02.delete删除数据的时候会记录日志,而truncate不会

               03.delete删除表中所有数据库,id编号不会从1开始,而truncate会。

 

同志们,有些童鞋问老湿,为什么呀???

专业人士解析:因为truncate又称为“截断表”。编号从1开始。

 

 

 

 --01.如果要进行数据表中数据的查询,那么必须先定位到该表所在的数据库

use Myschool  --切换数据库

select StuId, StuName, StuAge, GradeId from Student

--我只想要年龄小于岁的学员信息

select * from Student  where StuAge<=22

--新增数据

insert into GoodPerson values

('微冷的雨',50,'中国某地区','未知','希望大家努力学习,将来薪资K')

select * from goodperson

 

insert into goodperson(stuName,stuAge,stuAddress,stuLike,stuWishes) values('张靓颖',20,default,'大家微笑的脸庞','开心就好')

 

insert into goodPerson(stuName,stuAge) values('张晓玲',20)

delete from goodperson

where StuId=31

 

select * from goodPerson2

 

 

-- 一次性向一张表中写入多条数据方案一

insert into goodPerson2

select  StuName, stuAge, stuAddress, stuLike, stuWishes from goodPerson

delete from goodperson2

 

--方案二

select * into goodpersonbak

from goodperson

 

--方案三:

select * from grade

 

insert into grade

  select '高一二班'

  union

  select '高一五班'

 

 

--更新高一三班位"无敌S1290"

update grade set gradename='无敌S1290'

where gradename='高一三班'

--将"王龙彪" 改成"李小龙"

--将年龄为岁的学员年龄改成

update goodpersonbak set stuname='李小龙',stuage=25

where stuname='微冷的雨'

select * from goodpersonbak

update goodpersonbak set stuname='微冷的鳄鱼',stuage=10000

where stuid=1007

 

select * from goodperson

insert into goodperson(stuname,stuage,stulike)

values('李小龙',20,'吃faN')

 

 

select * from goodperson

where stuwishes is null

 

update grade set gradename='S1'

select * from goodpersonbak

 

下次:

前6章可以

第七章第八章课后题

第九章预习

第9章 数据查询基础

01.关于*会引起全表扫描问题

use MessageBoard

select * from Message --内存中

--*号会引起全表扫描,所以在真正的开发中,不推荐使用。最好使用

--确切的列名。

02.查找留言人是“罗雨萌”的所有留言信息

select *

from Message

where msgAuthor='罗雨萌'

03常见问题:

--01.SQL语句不区分大小写

--02.字符串和日期类型都需要单引号

--03.起表名的时候,千万不要起得太好,例如不要使用User作为表名。

-- 如果表名和关键字重复了,我们可以通过[]取消转义。

select * from [User]

--04.千万注意新建查询窗口中的中文空格。

select  * from Message

04.别名

--别名方案一

select msgAuthor as 留言人,msgContent as 留言内容

from Message

 

select msgAuthor  留言人,msgContent  留言内容

from Message

 

--别名方案二

select 留言人=msgAuthor,留言内容=msgContent

from Message

 

05.将多列合并成一列显示

select msgAuthor+'____'+msgContent as 留言人说的留言是一种留言留言

from Message

06.常量列

select *,'汉族'as 民族  from Message

07.常见事项说明

--通过Ctrl+R:可以显示和隐藏结果集窗口

--真正的安装顺序,先安装数据库,再装其他软件。

--换一个版本。,换安装包

--换系统

--来找我,我都解决不了,那么就是人品

08.关于top关键字

--限制只检索前几条数据

use MySchool

select top 3 * from student

where Gender='0'

 

--按主键

--获取Student表中的前20%的数据

--能大概推断表中总共的数据数

select top 20 percent * from student

 

--脚本语言:不需要编译器进行编译,就可以直接解析执行的代码

--编译语言:

--从高版本向低版本附加,附加不上。

--比如说: SQL Server 2008

     --    SQL  Server  2005

09.Order by相关    

--*****************************5.Order by相关***********************************

select * from Student

--默认按主键升序排序

select * from student

order by Gender desc

 

--按照多列排序(先按年级,再按性别)

select * from student

order by GradeId asc,Gender desc

--查询北京的男同学

select * from student

where Address like '%北京%' and Gender='1'

 

--查询“李X龙”的信息

select * from student

where StudentName like '李_龙'

10.通配符:

--%:任意长度的任意字符,(包含0个)

--:_:任意的单个字符,只能是一个

--查询考试成绩前五名的分数

select top 5  StudentNo,SubjectId,Studentresult

from result

order by Studentresult desc

--学号科目编号和分数(只要前3个人的)

--01.order by

--02.where后多个条件通过and连接,order by才用逗号

--03.=(完全匹配)和like(模糊查询)

--*********************************************************************************

11.字符串函数

--******************************6.字符串函数***************************************

--函数名称:CharIndex('str1','str2',index)//位置从开始

--参数含义:

--第一个参数:要查询的字符串

--第二个参数:在哪个字符串中搜索

--第三个参数:从str2的第几个字母开始搜索

--注意点:如果在str2中没有找到str1,那么返回

--案例:

select charindex('好好学','S1是S2的基础,所以大家好好学',1)

 

SELECT CHARINDEX('JBNS','My Jbns Course') 

select charindex('微冷的雨','好人啊微冷的雨',4)

select charindex('妈妈说','我们要为国家争光,妈妈说,是人就要有理想',11)

--len():获取小括号中字符串的长度,空格也算一个字符长度

select len('明天咱们还上课,希望大家回去好好休息')

select len('大家都是好孩子                ')

--注意点:如果内容以多个空格结尾,那么结尾的多个空格,是不计算长度的

--例如:

select len('我们都是好孩子                                        ')

 

SELECT LEN('SQL Server课程')

select len('我是这个世界上最大的王,你信吗?')

 

--upper():将括号中出现的英文全部转换成大写

select upper('i can speak english.你能吗?')

select lower('I HAVE A DREAM')

 

select upper('i have a dream,俺有一个梦想')

 

--LTrim():清除括号中内容左边的空格(left:right)

select ltrim('                              生活不是林黛玉,      '

select rtrim('         生活不是林黛玉,      ')

 

--既想移除左边空格,也想移除右边空格

select rtrim(ltrim('         生活不是林黛玉,      '))

select ltrim(rtrim('   你还好吧!   '))

--思路灵活

select len(rtrim('今年奇怪了,北京没下雪,去去去    '))

 

--substring('字符串',截取的位置,截取的长度)

select substring('我是中国人,我爱自己伟大的祖国,真的',6,1)

--right():从字符串右边返回指定类型的字符

select left('大家今天好像都没有交日记本,我去',3)

select right('大家今天好像都没有交日记本,我去',2)

 

--replace('str1','要替换的字符','目标字符'):

select replace('周杰伦,残疾人,虽然手不残疾,但是X残疾','残疾','好')

 

--stuff('字符串',删除的起始位置,删除的长度,'插入的字符串')

select stuff('我爱你中国,我爱你故乡',4,2,'北京')

select stuff('我们都要有理想,为了理想我们熬夜,当然以牺牲身体为代价',6,2,'自信')

--****************************************************************************&

12.日期函数

--**********************************7.日期函数*************************************

--01.getdate():获取当前日期和时间

select getdate()

--1000ms是s

--02.dateadd(按年/月/日添加,增量,时间)

select dateadd(yy,100,'2014-8-6')

select dateadd(year,-20,getdate())

--03.datediff(按年/月/日求差,小时间,大时间)

 --高梓贺

 

 select datediff(year,'1998-01-01',getdate())

 

--04.datename:获取某个日期是星期几

select datename(dw,'2014-08-06')

--05.datepart(mm,日期):获取指定日期对应的年/月/日部分 

select datepart(yy,getdate())

--Year yy

--Month mm

--Day  dd

--push(推)  pull(拉)

--通过该方式也可以获取当天是周几

select datepart(dw,getdate())

 

--数学函数

--01.rand():产生一个到之间的随机数

select right(rand(),4)

Select rand()

 

--如果产生四位数(-9999)

--02.abs:取绝对值

select abs(-10)

select abs(10)

--非负数

--03.ceiling:天花板,你要看天花板,抬头,向上取整

select ceiling(1.999991)

--04.floor:向下取整

select floor(1.999999)

select ceiling(1.000000000000001)

select floor(2.999999999999999)

--04.power(5,2)求幂值

select power(4,4)

select 1*2/3+5-56+100-5/100

 

select power(2,3)

--05.round:将一个数字四舍五入到指定精度

select round(42.564,1)

--06.sign:如果括号中写的是一个正数,返回,如果是负数,返回-1

--如果是返回

select sign(20)

 

 

select sign(0)

--07.sqrt()开平方

select sqrt(9)

 

第10章 模糊查询和聚合函数

 

01.通配符使用

  001.%:任意多个任意字符(含0个)

  002._:任意的单个字符 (必须一个)

  003.[0-9]:只能出现中括号内指定范围的一个字符

  004.[^a-z]:不能出现任何字母,只能是字母之外的其他字符。

02.Between 80 and  100

做一个徘徊于牛A与牛C之间的人

    Between  and 等价于 >=和<=

         但是严重推荐使用between  and

 

03.in关键字的模糊查询

    select * from student

         where address in('地址1','地址2')

04.聚合函数的应用场景?

   解析:一般在做统计分析的时候需要使用聚合函数

   count:统计一张表中总共有多少条数据

   select SUM(StudentResult) as 总分 from Result

   select AVG(studentresult) as 平均分  from  Result

   select MAX(studentresult) as 最高分 from Result

   select min(studentresult) as 最高分 from Result

 

第11章 连接查询和分组查询

01.分组查询:用于统计时经常使用分组查询

--sum()--count()--max() min()--avg()

--01.查询每个年级的总人数

--一旦通过group by分组,那么我们只能获取组相关的信息,而不能获取组中成员的信息

--在select后只能跟聚合函数和group by后面的列,其他列不允许

select gradeid as 年级编号,COUNT(studentno) as 总人数

from student

group by gradeid

--多列分组

02.每个年级的男生总人数,,以及女生总人数

--年级编号  性别    总人数

select gradeid as  年级编号,gender as 性别,COUNT(studentno) as 总人数

from student

group by GradeId,Gender

order by GradeId,Gender

 

*03如何查询每门课程的平均分

select SubjectId as 课程编号,AVG(studentresult) as 平均分  --05.投影结果

from Result                         --01。定位到表

where SubjectId<3  --,            --02.分组前第一道过滤

group by SubjectId                  --03.分组

having COUNT(studentno)>3           --04.分组后第二道过滤

order by 课程编号 desc              --06.最后排序

 

04获取总人数超过3人的年级编号及人数

--年级编号  总人数

select gradeid as 年级编号,COUNT(studentno) as 总人数

from student

group by GradeId

having COUNT(studentno)>3

 --having是对分组后的数据进行第二次筛选或者过滤,也就是说没有group by就没having

--注意:where之后不能有聚合函数

05.上机练习1

 

--**********************上机练习1********************************************

--查询每个年级的总学时数,并按照升序排列

select gradeid as 年级编号,SUM(classhour) as 总学时数

from Subject

group by gradeid

order by 总学时数 asc

 

--查询每个参加考试的学员平均分

select studentno as 学号,AVG(studentresult) as 平均分

from Result

group by studentno

 

--查询每门课程的平均分,并按照降序排列

select subjectid as 课程编号,AVG(studentresult) as 平均分

from Result

group by SubjectId

order by 平均分 desc

 

--查询每个学生参加所有考试的总分,并按照降序排列

select studentno as 学号,SUM(studentresult) as 总分

from Result

group by StudentNo

order by 总分 desc

06.上机练习2

--**********************上机练习2********************************************

S1:java  html c#  winform sql server

--查询每年级学时数超过的课程数

select gradeid as 年级编号,COUNT(subjectid) as 课程总数

from Subject

where ClassHour>=50

group by GradeId

 

--查询每年级学生的平均年龄:

select gradeid as 年级,AVG(DATEDIFF(YY,birthday,getdate())) as 平均年龄

from student

group by GradeId

 

--查询每个年级包含北京的学生总数

select gradeid as 年级,COUNT(studentno) as 总人数

from student

where Address like '%北京%'

group by GradeId

 

--查询参加年级考试的学生中,平均分及格的学生记录,按照降序排列

select studentno as 学号,avg(StudentResult) as 平均分

from Result

group by StudentNo

having  avg(StudentResult)>60

order by 平均分 desc

 

--查询考试时间为2009-9-9课程的及格平均分

--课程编号   所有课程平均分

select subjectid  as 课程编号,AVG(studentresult) as 所有课程平均分

from Result

where ExamDate>='2009-9-9' and ExamDate<'2009-9-10'

group by subjectid

having AVG(StudentResult)>60

--统计至少有一次不及格的学生学号和次数。

select studentno as 学号,COUNT(studentresult) as 次数

from Result

where StudentResult<60

group by studentno

--如果语句中有group by关键字,那么select后只能跟group by后出现的列,或者是聚合函数

--max() min() count(),sum(),avg()

07.连接查询

--连接分三种:内连接,外连接,交叉连接

08.内联结

--A和B两张表,A和B必须有公共字段

--实现方式一:inner join on

--实现方式二:where

--输出每个学员的姓名和成绩

select studentname as 姓名,studentresult as 成绩,subjectname as 科目,Gradename  as 年级

from student,Result,Subject,Grade

where student.StudentNo=Result.StudentNo

and Result.SubjectId=Subject.SubjectId

and student.GradeId=Grade.GradeId

--等价的写法

select studentname as 姓名,studentresult as 成绩,subjectname as 科目

from Result inner join student

on student.StudentNo=Result.StudentNo

inner join Subject

on Result.SubjectId=Subject.SubjectId

--所有学生的成绩单,无论该学员是否参加考试

select studentname as 姓名,studentresult as 分数

from student left join Result

on student.StudentNo=Result.StudentNo

--02.打印出每个学员的姓名(student)及其年级名称(grade)

09.外联结

--外连接特点

--对于左外连接:左边的表叫主表,查询结果会显示左表和右表中公共字段相匹配的

--结果(内连接)外,还会将左表中在右表中找不到匹配项的记录用null值填充

--检索所有学员的成绩,如果某个学员没有参加考试,课程及成绩用NULL值代替

 

10.交叉联接(大学数据库原理:笛卡尔积)

--毕业证(学士学位) (硕士学位:研究生) (博士)  (博士后)35

--教授--8年--开发中交叉联接没有用武之地。

select StudentName,studentresult

from student,Result

--交叉联接的结果就是两张表记录数的乘积。

 

学生姓名,学生成绩,课程名称

select studentName,studentresult,subjectname

from student,result,subject

where student.studentNo=result.studentNo

and result.subjectid=subject.subjectid

and subjectname='走进Java编程世界'

 

--第二种方式

select studentName,studentresult,subjectname

from student inner join result

on student.studentNo=result.studentNo

inner join subject

on result.subjectid=subject.subjectid

where subjectname='走进Java编程世界'

10.上机练习3

/*

上机练习

*/

--01.查询学生姓名、所属年级名称及联系电话

select * from student

select * from grade

select studentname,gradename,phone

from student,grade

where student.gradeid=grade.gradeid

--02.查询年级编号为的科目名称、年级名称及学时。

select * from course

select * from grade

 

select cousename,gradename,classhour

from course,grade

where course.gradeid=grade.gradeid

and grade.gradeid=1

--03.查询参加科目编号为的考试的学生姓名、分数、考试日期。

select studentname,studentresult,examdate

from student,result

where student.studentno=result.studentno

and subjectid=1

--04.查询学号为S1101007的学生参加的考试科目名称、分数、考试日期。

select cousename,studentresult,examdate

from course,result

where course.courseid=result.subjectid

and studentno='23'

--05.

--查询参加考试的学生学号、所考科目名称、分数、考试日期.

select studentno,cousename,examdate

from result,course

where result.subjectid=course.courseid

11.上机练习4

/*上机练习

*/

--01.查询学生学号、姓名、考试科目名称及成绩。

select student.studentno,studentname,cousename,studentresult

from student,course,result

where student.studentno=result.studentno

and course.courseid=result.subjectid

 

--02.查询参加“C#语言和数据库”考试的学生姓名、成绩、考试日期。

select * from result

 

select studentname,studentresult,examdate

from student,result,course

where student.studentno=result.studentno

and course.courseid=result.subjectid

and course.cousename='C#语言和数据库'

12.上机练习5

/*上机练习*/

--01.查询所有科目的考试信息(某些科目可能还没有被考试过)

select * from course

select cousename,studentno,studentresult

from course

left join result

on course.courseid=result.subjectid

--02.查询没有被考过的科目信息。

select cousename,studentno,studentresult

from course

left join result

on course.courseid=result.subjectid

where studentno is null and studentresult is null

--03.所有年级对应的学生信息(需要考虑某些年级可能还没有学生就读)

select gradename,studentname,phone

from grade

left join student

on grade.gradeid=student.gradeid

 

/*课后题第二题*/

 

--查询指定卡的本月上机次数;

use netbar

select count(*) as 上机次数

from record

where cardid='0023_ABC'

and DATEPART(MONTH,BeginTime) = DATEPART(MONTH, GETDATE())

 

select * from Card

select * from computer

select * from record

--02.24小时之内上机的人员姓名列表:

select username

from card,record

where card.id=record.cardid

and record.BeginTime BETWEEN DATEADD(DAY,-1,GETDATE())  AND GETDATE()

--03.本周上机人员的姓名、总费用,并按姓名进行分组:

select username,sum(fee)

from card,record

where card.id=record.cardid

and DATEPART(week,BeginTime) = DATEPART(week,GETDATE())

group by username

 

--04.卡号第位和第位是“AB”的人员的消费情况:

SELECT C.UserName, SUM(R.Fee) FROM Card AS C

INNER JOIN Record AS R

ON C.ID = R.CardID

WHERE SUBSTRING(R.CardID,6,1) = 'A' AND SUBSTRING(R.CardID,7,1) = 'B'

GROUP BY C.UserName

 

13.内连接和外连接匹配原理图

  

 

 

 

第12章  高校信息系统数据库管理

--1.查询没有通过考试的人数(笔试或机试小于60分)--

select count(stuNo) as 未通过的人数 from stuMarks

  where labExam<60 or writtenExam<60

 

--2.查询学员成绩,显示学号,笔试成绩,机试成绩,平均分--

select stuNO as 学号,writtenExam as 笔试,labExam as 机试,

  (writtenExam+labExam)/2.0 as 平均分 from stuMarks

 

--3.排名次(按平均分从高到低排序),显示学号、平均分-- 

select stuNO as 学号,(writtenExam+labExam)/2.0 as 平均分

  from stuMarks order by 平均分 desc

 

--4.排名次(按平均分从高到低排序),显示姓名、学号、机试成绩和平均分-- 

select stuMarks.stuNo as 学号,stuName as 姓名,labExam as 机试成绩,writtenExam as 笔试成绩,(writtenExam+labExam)/2.0 as 平均分

  from stuMarks inner join stuInfo on stuMarks.stuNo=stuInfo.stuNo order by 平均分 desc

 

第13章  QQ数据库管理系统

 

 第14章  ADO.NET 

3W1H教学法:

What:XXX是什么

Why:为什么学***X

When:什么时候用XXX?

How:如何用?

 

00.ADO.NET两大组件?

解析:.NET FrameWork数据提供程序和数据集(DataSet)

01.NET FrameWork数据提供程序四大组件?

解析:Connection Command  DataReader  DataAdapter

   SqlCommand:ExecuteNonQuery() 增删改。(insert   update和delete)

   返回值类型:int

 

02.什么是ADO.NET

解析:ADO.NET是微软推出一种专门和数据库交互的技术,其实本质上是一种类库(一堆类的集合)。

03.为什么是ADO.NET

解析:在.NET领域,要想让App和DB进行交互,进行数据的交换,必须使用该技术

 

04.什么时候用ADO.NET

解析:当程序需要访问数据库的时候使用

05.如何使用ADO.NET

解析:如果你想和你的girl friends 通话,你会怎么办?

 

 

  IP地址:指定访问的数据库,身份验证(sa  6375196)

 

步骤一:引入命名空间

 

 

 

ADO.NET其实就是微软定义好的一组类库,我们要想使用四大对象,必须先

引入命名空间System.Data.SqlClient;一旦引入了命名空间,就可以使用四大对象。

步骤二:准备连接字符串

 

步骤三:准备连接对象,并传入连接字符串,打开连接

 

 

步骤四:准备发送的SQL语句

 

步骤五:准备命令对象,并且传入SQL语句和连接对象

 

步骤六:执行命令

 

 //01.引入命名空间

            //02SqlConnectio(连接对象)

            //连接字符串(IP+数据库名+登陆身份)

            //买菜

            string str = "Data source=192.168.15.33;initial catalog=MySchool;uid=sa;pwd=6375196";

            //洗菜和切菜和开火,油已经放入锅中

            SqlConnection con=new SqlConnection(str);

            //03.将菜倒入锅中(和数据库连接)

            con.Open();

            //04.SqlCommand(将应用程序的SQL语句传递给数据库)

            //SName, Sgender, Wishes, Salary

            string sql = "insert into work values('微冷的雨','男','希望今天咱们可以提前20 minutes GoHome',20)";

            SqlCommand cmd = new SqlCommand(sql, con);

            int count=cmd.ExecuteNonQuery();

            if (count>0)

            {

                Console.WriteLine("呵呵@添加数据成功!");

            }

            else

            {

                Console.WriteLine("脑子被驴踢了");

            }

            //Console.WriteLine("通道已经成功建立!!!!");

            Console.ReadKey();

 

 2015年11月10日提问内容及答案

  1.ADO.NET两大组件

   解析:DataSet(数据集)和.NET FrameWork数据提供程序

  2..NET FrameWork数据提供程序的四大对象

   解析:Connection  Command  DataReader  DataAdapter

  3.咱们学习针对SQL Server数据库提供的两个对象

   解析:SqlConnection和SqlCommand

  4.SqlCommand对象的两个方法

   解析:ExecuteNonQuery():执行增,删,改操作,不能执行select

        返回值:int  代表受影响行数

         ExecuteScalar():执行单行单列数据的查询

       返回值:object  返回首行首列的内容

  5.手写登陆模块

 

 

06.异常捕获

01.参与异常捕获的三个关键字

Try(可能出现异常的代码)

Catch(抓住异常,并且提示友好的异常信息)

Finally(回收稀缺的系统资源。例如:数据库代码,访问IO等)

第15章 使用ADO.NET查询和操作数据

01.SQL代码换行问题解决

解析:在c#中,如果一个字符串过长,想让其换行显示,这个时候可以通过如下方式解决

string sql=@"内容”;

02.con.Close()问题(高级内容)

当我们通过con.Close()关闭连接资源的时候,并不是马上(立即)释放连接对象,

而是告诉SQL Server服务器我已经是垃圾对象了,你可以回收了,也就是说,只是给

con打上一个可以回收的标记,至于什么时候回收,是等待SQL Server CPU空闲的时候

回收。

03.SQL Profiler监视工具有何用途?

专业人士解析:后续大家要学很大很大的公司出品的第三方框架,SQL语句不需要开发人员手动编写,那么如果框架生成的语句和预期的不一致, 通过该工具可以监控到框架生成的SQL语句到底是什么,进而可以调整框架配置,让语句正常。

04.使用DataReader的什么方法可以逐行读取数据?

解析:Read()    dr[“列名”]  数据类型是object 

重点内容:

 01.SqlDataReader只读(不能修改)只进(不能往回读)的读取器

 02.SqlDataReader对象要独占一个连接

05.StringBuilder用法

解析:以后大家在遇到需要大量拼接字符串的场景,可以使用StringBuilder,因为其效率要高于string,一般我们认为10个以内的字符串用string效率,大于10个的情况下,StringBuilder高。

06.构造函数补充

构造函数:如果在一个类中,一个方法的名字和类名相同,并且该方法没有返回值类型,连void都不能有。那么该方法就是该类的构造

第17章  QQ用户信息管理系统

QQ用户信息管理系统

功能一:实现用户登陆三次验证问题

如果三次登陆均失败,则退出系统

 

功能二:显示和控制系统菜单

可以将菜单封装成一个方法

 

功能三:显示QQ用户清单

 

功能四:更新用户在线天数

 

功能5:添加用户记录

 

功能6:更新所有用户等级

由于可以手动更改用户的在线天数,但是对应的levelid没有更改,该功能用来更改。

 

 

功能7:删除指定用户的记录

 

00.怎么将数据库中等级转换成☆

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

      

      

      

      

      

      

      

      

      

      

      

      

      

      

      

     

   

      

      

 

   

    

 

posted on 2016-01-22 23:12  放飞理想  阅读(5040)  评论(0编辑  收藏  举报

导航